std::wstring中ASCII符号的字节表示,具有不同的语言环境
byte representation of ASCII symbols in std::wstring with different locales
Windows C++应用程序。我们有一个仅包含ASCII符号的字符串:std::wstring(L"abcdeABCDE ... any other ASCII symbol")
。请注意,这是使用wchar_t
的std::wstring
。
问题-这个字符串的字节表示取决于本地化设置,还是其他什么?我可以假设,如果我在应用程序运行时收到这样的字符串(例如,来自WindowsAPI),它的字节数将与我电脑上的字节数相同吗?
通常,对于字符(不是转义序列),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
设置本地化之前
请参阅"如何使用std::imbue设置std::wcout的区域设置?"?
文本字符串的字节表示不依赖于环境。它被硬编码为编辑器中的二进制数据。然而,二进制数据的解释方式取决于当前代码页,因此当在运行时转换为宽字符串时,可能会得到不同的结果(而不是使用前导L定义字符串,这意味着宽字符将在编译时设置。)
为了安全起见,请使用setlocale()
来保证用于转换的编码。那你就不用担心环境了。
这可能会有所帮助:"根据定义,ASCII字符集是所有多字节字符集的子集。在许多多字节字符集中,0x00–0x7F范围内的每个字符都与ASCII字符集中具有相同值的字符相同。例如,在ASCII和MBCS字符串中,1字节的NULL字符('\0')具有值0x00并且指示终止的空字符。">
发件人:Visual Studio字符集';未设置';vs';多字节字符集';
- "C.UTF-8" C++ Windows 上的语言环境?
- 有没有办法为macOS上的C++程序指定自定义语言环境目录
- 跨语言共享环境变量
- 如何使用特定语言环境将 u32string (char32_t) 大写?
- 如何在 c++ 中处理 ifstream、cout 等的多个语言环境
- std::ifstream 在二进制模式下,语言环境在 C++ 中
- 如何更改CIN的语言环境
- C 字符串通过自定义语言环境进行小写
- swprintf语言环境
- std::wstring中ASCII符号的字节表示,具有不同的语言环境
- 语言环境"en_US"中 std::time_get::get_time() 的正确时间格式是什么?
- 在QT中更改语言环境
- 为什么非unicode应用程序系统语言环境使Unicode字体具有错误显示的符号字符
- 是否可以让boost语言环境边界分析在撇号上进行拆分
- 当 matlab 找不到语言环境数据库时,这意味着什么?
- C++:sprintf 考虑哪个语言环境
- 如何使用德语语言环境在gdb中设置双变量
- 如何本地加载XML语言环境文件
- std:: lower的行为在不同的语言环境中是如何变化的?
- Boost语言环境转换