UTF-8数据的最佳类型?

时间:2009-09-29 02:48:49

标签: c++ unicode utf-8

用C ++存储UTF-8字符串的最佳类型是什么?如果可能的话,我想避免自己上课。

我最初的想法是std::string - 然而,这使用char作为基础类型。 char可能是未签名或签名的 - 它会有所不同。在我的系统上,它已签名。但是,UTF-8代码单元是无符号八位字节。这似乎表明这是错误的类型。

这导致我们std::basic_string<unsigned char> - 这似乎符合要求:无符号,8位(或更大)的字符。

但是,大多数事情似乎都使用char。例如,glib使用char。 C ++的ostream使用char

思想?

3 个答案:

答案 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>。这表明您无法对存储的数据执行实际的字符串操作(可能不正确)。