用C ++存储UTF-8字符串的最佳类型是什么?如果可能的话,我想避免自己上课。
我最初的想法是std::string
- 然而,这使用char
作为基础类型。 char
可能是未签名或签名的 - 它会有所不同。在我的系统上,它已签名。但是,UTF-8代码单元是无符号八位字节。这似乎表明这是错误的类型。
这导致我们std::basic_string<unsigned char>
- 这似乎符合要求:无符号,8位(或更大)的字符。
但是,大多数事情似乎都使用char
。例如,glib使用char
。 C ++的ostream
使用char
。
思想?
答案 0 :(得分:9)
我只是使用std :: string,因为它与UTF-8处理数据的理想一致,就像空终止的ASCII字符串一样,除非你真的需要它们的unicode-ness。
我也喜欢GTKmm的Glib :: ustring,但只有在你编写GTKmm(或至少是Glibmm)应用程序时才有效。
答案 1 :(得分:7)
我一直只是使用std :: string,不管怎么说,“签名”与“无符号”的哲学问题在这样的环境中从来没有出现过问题(UTF-8的编码器和解码器)毕竟,你只是很少写的东西;在应用程序上下文中,你只是使用std :: string作为各种各样的“黑盒子”! - 。)。
答案 2 :(得分:4)
UTF-8是可变长度字符编码。 std::basic_string
仅支持固定长度字符编码。如果您需要支持可变长度编码,可以尝试ICU4C library。
ICU是一套成熟且广泛使用的C / C ++和Java库,为软件应用程序提供Unicode和全球化支持。 ICU具有广泛的可移植性,可以在所有平台上以及C / C ++和Java软件之间为应用程序提供相同的结果。
如果您只需要存储 UTF-8字符串,我建议您使用std::vector<char>
。这表明您无法对存储的数据执行实际的字符串操作(可能不正确)。