是否有可能让GCC用BOM源文件编译UTF-8?

时间:2011-10-26 07:25:48

标签: gcc utf-8 g++ byte-order-mark

我使用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在没有先移除BOM的情况下编译UTF-8文件?


我正在使用:

  • Windows 7
  • Visual Studio 2010

  • uBuntu Oneiric 11.10
  • GCC 4.6.1(由 apt-get install gcc 提供)

修改

正如第一位评论者指出的那样,我的问题是 BOM,但是在字符串常量之外有非ascii字符。 GCC不喜欢符号名称中的非ascii字符,但事实证明GCC与带有BOM的UTF-8完全兼容。

2 个答案:

答案 0 :(得分:3)

虽然gcc支持unicode标识符,但UTF-8输入不支持。因此,必须使用\ uXXXX和\ UXXXXXXXX转义码对unicode标识符进行编码。但是,cpp预处理器的简单单行补丁允许gcc和g ++处理UTF-8输入,前提是还安装了支持C99转换的最新版iconv。详情见

https://www.raspberrypi.org/forums/viewtopic.php?p=802657

然而,补丁非常简单,可以在这里给出。

diff -cNr gcc-5.2.0/libcpp/charset.c gcc-5.2.0-ejo/libcpp/charset.c
*** gcc-5.2.0/libcpp/charset.c  Mon Jan  5 04:33:28 2015
--- gcc-5.2.0-ejo/libcpp/charset.c  Wed Aug 12 14:34:23 2015
***************
*** 1711,1717 ****
    struct _cpp_strbuf to;
    unsigned char *buffer;

!   input_cset = init_iconv_desc (pfile, SOURCE_CHARSET, input_charset);
    if (input_cset.func == convert_no_conversion)
      {
        to.text = input;
--- 1711,1717 ----
    struct _cpp_strbuf to;
    unsigned char *buffer;

!   input_cset = init_iconv_desc (pfile, "C99", input_charset);
    if (input_cset.func == convert_no_conversion)
      {
        to.text = input;

即使使用补丁,也需要两个命令行选项来启用UTF-8输入。特别是尝试像

这样的东西
$ /usr/local/gcc-5.2/bin/gcc \
    -finput-charset=UTF-8 -fextended-identifiers \
    -o circle circle.c

答案 1 :(得分:2)

根据GCC Wiki,目前尚不支持此功能。您可以使用-fextended-identifiers并预处理代码以将标识符转换为UCN。从链接页面:

perl -pe 'BEGIN { binmode STDIN, ":utf8"; } s/(.)/ord($1) < 128 ? $1 : sprintf("\\U%08x", ord($1))/ge;' 

另请参阅g++ unicode variable nameUnicode Identifiers and Source Code in C++11?