【问题标题】:How does visual studio resolve unicode string from different encoding source file ?Visual Studio 如何解析来自不同编码源文件的 unicode 字符串?
【发布时间】:2016-09-19 01:35:51
【问题描述】:

我知道如果我在 vs 中使用 unicode 字符集,我可以使用 L"There is a string" 来呈现一个 unicode 字符串。我认为There is a string会在vs进行词法解析时从srouce文件中读取,它将There is a string从源文件的编码解码为unicode。

我已将源文件更改为一些不同的编码,但我总是从L marco 获得正确的 unicode 数据。剂量与检测源文件的编码以隐藏 There is a string 以纠正 unicode ?如果没有,vs 是如何做到这一点的?

我不确定这个问题是否可以在 SO 中提出,如果不能,我应该在哪里问?提前致谢。

【问题讨论】:

  • 您尝试了哪些“不同的编码”? AFAIK,没有字节顺序标记字符的文件默认为“ANSI”(本地化编码......美国 Windows 是 cp1252,但它因区域设置而异),否则,BOM 字符作为文件中的第一个代码点标识其中一个UTF 编码。
  • @MarkTolonen 我试过 GB2312,UTF-8。那么 vs 会检测文件编码为隐蔽的 unicode 吗?是否有一些文件编码与不支持进行此转换?
  • 您使用的是哪个本地化版本的操作系统?对于中文,GB2312 可能是 ANSI 编码。我预计其他本地化会失败或至少会损坏字符,因为 Windows 不会向文件添加任何编码指示,并且会采用当前的 ANSI 编码。然而,UTF 编码文件是由 VS 编写的,以 BOM 字符开头,该字符在不同的 UTF 编码中具有特定的签名。
  • @MarkTolonen 是的,我正在使用 GB2312。所以如果我删除BOM,它会无法转换吗? GB2312 是 ANSI,所以我对 vs 如何检测编码感到困惑。
  • 没有 BOM,VS 采用 ANSI 编码。所以另存为 UTF8,去掉前 3 个字节(EF BB BF),文件将在美国 Windows 上被解释为 CP1252,但在中文 Windows 上被解释为 GB2312。 VS 不会检测到编码。如果没有 BOM,它只会假设一个。

标签: visual-studio unicode compilation


【解决方案1】:

VS 不会检测源文件开头没有 BOM1 签名的编码。如果没有 BOM,它将只假定本地化的 ANSI 编码。

BOM 签名标识使用的 UTF8/16/32 编码。所以如果你保存为 UTF-8(VS 会添加一个 BOM)并去掉前 3 个字节(EF BB BF),那么文件在 US Windows 上会被解释为 CP1252,但在中文 Windows 上会被解释为 GB2312 等等。

您使用的是中文 Windows,因此请另存为 GB2312(不带 BOM)或 UTF8(带 BOM),以便 VS 正确解码您的源代码。

1https://en.wikipedia.org/wiki/Byte_order_mark

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-27
    • 1970-01-01
    • 2015-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-01
    相关资源
    最近更新 更多