Art*_*yom 15 c++ unicode visual-c++
我想创建一些处理编码的示例程序,特别是我想使用宽字符串,如:
wstring a=L"grüßen";
wstring b=L"???? ????!";
wstring c=L"??";
Run Code Online (Sandbox Code Playgroud)
因为这些是示例程序.
对于将源代码视为UTF-8编码文本的gcc,这绝对是微不足道的.但是,简单的编译在MSVC下不起作用.我知道我可以使用转义序列对它们进行编码,但我更愿意将它们保存为可读文本.
是否有任何选项可以指定为"cl"的命令行开关以使其工作?那里有任何命令行开关,如gcc'c-finput-charset
谢谢,
如果不是,你会如何建议让文字对用户自然?
注意:将BOM添加到UTF-8文件不是一种选择,因为它变得不可由其他编译器编译.
注意2:我需要它在MSVC版本> = 9 == VS 2008中工作
真正的答案:没有解决方案
Cod*_*ray 12
对于那些赞同"迟到而不是迟到"的座右铭的人来说,Visual Studio 2015(编译器的第19版)现在支持这一点.
新的/source-charset命令行开关允许您指定用于解释源文件的字符集编码.它需要一个参数,可以是IANA或ISO字符集名称:
/source-charset:utf-8
Run Code Online (Sandbox Code Playgroud)
或特定代码页的小数标识符(以点开头):
/source-charset:.65001
Run Code Online (Sandbox Code Playgroud)
官方文档在这里,还有一篇详细的文章描述了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而不会窒息死亡,这使得这种方法在功能上可移植.
在编码组合中打开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)来管理翻译.
| 归档时间: |
|
| 查看次数: |
6419 次 |
| 最近记录: |