我如何在 1 字节普通字符串中存储日语字符?

how I'm able to store a japanese character in 1 byte normal string?

本文关键字:字符串 存储 日语 字符 字节      更新时间:2023-10-16
  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