Dip*_*ong 5 c++ unicode encoding utf-8 visual-c++
我正在开发一个较旧的项目(使用定义的 UNICODE 进行编译),并在 .rc 中遇到了一个问题。例如,静态文本元素包含在 DIALOGEX 资源中定义的 \xe2\x80\x9c\xc2\xa9\xe2\x80\x9d
\nLTEXT "Copyright \xc2\xa9\xe2\x80\x9d,IDC_COPYRIGHT_STATIC,7,154,110,8\n
Run Code Online (Sandbox Code Playgroud)\n该资源文件可能是多年前由 MSVC 应用程序向导创建的,并随着每个版本的发布而向前迁移,现在如下所示:
\n#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\nLANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US\n#pragma code_page(1252) //present for over 10 years \n#endif\n
Run Code Online (Sandbox Code Playgroud)\n多年来 \xc2\xa9 显示正确,但最近显示为 \xe2\x80\x9c\xc3\x85\xc2\xa9\xe2\x80\x9d 甚至 \xe2\x80\x9c\xc2\xbd\xc2\xbf \xe2\x80\x9d。显然,这是一个编码问题,但我需要在进行更改之前了解如何以及为何进行更改。因此,经过研究,.rc 中的这三个属性在错误和编码中发挥了作用:
\n作为实证测试,更改 .rc 中的这些内容并查看对话中的结果文本
\n#pragma code_page(\xe2\x80\xa6) | 使用编码保存 | 签名(BOM) | Dlg 中的文本 |
---|---|---|---|
代码页(1252) | 原始文件 | 不适用 | \xc3\x85\xc2\xa9 |
代码页(1252) | 视窗1252 | 不适用 | \xc2\xa9 |
代码页(1252) | UTF-8 65001 | 物料清单 | \xc3\x85\xc2\xa9 |
代码页(1252) | UTF-8 65001 | 无物料清单 | \xc3\x85\xc2\xa9 |
代码页(65001) | 视窗1252 | 不适用 | \xc2\xa9 |
代码页(65001) | UTF-8 65001 | 物料清单 | \xc2\xa9 |
代码页(65001) | UTF-8 65001 | 无物料清单 | \xc2\xa9 |
.rc 中没有 code_page | UTF-8 65001 | 物料清单 | \xc2\xa9 |
.rc 中没有 code_page | UTF-8 65001 | 无物料清单 | \xc3\x85\xc2\xa9 |
我可以显式保存编码为 Windows (1252) 的所有 .rc 文件或编码为带签名的 UNICODE UTF-8(并删除 #pragma code_pages)。特定的错误将会消失,但这是最好的解决方案吗?
\n看来从 Windows 1252 切换到 UNICODE UTF-8 是向前迈出的一步,也是长期发展的正确方法。这有什么问题吗?或者更好的解决方案?
\nRaymond Chen 在一篇博客文章中解释了资源编译器中的编码问题,指出当使用 UTF-8 作为 rc 文件的编码时,不应使用 BOM/签名并包含#pragma code_page(65001)
.
根据开发者社区问题, v10.0.19505.1001 版本之前的资源编译器存在问题。此修复版本随 Windows SDK 10.0.20348.0 一起提供
归档时间: |
|
查看次数: |
1110 次 |
最近记录: |