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

时间:2016-06-01 21:36:05

标签: c++ windows locale wstring

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

问题 - 此字符串的字节表示取决于本地化设置还是其他什么?我可以假设,如果我在app运行时收到这样的字符串(例如,从WindowsAPI),它的字节将与我的PC上的相同吗?

2 个答案:

答案 0 :(得分:1)

通常,对于字符(不是转义序列),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

设置本地化之前

查看有关How can I use std::imbue to set the locale for std::wcout?

的详细信息

答案 1 :(得分:1)

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

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

这可能会有所帮助:&#34;根据定义,ASCII字符集是所有多字节字符集的子集。在许多多字节字符集中,0x00 - 0x7F范围内的每个字符与ASCII字符集中具有相同值的字符相同。例如,在ASCII和MBCS字符串中,1字节的NULL字符(&#39; \ 0&#39;)的值为0x00,表示终止空字符。&#34;

自: Visual Studio Character Sets 'Not set' vs 'Multi byte character set'