在C ++内部使用UTF-8 vs UTF-16和UTF-32?

时间:2014-09-07 17:48:47

标签: c++ unicode utf-8

我只有处理ASCII(单字节字符)的经验,并阅读了很多关于人们如何处理Unicode的帖子,这些帖子提出了他们自己的问题。

此时我对Unicode的接触非常有限,我已经读过使用 UTF-16进行内部处理会显示可移植性和其他问题

我觉得 UTF-32比UTF-16 更有意义,因为所有Unicode字符都适合4个字节但会消耗更多资源,特别是如果你主要处理的是ISO-8859-1字符

我谦卑地认为UTF-8可能是一种理想的内部工作格式(特别是对于主要处理基于英语和拉丁语的字符的情况),因为ASCII字符范围将被处理逐字节非常有效。拉丁字母表中的字符会消耗两个字节,而其他字符当然会占用更多字节。

我看到的另一个优点是 UTF-8字符串可以存储在常规C ++ std :: string或C字符串数组中,这看起来很自然。

至少对我使用UTF-8的缺点是我没有找到任何内部支持UTF-8的库。例如,我没有找到任何用于UTF-8案例转换和子串操作的库。

另一个缺点是我没有找到解析UTF-8字符串中字节的函数来进行字符处理。

在内部使用UTF-8是否可行,是否有任何支持库用于此目的?我希望如此,但如果没有,我认为我最好的选择是忘记在内部使用UTF-8并使用 Boost :: Locale ,因为我读过 ICU 是一个成熟的库,许多人用它来处理Unicode。

我真的很想听听你对此事的看法。

1 个答案:

答案 0 :(得分:0)

我碰到了很老的答案,我会告诉你我最终要做什么。我决定坚持使用 UTF-8 ,并将数据存储在std :: string或单字节char数组中。从未需要我使用多字节字符!

我使用的第一个库是UTF8-CPP,它很容易引入您的应用程序并使用。但是您很快就会发现您需要越来越多的功能。

我真的想避免使用ICU,因为它是一个很大的库,但是一旦构建并安装了ICU,您就开始希望自己做到了,因为它具有您所需的一切,而且很多,还有很多。

您可能想知道我有什么好处

  • 我编写了真正可移植的代码,这些代码是在Windows的VC ++或Linux的GCC下构建的。
  • ICU拥有一切,我的意思是您需要有关unicode的一切。
  • 我能够坚持使用我心爱的std :: string和char数组。
  • 我在我的应用程序中使用了许多开源库,而零期问题。例如,我将RapidJson用于我的JSON,以创建包含UTF-8数据的内存中JSON对象。我能够将它们传递到Web服务器或将它们写入磁盘等。真的很简单。
  • 我将数据存储到Firebird SQL中,但是您需要将varchar和char字段类型指定为UTF8。这意味着您的字符串将以多字节形式存储在数据库中。但这对您(开发人员)完全透明。我确信这也适用于其他SQL数据库。

缺点:

  • 大型图书馆,起初非常令人恐惧和混乱。
  • C ++不是由C ++专家(例如Boost开发人员)编写的。但是代码完全稳定且快速。您可能不喜欢使用的语法。我要做的是用代码“包装”通用过程。这几乎意味着我包括包装UCU丑陋的UTF-8库。不要让这件事困扰您,因为ICU完全稳定且快速。
  • 我个人将ICU动态链接到我的应用程序中。这意味着我首先为Win和Linux 64位环境动态构建了ICU。对于Windows,我将dll存储在某个位置的文件夹中,并将其添加到Windows路径中,以便需要ICU的任何应用程序都可以找到这些dll。

当我查看内置语言功能时,发现一些不足,例如小写/大写转换,单词边界,计数字符,重音敏感度,诸如子字符串之类的字符串处理等。本地支持也完全令人惊奇。 / p>

我想这是对UTF-8中整个练习的总结。