1

在我的程序中,我曾经wstring打印出我需要的文本,但它给了我随机密码(由于不同的编码方案)。例如,我有这段代码。

wstring text;
text.append(L"Some text");

然后我使用 directX 在屏幕上渲染它。我曾经使用wchar_t过,但听说它有便携性问题,所以我切换到swtring. wchar_t工作得很好,但它似乎只用了我能说的英文字符(打印出来完全忽略输入的非英文字符),这很好,直到我切换到wstring: 我只得到看起来像中文和韩文混合在一起的随机密码。有趣的是,我的非 unicode 文本的计算机区域设置是中文。根据我所看到的,我怀疑它会正确呈现汉字,所以我尝试了一下,它确实正确显示了字符,但前面有一个正方形(这仍然是一种不正确的显示)。然后我猜测编码可能取决于语言区域所以我将区域设置切换为英语(美国)(我使用 win8),然后我重新启动并看到源文件中的中文测试字符变成了一些随机的东西(我的文件没有保存以 unicode 格式,因为所有文本都是英文)然后我尝试使用英文字符,但没有运气,显示似乎完全相同,与语言环境无关。但我不明白为什么它不

是否应该进行一些转换,或者我应该以不同的编码格式保存我的文件?问题是我想正确显示英文字符,这是默认值。

4

4 回答 4

1

在没有代码证明你的问题的情况下,我会给你一个相应的一般性答案。

您正在尝试显示英文字符,但看到的是中文字符。当您将 8 位 ANSI 文本传递给接收 UTF-16 文本的 API 时,就会发生这种情况。在你的程序中寻找你从char*到的地方wchar_t*

于 2013-01-22T14:09:09.960 回答
0

std::wstring根本没有任何语言环境/国际化支持。它只是一个用于存储wchar_t.
问题wchar_t在于它的编码是未指定的。它可能是 Unicode UTF-16,或 Unicode UTF-32,或 Shift-JIS,或完全不同的东西。没有办法从程序中分辨出来。

如果您确保源代码的编码与程序将在其下运行的语言环境使用的编码相同,那么您将有最好的机会让事情正常工作。
但是,由于这些库期望和支持的编码可能存在限制,使用第三方库(如 DirectX)可能会带来额外的限制。

于 2013-01-22T14:46:22.077 回答
0

首先,您要在其中存储文本的文件类型是什么?默认情况下,普通 txt 文件存储在 ANSI 中(excel 也是如此)。因此,当您尝试将 Unicode 字符打印到 ANSI 文件时,它将打印垃圾。克服这个问题的两种方法是:

  1. 尝试以 UTF-8 或 16 模式打开文件,然后写入
  2. 在写入文件之前将 Unicode 转换为 ANSI。如果您使用的是 Windows,那么 MSDN 提供了特定的 API 来执行 Unicode 到 ANSI 的转换,反之亦然。如果您使用的是 Linux,则使用 Google 将 Unicode 转换为 ANSI。那里有很多解决方案。

希望这可以帮助!!!

于 2013-01-22T14:13:10.777 回答
0

Bug 解决了,原来是 CASTING 问题(不是之前说的渲染问题)。错误文本是使用(我忘了提及)的一些内部转换过程中的中间产物swtringstream,代码如下

wstringstream wss;
wstring text;
textToGenerate.append(L"some text");
wss << timer->getTime()
text.append(wss.str());

在这个过程之后,调试器将文本显示为一堆随机的东西,但后来它以某种方式转换回来,所以它是可读的。但是问题出现在使用 DirectX 的渲染阶段。我以某种方式留下了 的铸件wchar_t*,这导致了不正确的渲染。

老的:

LPCWSTR lpcwstrText = (LPCWSTR)textToDraw->getText(); 

新的:

LPCWSTR lpcwstrText = (*textToDraw->getText()).c_str();

通过改变它可以解决问题。

所以,这是一个糟糕的演员阵容造成的。由于一些善良的人对我的陈述进行了更正。

于 2013-01-22T14:43:12.490 回答