【发布时间】:2013-10-29 13:52:52
【问题描述】:
我的 win32 代码中有一些 UNICODE 文本。 我已经宣布它是这样的..
std::wstring a = Träna; //swedish for practice
我使用类似...的方式将该值复制到变量中
std::wstring b = a;
在调试时,我看不到我应该在b 中得到什么。
我应该在b 中得到Träna,但我得到的是Träna
这仅在 Windows 上观察到,该程序在 OS X 上运行良好。
我确定这是菜鸟的错误,我在这里错过了什么?
【问题讨论】:
-
该程序可能在 Windows 上也可以正常工作,但您对结果的可视化已损坏。 (如果你通过红色镜头看一张白纸,它会看起来是红色的。这是否意味着这张纸很脏?)你需要摆弄你的调试器设置或其他东西。直接查看字节是确定的唯一方法。
-
我猜你的源文件应该用字节顺序标记(“UTF8 with BOM”编码)保存。某些版本的 MSVC 存在一个错误,即编译器无法检测源文件编码,除非 BOM 存在并假定文件使用系统上设置的任何 8 位编码。
-
@R.MartinhoFernandes:不,他也可能遇到我所描述的错误。 Gcc 和 MSVC 以不同方式处理字符串中的编码。
-
如果您将“ä”视为“ä”,您将看到在 windows-1251 中被误解的 UTF-8 编码字符(MS 误称:“ANSI”)或一些类似的编码。所以这意味着你的调试器使用了错误的字符编码。
-
两个问题,首先是不使用 L 前缀作为字符串文字。您的文本编辑器编写以 utf-8 编码但可能没有 BOM 的源代码,因此编译器不知道如何正确读取文件,这进一步加剧了这种情况。文本编码在 C/C++ 中永远不会停止伤害。如果没有有效的源代码并提及您使用的编译器版本和/或 IDE,您将无法获得好的答案。
标签: visual-studio winapi unicode wstring