gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:52:44 32 4
gpt4 key购买 nike

我只有处理 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 的成熟库。

我真的很想听听您对这件事的看法。

最佳答案

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

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

我真的很想避免使用 ICU,因为它是一个很大的库,但是一旦你构建并安装了它,你就会开始希望你一开始就做了它,因为它拥有你需要的一切,而且很多,更多。

您可能想知道我的好处是什么:

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

缺点:

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

当我查看内置语言功能时,我发现了一些不足,例如大小写转换、单词边界、字符计数、重音敏感度、字符串操作(如子字符串)等。本地支持也非常出色。

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

关于c++ - 在 C++ 内部使用 UTF-8、UTF-16 和 UTF-32?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25713108/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com