我怎么能用1字节普通字符串存储日文字符?

时间:2015-12-01 13:29:49

标签: c++ visual-c++ unicode ansi

  std::string str1="いい";
  std::string str2="الحانةالريفية";
  WriteToLog(str1.size());
  WriteToLog(str2.size());

我在日志文件中得到“2,13”,这是这些字符串中的确切字符数。但日语和阿拉伯语字符如何适合一个字节。我希望str.size()不返回字符串使用的字节数。

3 个答案:

答案 0 :(得分:2)

在我基于UTF-8的语言环境中,我分别得到6和26个字节。

您必须使用使用字符集的高8位部分的语言环境来编码这些非拉丁字符,每个字符使用一个字节。

如果切换到UTF-8语言环境,您应该得到与我相同的结果。

答案 1 :(得分:0)

答案是,你不能

这些字符串不包含您认为包含的内容。

  • 首先确保将源文件保存为带有BOM的UTF-8或UTF-16。 (Visual Studio将这些 UTF-8称为签名 Unicode )。

    不要使用任何其他编码,因为当您在具有不同语言设置的计算机之间移动源文件时,该字符串文字的含义会发生变化。

  • 然后,您需要确保编译器使用合适的字符集将这些字符串嵌入到二进制文件中。这称为执行字符集→请参阅Does VC have a compile option like '-fexec-charset' in GCC to set the execution character set?

或者你可以选择 portable 解决方案,它自己将字符串编码为UTF-8,然后将字符串文字写成字节:"\xe3\x81\x84\xe3\x81\x84"

答案 2 :(得分:-1)

他们正在使用MBCS(多字节字符集)。

当Unicode将两个字节中的所有字符编码时,MBCS将在单个字节中编码公共字符,并将使用扩展字符第一个字节来表示它将为该字符使用多个字节。令人困惑的是,根据您为日语字符串中的第二个字符选择的字符,您的大小可能是3,而不是2或4。

MBCS有点过时了,建议尽可能使用Unicode进行新的开发。有关详细信息,请参阅以下链接。

https://msdn.microsoft.com/en-us/library/5z097dxa.aspx