Windows C ++应用。我们有一个只包含ASCII符号的字符串:std::wstring(L"abcdeABCDE ... any other ASCII symbol")
。请注意,这是使用std::wstring
的{{1}}。
问题 - 此字符串的字节表示取决于本地化设置还是其他什么?我可以假设,如果我在app运行时收到这样的字符串(例如,从WindowsAPI),它的字节将与我的PC上的相同吗?
答案 0 :(得分:1)
通常,对于字符(不是转义序列),wchar_t
和wstring
必须使用与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'