wstring支持什么区域设置

what locale does wstring support?

本文关键字:设置 区域 什么 支持 wstring      更新时间:2023-10-16

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

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

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

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

在没有代码演示您的问题的情况下,我将给出相应的一般答案。

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

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

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

希望这有帮助!!

std::wstring根本没有任何区域设置/国际化支持。它只是一个存储wchar_t序列的容器。
wchar_t的问题是它的编码是未指定的。它可能是Unicode UTF-16,或Unicode UTF-32,或Shift-JIS,或完全不同的东西。在程序内部是无法分辨的。

如果您确保源代码的编码与程序将在其中运行的区域设置所使用的编码相同,那么您将有最好的机会使事情正常工作。
但是,使用第三方库(如DirectX)可能会带来额外的约束,因为这些库期望和支持的编码可能存在限制。

Bug解决了,原来是cast问题(不是前面说的呈现问题)。有bug的文本是使用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();

通过改变来解决问题。

所以,这是由于错误的强制转换造成的。因为有人对我的陈述进行了更正。