是否可以让GCC编译带有BOM的UTF-8源文件?
我在 Windows 上使用 Microsoft Visual Studio 并在 Ubuntu Linux 上使用 GCC 开发 C++ 跨平台。
在 Visual Studio 中,我可以在代码中使用“π”和“²”等 Unicode 符号。 Visual Studio 始终将源文件保存为带有 BOM(字节顺序标记)的 UTF-8。
例如:
// A = π.r²
double π = 3.14;
只有当我先删除 BOM 时,GCC 才会愉快地编译这些文件。如果我不删除 BOM,则会收到如下错误:
wwga_hydutils.cpp:28:9: 错误:程序中存在杂散“\317”
wwga_hydutils.cpp:28:9: 错误:程序中存在杂散“\200”
这让我想到了一个问题:
有没有办法让GCC 编译UTF-8 文件无需先删除 BOM?
我正在使用:
- Windows 7
- Visual Studio 2010
和:
正如第一个评论者指出的那样,我的问题是不是 BOM,但在字符串常量之外包含非 ASCII 字符。 GCC 不喜欢符号名称中的非 ASCII 字符,但事实证明 GCC 与带有 BOM 的 UTF-8 完全兼容。
I develop C++ cross platform using Microsoft Visual Studio on Windows and GCC on Ubuntu Linux.
In Visual Studio, I can use Unicode symbols like "π" and "²" in my code. Visual Studio always saves the source files as UTF-8 with BOM (Byte Order Mark).
For example:
// A = π.r²
double π = 3.14;
GCC happily compiles these files only if I remove the BOM first. If I do not remove the BOM, I get errors like these:
wwga_hydutils.cpp:28:9: error: stray ‘\317’ in program
wwga_hydutils.cpp:28:9: error: stray ‘\200’ in program
Which brings me to the question:
Is there a way to get GCC to compile UTF-8 files without first removing the BOM?
I'm using:
- Windows 7
- Visual Studio 2010
and:
- Ubuntu 11.10 (Oneiric Ocelot)
- GCC 4.6.1, 2011-06-27 (as provided by apt-get install gcc)
As the first commenter pointed out, my problem was not the BOM, but having non-ASCII characters outside of string constants. GCC does not like non-ASCII characters in symbol names, but it turns out GCC is fully compatible with UTF-8 with BOM.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
根据 GCC Wiki,尚不支持此功能。您可以使用
-fextended-identifiers
并预处理代码以将标识符转换为 UCN。从链接页面:另请参阅 g++ unicode 变量名称 和 Unicode 标识符和源代码C++11?
According to the GCC Wiki, this isn't supported yet. You can use
-fextended-identifiers
and pre-process your code to convert the identifiers to UCN. From the linked page:See also g++ unicode variable name and Unicode Identifiers and Source Code in C++11?
虽然 GCC 支持 Unicode 标识符,但不支持 UTF-8 输入。因此,Unicode 标识符必须使用 \uXXXX 和 \UXXXXXXXX 转义码进行编码。然而,只要安装了支持 C99 转换的最新版本 iconv,C++ 预处理器的一个简单的一行补丁就允许 GCC 和 g++ 处理 UTF-8 输入。详细信息请参见 GCC 中的 UTF-8 标识符< /em>。
然而,补丁非常简单,可以在此处给出:
输出:
即使使用补丁,也有两个命令行选项(-finput-charset 和 -fextended-identifiers)需要启用 UTF -8输入。特别是,尝试类似的东西
While Unicode identifiers are supported in GCC, UTF-8 input is not. Therefore, Unicode identifiers have to be encoded using \uXXXX and \UXXXXXXXX escape codes. However, a simple one-line patch to the C++ preprocessor allows GCC and g++ to process UTF-8 input provided a recent version of iconv that support C99 conversions is also installed. Details are present at UTF-8 Identifiers in GCC.
However, the patch is so simple it can be given right here:
Output:
Even with the patch, two command line options (-finput-charset and -fextended-identifiers) are needed to enable UTF-8 input. In particular, try something like