12

我仍在尝试决定我的(家庭)项目是否应该使用UTF-8字符串(根据 std::string 在必要时使用额外的 UTF-8 特定函数实现)或一些 16 位字符串(实现为 std: :wstring)。该项目是一种编程语言和环境(如 VB,它是两者的结合)。

有一些愿望/限制:

  • 如果它可以在有限的硬件上运行,比如内存有限的计算机,那就太酷了。
  • 我希望代码在 Windows、Mac 和(如果资源允许)Linux 上运行。
  • 我将使用wxWidgets作为我的 GUI 层,但我希望与该工具包交互的代码限制在代码库的一个角落(我将拥有非 GUI 可执行文件)。
  • 在处理用户可见文本和应用程序数据时,我想避免使用两种不同类型的字符串。

目前,我正在使用 std::string,目的是仅在必要时使用 UTF-8 操作函数。它需要更少的内存,并且似乎是许多应用程序的发展方向。

如果您推荐 16 位编码,那是哪一种:UTF-16UCS-2?另一个?

4

8 回答 8

26

UTF-16 仍然是可变长度字符编码(有超过 2^16 个 unicode 代码点),因此您不能进行 O(1) 字符串索引操作。如果您正在做很多此类事情,那么您不会在 UTF-8 上节省任何速度。另一方面,如果您的文本包含大量 256-65535 范围内的代码点,则 UTF-16 可以显着改善大小。UCS-2 是固定长度的 UTF-16 的变体其代价是禁止任何大于 2^16 的代码点。

在不了解您的要求的情况下,我个人会选择 UTF-8。由于其他人已经列出的所有原因,这是最容易处理的。

于 2008-09-19T16:46:41.143 回答
6

老实说,我从来没有找到任何理由使用 UTF-8 以外的任何东西。

于 2008-09-19T16:23:05.270 回答
5

如果您决定使用 UTF-8 编码,请查看此库:http ://utfcpp.sourceforge.net/

它可能会让你的生活更轻松。

于 2008-09-19T17:39:18.973 回答
4

实际上,我已经编写了一个广泛使用的应用程序(超过 500 万用户),所以每千字节的使用量都会加起来。尽管如此,我还是坚持使用 wxString。我已将其配置为从 std::wstring 派生,因此我可以将它们传递给期望 wstring const& 的函数。

Please note that std::wstring is native Unicode on the Mac (no UTF-16 needed for characters above U+10000), and therefore it uses 4 bytes/wchar_t. The big advantage of this is that i++ gets you the next character, always. On Win32 that is true in only 99.9% of the cases. As a fellow programmer, you'll understand how little 99.9% is.

But if you're not convinced, write the function to uppercase a std::string[UTF-8] and a std::wstring. Those 2 functions will tell you which way is insanity.

Your on-disk format is another matter. For portability, that should be UTF-8. There's no endianness concern in UTF-8, nor a discussion over the width (2/4). This may be why many programs appear to use UTF-8.

On a slightly unrelated note, please read up on Unicode string comparisions and normalization. Or you'll end up with the same bug as .NET, where you can have two variables föö and föö differing only in (invisible) normalization.

于 2008-09-21T23:26:16.063 回答
2

我会推荐 UTF-16 用于任何类型的数据操作和 UI。Mac OS X 和 Win32 API 使用 UTF-16,同样适用于 wxWidgets、Qt、ICU、Xerces 等。UTF-8 可能更适合数据交换和存储。请参阅http://unicode.org/notes/tn12/

但无论您选择什么,我绝对会建议“仅在必要时”使用 UTF-8 反对 std::string。

一路走 UTF-16 或 UTF-8,但不要混搭,那是自找麻烦。

于 2008-09-19T16:33:57.493 回答
2

MicroATX 几乎是一种标准的 PC 主板格式,最适合 4-8 GB 的 RAM。如果您在谈论 picoATX,那么您可能仅限于 1-2 GB RAM。即便如此,这对于开发环境来说已经足够了。出于上述原因,我仍然会坚持使用 UTF-8,但内存不应该是您关心的问题。

于 2008-09-19T16:39:54.780 回答
1

根据我的阅读,除非内存不足,否则最好在内部使用 16 位编码。它在一个字符中几乎适用于所有生活语言

我也会看看ICU。如果您不打算使用字符串的某些 STL 功能,则使用 ICU 字符串类型可能更适合您。

于 2008-09-19T16:23:03.837 回答
0

你考虑过使用 wxStrings 吗?如果我没记错的话,他们可以进行 utf-8 <-> Unicode 转换,当您必须将字符串传入和传出 UI 时,它会变得更容易一些。

于 2008-09-19T17:04:33.457 回答