【问题标题】:Compiling UTF-8 encoded source with Unicode line separators使用 Unicode 行分隔符编译 UTF-8 编码源
【发布时间】:2009-02-15 21:48:45
【问题描述】:

使用最新版本的 Microsoft 编译器(包含在 Win7 SDK 中),我正在尝试编译使用 UTF-8 和 unicode 行分隔符编码的源文件。

不幸的是,代码无法编译——即使我在文件开头包含了 UTF-8 签名。例如,如果我尝试编译这个:

#include <stdio.h>

int main (void)
{
    printf("Hello!");
    return 0;
}

我会看到以下错误:


提示> cl test.c

Microsoft (R) 32 位 C/C++ 优化编译器版本 15.00.30729.01 用于 80x86 版权所有 (C) 微软公司。保留所有权利。

test.c test.c(1) : 警告 C4067: 预处理器指令后出现意外标记 - 预计换行 Microsoft (R) 增量链接器版本 9.00.30729.01 版权所有 (C) 微软公司。保留所有权利。

/out:test.exe 测试.obj LINK : 致命错误 LNK1561: 必须定义入口点


以前有人遇到过这个问题吗?有什么解决办法吗?

谢谢! 安德鲁

【问题讨论】:

    标签: c visual-studio compiler-construction utf-8 visual-c++


    【解决方案1】:

    当您说“unicode 行分隔符”时,您是指 UTF-16/UCS-2(即 16 位字符)吗?如果是这种情况(文件是不同编码的混合),我会说唯一合理的解决方法是修复文件。

    如果您的意思是行尾是其他一些 Unicode 代码点(仍以 UTF-8 编码),那么您仍然需要修复文件。该标准对翻译的第一阶段是这样说的:

    物理源文件字符被映射,在实现定义 方式,到基本来源 字符集(引入换行符 行尾字符 指标)(如有必要)。

    显然 MS 不会对“unicode 行分隔符”执行此转换,因此您需要这样做。

    【讨论】:

    • 使用 Visual Studio 的“高级保存选项”对话框,我使用 Unicode 行分隔符指定 UTF-8 编码。行分隔符被编码为 UTF-8,因为它应该是。我使用十六进制编辑器验证新行值是'0xE2 0x80 0xA8',确实是utf8。
    • 但是 VS 不是在寻找 0xE2 0x80 0xA8。它想要0x0d 0x0a。不管你是否在道德上是正确的,它想要那个 0x0a,无论如何它仍然是完全有效的 utf8。
    • 有趣。这是我从未使用过的选项。不幸的是,看起来 MSVC 不支持该格式的源文件,即使编辑器支持(我想您可能希望您的程序能够处理此类数据文件)。只是好奇 - 你知道另一个编译器(GCC?)是否可以?
    • 如果您强烈认为应该支持这种类型的源编码,您可以在connect.microsoft.com/VisualStudio 上发布错误报告/更改请求。
    • 是的,我认为你是对的洛根。我只是希望可能有一些模糊的编译器选项允许它支持这种编码,特别是因为编辑器支持它就好了。感谢大家的帮助。
    【解决方案2】:

    向 Microsoft 提交了 ID 为 414985 的错误报告。嗯。我们会看看它会变成什么样子。

    【讨论】:

      【解决方案3】:

      您指的是this character,而不是传统的 CR LF 字符。

      我猜编译器只期望 CR 和 LF 的某种组合。

      【讨论】:

      • 是的,这就是我所指的角色。我真的希望 MS 编译器会支持这一点。这很奇怪,因为 Visual Studio 提供了使用这种编码保存文件的选项,但无法编译它。
      • 不要忘记编辑器独立于编译器,它的目的是对源文件以外的文件有用。不过,我可以理解为什么人们可能希望或期望编译器支持这些行尾。这不是一个不合理的期望 - 但我并不感到惊讶。
      • 不同的行尾不是“不同的编码”。它实际上是一个不同的字符
      【解决方案4】:

      对我来说似乎很明显,#include 之后需要有一个换行符。

      换行符仍然是 unicode,所以添加一个应该没什么大不了的。

      【讨论】:

      • 好吧,windows 将新行编码为 CRLF,而 Unix 将它们编码为 LF。 Unicode 定义试图通过定义“Unicode 新行”来修复这些冲突的新行实现。可以在这里阅读:en.wikipedia.org/wiki/Unicode#New_lines
      猜你喜欢
      • 1970-01-01
      • 2018-01-14
      • 1970-01-01
      • 2014-02-18
      • 2010-12-16
      • 1970-01-01
      • 2013-09-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多