如何创建字符串文字 UTF-8 在 Visual C++ 2008
在 VC++ 2003 我可以将源文件保存为 UTF-8, 所有这些线条都像它一样使用。 换句话说,以下代码将显示在控制台上的行。 如果源文件已保存为 UTF-8, 这出口将是 UTF-8.
我以格式保存了文件 UTF-8 从 UTF-8 BOM. 但是,汇编S. VC2008 导致:
导致这些警告的符号损坏。 那些匹配的人 locale /在这种情况下 932 = 日本人/, 转变为编码 locale, IE Shift-JIS.
我找不到一种方法 VC++ 2008 为我编译它。 请注意,这无关紧要 locale 我在源文件中使用。 看起来不是 locale, 这说: "我知道我做了什么,所以不要改变我的字符串文字文字". 特别是无用的 UTF-8 伪区域设置不起作用。
就像我一样。 "C":
看起来 VC2008 强制指定的所有字符 /或默认情况下/ locale, 所以呢 locale 不可能是 UTF-8. 我不想更改文件以使用逃生行类型 " \xbf\x11...", 因为使用相同的源代码使用 gcc, 这可能会处理文件 UTF-8.
有没有办法指定源文件的编译应该留下字符串文字完整?
要以不同的方式设置,我可以使用什么编译标志来指示向后兼容性 VC2003 在编译源文件时,即不要更改字符串文字,请使用它们的字节字节。
更新
谢谢你的建议,但我想避免 wchar. 由于此应用程序专门处理行 UTF-8, 使用 wchar 将要求我转回所有行 UTF-8, 应该是不必要的。 所有入口,输出和内部处理都在 UTF-8. 这是一个简单的应用程序,它很棒 Linux, 和在编译时 VC2003. 我希望能够编译相同的应用程序 VC2008 并使它起作用。
要做到这一点,我需要 VC2008 没有试图将它转换为 locale 我的本地车 /日本人, 932/. 我想要 VC2008 回来兼容 VC2003. 我需要一个参数 locale 或编译器表示行的使用,基本上像透明数阵列 char 或者怎么样 UTF-8. 似乎我可以陷入困境 VC2003 和 gcc, 虽然 VC2008 在这种情况下试图太聪明。
printf/"Chinese /Traditional/"/;
printf/"中国語 /繁体/"/;
printf/"중국어 /번체/"/;
printf/"Chinês /Tradicional/"/;
我以格式保存了文件 UTF-8 从 UTF-8 BOM. 但是,汇编S. VC2008 导致:
warning C4566: character represented by universal-character-name '\uC911'
cannot be represented in the current code page /932/
warning C4566: character represented by universal-character-name '\uAD6D'
cannot be represented in the current code page /932/
etc.
导致这些警告的符号损坏。 那些匹配的人 locale /在这种情况下 932 = 日本人/, 转变为编码 locale, IE Shift-JIS.
我找不到一种方法 VC++ 2008 为我编译它。 请注意,这无关紧要 locale 我在源文件中使用。 看起来不是 locale, 这说: "我知道我做了什么,所以不要改变我的字符串文字文字". 特别是无用的 UTF-8 伪区域设置不起作用。
#pragma setlocale/".65001"/
=> error C2175: '.65001' : invalid locale
就像我一样。 "C":
#pragma setlocale/"C"/
=> see warnings above /in particular locale is still 932/
看起来 VC2008 强制指定的所有字符 /或默认情况下/ locale, 所以呢 locale 不可能是 UTF-8. 我不想更改文件以使用逃生行类型 " \xbf\x11...", 因为使用相同的源代码使用 gcc, 这可能会处理文件 UTF-8.
有没有办法指定源文件的编译应该留下字符串文字完整?
要以不同的方式设置,我可以使用什么编译标志来指示向后兼容性 VC2003 在编译源文件时,即不要更改字符串文字,请使用它们的字节字节。
更新
谢谢你的建议,但我想避免 wchar. 由于此应用程序专门处理行 UTF-8, 使用 wchar 将要求我转回所有行 UTF-8, 应该是不必要的。 所有入口,输出和内部处理都在 UTF-8. 这是一个简单的应用程序,它很棒 Linux, 和在编译时 VC2003. 我希望能够编译相同的应用程序 VC2008 并使它起作用。
要做到这一点,我需要 VC2008 没有试图将它转换为 locale 我的本地车 /日本人, 932/. 我想要 VC2008 回来兼容 VC2003. 我需要一个参数 locale 或编译器表示行的使用,基本上像透明数阵列 char 或者怎么样 UTF-8. 似乎我可以陷入困境 VC2003 和 gcc, 虽然 VC2008 在这种情况下试图太聪明。
没有找到相关结果
已邀请:
17 个回复
奔跑吧少年
赞同来自:
我决定没有保证方法。 我想象下面的决定为英文版。 VC2003, 但是在使用日语版本编译时失败 VC2003 /或者也许这是一个日本人 OS/. 无论如何,依靠他的工作是不可能的。 请注意,即使是像排的一切宣布 L"" 不工作 /和痛苦的B. gcc, 如下所述/.
相反,我相信您只需要咬紧子弹并将整个文本移动到数据文件并从那里下载。 现在我已经存储并获得了对文本的访问 INI 文件周围
http://code.jellycan.com/simpleini/
/跨平台INI文件库/. 至少有一种保证它的工作原理,因为所有文本都在程序之外。
原版的:
我自己回答这个问题,因为只有Evan似乎理解这个问题。 关于什么是 Unicode 以及如何使用 wchar_t, 与此问题无关,因为它不是关于国际化而不是误解符号编码 Unicode. 虽然我感谢您的帮助,但如果我不够清楚,我深表歉意。
问题是我有必须在各种平台和编译器下编译的源文件。 该程序执行处理 UTF-8. 他不关心任何其他编码。 我想拥有字符串的文字 UTF-8, 如何与之合作 gcc 和 vc2003. 我该怎么办 VC2008? /即兼容兼容解决方案/.
这就是我发现的:
gcc /v4.3.2 20081105/:
字符串文字用作它 /原始字符串/
支持编码中的源文件 UTF-8
源文件不应该有 UTF-8 BOM
vc2003:
字符串文字用作它 /原始字符串/
支持编码中的源文件 UTF-8
源文件可能有或不具有 UTF-8 BOM /没关系/
vc2005+:
字符串文字由编译器夸大 /没有原始行/
字符串文字 char 重新介绍指定的 locale
UTF-8 不支持目标 locale
源文件必须具有 UTF-8 BOM
因此,一个简单的答案是为了这个特定的目的 VC2005+ 损坏,不提供符合符合符合编译路径。 获得行的唯一方法 Unicode 在编译计划是通过 UTF-8 + BOM + wchar, 什么意思是我需要将所有行转换回来 UTF-8 在使用过程中。
没有简单的跨平台转换方法 wchar 在 UTF-8, 例如,尺寸和编码是什么 wchar? 在 Windows, UTF-16. 在其他平台上? 她正在变化。 熟悉
http://icu-project.org/docs/pa ... .html
ICU 有些细节。
最后,我决定避免除了所有编译器上的转换成本 vc2005+ 使用类似于以下内容的源代码。
请注意,此代码只是简化的示例。 生产使用应该通过各种方式清洁。 /线程安全,检查错误,检查缓冲区的大小等。/.
它用作以下代码。 它纯粹编译并在我的测试中正确工作 gcc, vc2003 和 vc2008:
二哥
赞同来自:
我有完全相同的问题,我刚刚偶然发现了一个不需要将原始行转换为宽字符和返回的解决方案:将源文件保存为 UTF-8
没有
签名,和 VC2008 留下他一个人。 当我意识到重置签名时完美的工作。 总结:
Unicode /UTF-8 没有签名/ - 代码 65001, 不会丢掉警告 c4566 在 VC2008 而不是强迫 VC 使用编码,而代码页 65001 /UTF-8 带签名/ 抛出 c4566 /你怎么找到的/.
我希望帮助您并不为时已晚,但它可以加快您的应用程序 VC2008, 删除你的解决方法。
三叔
赞同来自:
, 你可以做到。
我认为它会很好,只是不是很可读,所以如果你这样做,请评论它来解释。
奔跑吧少年
赞同来自:
保存 Options/Encoding: "Unicode /UTF-8 without signature / - Codepage 65001"
三叔
赞同来自:
CP1252 /例如,西欧代码页/:
→
→
→
→
UTF-8 没有 BOM:
→
/= UTF-8/
→ 警告:多用途常数
→
/= UTF-8, 正如预期的那样/
→
/错误的!/
→ 警告:多用途常数
→
/错误的!/
UTF-8 从 BOM:
→
/= CP1252, 不再 UTF-8/,
→
→ 错误:无法转换为 CP1252!
→
/正确/
→
→
/正确/
看,编译器 C 处理文件 UTF-8 没有 BOM 也 CP1252. 因此,编译器无法混合字符串。 UTF-8 和 UTF-16 在编译的输出中! 因此,您必须决定一个源代码文件:
或者
使用 UTF-8 从 BOM 并只生成一行 UTF-16 /即,始终使用前缀
/,
或者
UTF-8 没有 BOM 并只生成一行 UTF-8 /即,永远不要使用前缀
/.
7位字符 ASCII 没有参与,可以用作前缀
, 所以没有它
无论它所如何 EDITOR 可以自动检测文件 UTF-8 没有 BOM 像文件一样 UTF-8.
帅驴
赞同来自:
"使用 UTF-8 作为字符串的内部表示 C 和 C++ 从 Visual Studio"
=>
http://www.nubaria.com/en/blog/?p=289
这个需要 Visual Studio 2008 包更新 1 并低于修正:
http://support.microsoft.com/kb/980263
....
二哥
赞同来自:
由B改变。
当然,对于任何人来说,它是不可读的,目标只是为了避免编译器问题。
您可以使用预处理器 C++ 要在转换的头文件中引用行,或转换所有源代码 UTF-8 在 ASCII 在使用此技巧编译之前。
小明明
赞同来自:
从理论上返回路径 UTF-16 到 UTF-8 必须是相同的光,但我发现locali UTF-8 在我的系统中不要正常工作 /VC10 Express 在 Win7/.
所以我写了一个简单的转换器 RFC 3629.
我相信它应该在任何平台上工作,但除了我自己的系统外,我无法测试它,所以它可能是错误的。
</fstream></iostream></char></unsigned></unsigned></unsigned></unsigned></unsigned></unsigned></wchar_t></wchar_t></vector></string></locale>
君笑尘
赞同来自:
或者:
小姐请别说爱
赞同来自:
ć
只是一个字节。
对我的解决方案是为了保存 UTF-8 没有 BOM. 这就是我欺骗编译器的方式。 现在他认为它只是一个普通的来源,也没有翻译字符串。 在文件中 .obj
现在有两个字节。
请不要关注一些评论员。 我明白你想要什么 - 我也想要相同的: UTF-8 来源 UTF-8 生成的文件 UTF-8 输入文件, UTF-8 在没有翻译的通信线路上。
也许它会有所帮助......
诸葛浮云
赞同来自:
https://raymai97.github.io/myb ... .html
. 为了 Visual C++ 2005 而以上,如果源文件不包含 BOM /Bayt订购标志/, 和你的系统 locale 不是英文, VC 它将假设您的源文件不在Unicode中。
到您的源文件 UTF-8 你必须正确编制
保存他们 UTF-8 没有
编码 BOM, 和
系统 locale /unicode./ 必须是英语
.
https://i.stack.imgur.com/8W0wd.png
窦买办
赞同来自:
现在我有一个解决方案。
首先,您必须在单次契约代码页面下工作 Local, 如 English, 到 cl.exe 没有收到落入混乱的代码。
其次,在UTF8中保存源代码 - 没有编码 BOM, 请注意,没有bom,然后编译
cl.exe, DO 不打电话给任何 C API, 例如, printf wprint, 所有这些员工都不起作用,我不知道为什么:/.... 也许以后我会学习......
然后只是编译并运行,你会看到结果.....
我的电子邮件是loyangan, /Google/ 希望某些人 ......
一个东西 WScript:
执行脚本 run.bat
来源 main.c:
</windows.h></string.h></stdio.h>
知食
赞同来自:
窦买办
赞同来自:
没有 BOM
: 处理为未加工,除非您的系统使用代码页 >1byte/char /例如, Shift JIS/. 您需要将系统代码页更改为任何一个字节,然后您可以在文字中使用Unicode字符并没有问题编译。 /至少我希望/.
从 BOM
: 他们是不是 char 在编译期间,字符串文字将转换为系统代码页。 您可以使用使用的检查当前系统代码 GetACP//. AFAIK, 无法安装系统代码页面 65001 /UTF-8/, 因此,因此,没有办法使用 UTF-8 直接S. BOM.
唯一的便携式和独立编译方法是使用编码 ASCII 和逃生序列,因为没有保证任何编译器将接受编码文件 UTF-8.
帅驴
赞同来自:
[1], 或者不是偶数 BOM, 没有pragma. [2]. 使用一个没有不同的导致错误的转换。
我详细记录在
https://github.com/jay/compiler_string_test
[1]: Visual Studio 2012 不支持 execution_character_set. Visual Studio 2010 和 2015 它可以很好地工作,并且如您所知,含有补丁 2008 一年它适用。
[2]: 本主题的一些评论指出,既不使用 BOM, Pragma都没有导致使用Multibyte的本地代码页面对开发人员的转换不正确 /例如,日本/.
快网
赞同来自:
http://www.joelonsoftware.com/ ... .html
在
http://www.joelonsoftware.com
...
风见雨下
赞同来自: