【发布时间】:2021-03-15 17:16:41
【问题描述】:
在进行一些编码测试时,我保存了一个编码为“UTF-16 LE”的 c 文件(使用 sublimeText)。
c 文件包含以下内容:
#include <stdio.h>
void main() {
char* letter = "é";
printf("%s\n", letter);
}
用 gcc 编译这个文件返回错误:
test.c:1:3: error: invalid preprocessing directive #i; did you mean #if?
1 | # i n c l u d e < s t d i o . h >
就好像gcc在读取c文件时在每个字符前插入了一个空格。
我的问题是:我们可以提交以“utf-8”以外的其他格式编码的 c 文件吗?为什么 gcc 无法检测到我的文件的编码并正确读取它?
【问题讨论】:
-
"就好像 gcc 在读取 c 文件时在每个字符前插入了一个空格" - 您创建了一个以 UTF-16 编码的源文件,它使用 2 字节字符单位。 gcc 假设 1 字节字符读取它。由于字符在 ASCII 范围内,“空格”是 0x00 的高字节。不要将 UTF-16 用于源文件(至少前面没有 BOM),大多数编译器无法处理它。 “为什么 gcc 无法检测到我的文件的编码并正确读取它?” - 没有 BOM,您是否意识到这有多么困难,因为世界?
-
@RemyLebeau 文件是utf-16 Little Endian,里面有对应的BOM
-
即使使用 BOM,也不能保证编译器将支持 Unicode 编码的源文件。检查编译器的文档。在这种情况下,请参阅 g++ compiling sources in UTF-16 encoding 和 How should I use g++'s -finput-charset compiler option correctly in order to compile a non-UTF-8 source file?
标签: gcc utf-8 character-encoding utf-16