我如何在 1 字节普通字符串中存储日语字符?
how I'm able to store a japanese character in 1 byte normal string?
std::string str1="いい";
std::string str2="الحانةالريفية";
WriteToLog(str1.size());
WriteToLog(str2.size());
我在日志文件中得到"2,13",这是这些字符串中的确切字符数。但是日语和阿拉伯语字符如何适应一个字节。我希望 str.size(( 应该不返回字符串使用的字节数。
在基于 UTF-8 的语言环境中,我分别得到 6 个和 26 个字节。
您必须使用的区域设置,该区域设置使用字符集的高 8 位部分对这些非拉丁字符进行编码,每个字符使用一个字节。
如果您切换到 UTF-8 语言环境,您应该得到与我相同的结果。
答案是,你不能。
这些字符串不包含您认为它们包含的内容。
-
首先,请确保将源文件另存为 UTF-8 和 BOM 或 UTF-16。(Visual Studio用签名和Unicode调用这些UTF-8(。
不要使用任何其他编码,因为当您在具有不同语言设置的计算机之间移动源文件时,该字符串文字的含义会发生变化。
-
然后,您需要确保编译器使用合适的字符集将这些字符串嵌入到二进制文件中。这称为执行字符集→请参阅 VC 中是否有像 GCC 中的"-fexec-charset"这样的编译选项来设置执行字符集?
或者你可以选择可移植的解决方案,它自己将字符串编码为 UTF-8,然后将字符串文字写为字节:"xe3x81x84xe3x81x84"
.
他们使用的是 MBCS(多字节字符集(。
在底层,Unicode 会将所有字符编码为两个字节,而 MBCS 将在单个字节中编码常见字符,并将使用扩展字符第一个字节来表示它将为此字符使用多个字节。 令人困惑的是,根据您为日语字符串中的第二个字符选择的字符,您的大小可能是 3,而不是 2 或 4。
MBCS有点过时了,建议尽可能使用Unicode进行新的开发。 有关详细信息,请参阅下面的链接。
https://msdn.microsoft.com/en-us/library/5z097dxa.aspx
- 将字符串存储在c++中的稳定内存中
- 当字符串存储在变量中时,如何将字符串转换为wchar_t
- 将字符串存储到文件下一行的变量中
- 将字符串存储在 constexpr 结构中
- 将字符串存储为十六进制而不进行转换
- 如何将 std::string 作为构造函数参数传递,并将其保存的 C 字符串存储在 void 指针中?
- 将非数字字符串存储为二进制整数
- 将 C++ 字符串存储到 char* 向量中
- C++无法将对齐的字符串存储在字符串变量中并打印出来
- 短(ASCII,每个字符 7 位)字符串存储和C++中的比较优化
- 我无法将 Excel 中的输入字符串存储为二维字符串
- 如何将此字符串存储为不同的变量
- C 将字符串存储到类中
- C :占用更多内存,将单个字符作为char或字符串存储
- 排序通过字符串C 存储在向量的对象
- 如何将可变长度字符串存储在C/C 中
- 将字符串存储在无符号长整型的向量中
- 如何使用模板解码将来自 YAML::Node 的字符串存储在类中
- 将字符串存储到数组中
- C++-将用逗号分隔的用户输入字符串存储到向量中