16

我想创建一些处理编码的示例程序,特别是我想使用宽字符串,例如:

wstring a=L"grüßen";
wstring b=L"שלום עולם!";
wstring c=L"中文";

因为这些是示例程序。

对于将源代码视为 UTF-8 编码文本的 gcc,这绝对是微不足道的。但是,直接编译在 MSVC 下不起作用。我知道我可以使用转义序列对它们进行编码,但我更愿意将它们保留为可读文本。

是否有任何选项可以指定为“cl”的命令行开关以使其工作?有没有像 gcc'c 这样的命令行开关-finput-charset

如果不是,您如何建议使文本对用户自然?

注意:将 BOM 添加到 UTF-8 文件不是一个选项,因为它变得无法被其他编译器编译。

注2:我需要它在 MSVC 版本 >= 9 == VS 2008 中工作

真正的答案:没有解决方案

4

5 回答 5

14

对于那些信奉“迟到总比不做”座右铭的人,Visual Studio 2015(编译器的第 19 版)现在支持这一点。

新的/source-charset命令行开关允许您指定用于解释源文件的字符集编码。它采用单个参数,可以是IANA或 ISO 字符集名称:

/source-charset:utf-8

或特定代码页的十进制标识符(以点开头):

/source-charset:.65001

官方文档在这里,在 Visual C++ 团队博客上也有描述这些新选项的详细文章。

还有一个互补/execution-charset开关,其工作方式完全相同,但控制在可执行文件中生成窄字符和字符串文字的程度。最后,还有一个快捷开关 ,/utf-8它同时设置/source-charset:utf-8/execution-charset:utf-8

这些命令行选项与旧的和指令不兼容,它们全局应用于所有源文件。#pragma setlocale#pragma execution-character-set

对于坚持使用旧版本编译器的用户,最好的选择仍然是将源文件保存为带有 BOM 的 UTF-8(正如其他答案所建议的那样,IDE 可以在保存时执行此操作)。编译器将自动检测到这一点并采取适当的行动。GCC 也是如此,它还在源文件的开头接受 BOM,而不会窒息而死,从而使这种方法在功能上具有可移植性。

于 2016-06-10T09:14:30.280 回答
8

在编码组合中打开File->Advances Save Options... 选择。Unicode(UTF-8 with signature) - Codepage 65001编译器将自动使用选定的编码。


根据微软在这里的回答:

如果您想要非 ASCII 字符,那么获取它们的“官方”和可移植方式是使用 \u(或 \U)十六进制编码(我同意,这只是简单的丑陋且容易出错)。

编译器在面对没有 BOM 的源文件时,编译器会提前读取文件一定距离以查看是否可以检测到任何 Unicode 字符 - 它专门寻找 UTF-16 和 UTF-16BE - 如果没有找不到任何一个,然后它假定它有 MBCS。我怀疑在这种情况下,它会退回到 MBCS,这就是导致问题的原因。

明确是最好的,所以虽然我知道这不是一个完美的解决方案,但我建议使用 BOM

Jonathan Caves
Visual C++ 编译器团队。


好的解决方案是将文本字符串放在资源文件中。这是方便和便携的方式。您可以使用本地化库,例如gettext来管理翻译。

于 2009-11-02T12:03:53.597 回答
2

我们使用的流程:将文件保存为 UTF8-with BOM,在 linux 和 windows 之间共享相同的源,对于 linux:在编译命令上预处理源文件以删除 BOM,在中间非 BOM 文件上运行 g++。

于 2012-06-12T10:12:01.310 回答
1

对于 VS,您可以使用:

#pragma setlocale( "[locale-string]" )

语言环境的默认 ANSI 代码页将用作文件编码。

但一般来说,在代码中硬编码任何用户可见的字符串是一个坏主意。将它们存储在某种资源中。适合本地化、简单的拼写检查和更新等。

于 2009-11-11T08:19:43.097 回答
1

恕我直言,所有 C++ 源文件都应该是严格的 ASCII。如果编辑器支持,注释可以使用 UTF-8。
这使得代码可以跨平台、编辑器和源代码控制系统移植。

您可以使用\u将 Unicode 字符插入宽字符串:

std::wstring str = L"\u20AC123,00"; //€123,00
于 2009-11-12T14:34:11.540 回答