wstring支持哪种语言环境?

时间:2013-01-22 13:48:59

标签: c++ text character-encoding

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

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

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

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

4 个答案:

答案 0 :(得分:1)

如果没有显示您问题的代码,我会给您相应的一般性答案。

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

答案 1 :(得分:0)

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

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

答案 2 :(得分: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();

通过改变来解决问题。

所以,这是由糟糕的演员造成的。有些人对我的陈述进行了修改。

答案 3 :(得分:0)

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

如果您确保源代码的编码与运行程序的语言环境所使用的编码相同,那么您将获得最佳工作机会。
但是,使用第三方库(如DirectX)可能会产生额外的限制,因为这些库可能会限制这些库的编码期望和支持。

相关问题