std::wstring中ASCII符号的字节表示,具有不同的语言环境

byte representation of ASCII symbols in std::wstring with different locales

本文关键字:环境 语言 字节 wstring ASCII 符号 std 表示      更新时间:2023-10-16

Windows C++应用程序。我们有一个仅包含ASCII符号的字符串:std::wstring(L"abcdeABCDE ... any other ASCII symbol")。请注意,这是使用wchar_tstd::wstring

问题-这个字符串的字节表示取决于本地化设置,还是其他什么?我可以假设,如果我在应用程序运行时收到这样的字符串(例如,来自WindowsAPI),它的字节数将与我电脑上的字节数相同吗?

通常,对于字符(不是转义序列),wchar_twstring必须使用与ASCII相同的代码(仅扩展到2个字节)。但我不确定小于32的代码和大于128的代码在输出时可能有不同的含义(如ASCII),因此为了避免输出问题,请明确设置特定的区域设置,例如:

locale("en_US.UTF-8")

用于标准输出

wcout.imbue(locale("en_US.UTF-8")); 

更新:

我发现了关于添加的另一个建议

std::ios_base::sync_with_stdio(false);

在使用imbue设置本地化之前

请参阅"如何使用std::imbue设置std::wcout的区域设置?"?

文本字符串的字节表示不依赖于环境。它被硬编码为编辑器中的二进制数据。然而,二进制数据的解释方式取决于当前代码页,因此当在运行时转换为宽字符串时,可能会得到不同的结果(而不是使用前导L定义字符串,这意味着宽字符将在编译时设置。)

为了安全起见,请使用setlocale()来保证用于转换的编码。那你就不用担心环境了。

这可能会有所帮助:"根据定义,ASCII字符集是所有多字节字符集的子集。在许多多字节字符集中,0x00–0x7F范围内的每个字符都与ASCII字符集中具有相同值的字符相同。例如,在ASCII和MBCS字符串中,1字节的NULL字符('\0')具有值0x00并且指示终止的空字符。">

发件人:Visual Studio字符集';未设置';vs';多字节字符集';