1

我需要使用 C++ 在嵌入式设备上编写一个应用程序。我可能也需要支持 Unicode(尽管我不是这方面的专家)。我也看过 Joel Spoolsky 关于 Unicode 的文章:http: //www.joelonsoftware.com/articles/Unicode.html

我的问题是我上面提到的,在这样的 C++ 应用程序中使用 Unicode 的方法是什么?我应该到处使用 wchar_t 吗?还是 std::wstring?

一直使用 wchar_t 可能会遇到什么问题?(这篇文章提到了一些使用 unicode 字符串可能会遇到的问题:Switching from std::string to std::wstring for Embedded applications? - 但我仍然有点困惑,不知道该怎么做)。

4

2 回答 2

6

“支持”Unicode远远超出了使用wchar_tor std::wstring(它们只是“适合某些宽字符编码的类型,根据当前的语言环境和平台,实际上可能是也可能不是 Unicode”)。

想想诸如isalpha()标记化、转换到/从不同编码等之类的事情,你就明白了。

除非您知道wchar_t可以使用/之类的内置内容std::wstring(并且在这种情况下您不会问),否则最好使用ICU库,它是 Unicode支持的最先进实现。(即使是其他值得推荐的 Boost.Locale 也依赖 ICU 来提供实际逻辑。)

在 ICU 中执行 Unicode 的 C 方式是数组类型UChar [](UTF-16),C++ 方式是 class icu::UnicodeString。我碰巧使用了一个遗留代码库,它竭尽全力“凑合”以UChar []声称性能(共享引用、内存池、写时复制等),但仍然无法超越icu::UnicodeString,所以你可能会感到安全即使在嵌入式环境中也使用后者。他们在那里做得很好。

后脚本:注意wchar_t是实现定义的长度;我所知道的 Unix 上是 32 位,Windows 上是 16 位——这会带来额外的麻烦,因为它wchar_t应该是“宽的”,但 UTF-16 在涉及 Unicode 时仍然是“多字节”的。如果您可以依赖支持 C++11 的环境,则char16_t分别。char32_t将是更好的选择,但仍然不知道像组合字符这样的精细印刷。

于 2013-05-16T09:02:26.407 回答
0

您已经阅读了 Joel 的文章,但似乎您还没有理解它。std::wstring 或 wchar_t 字符串不是 Unicode,它们是可能包含 UCS-2 或 UTF-16 Unicode 字符串或其他内容的宽字符串。std::string 可能包含纯 ASCII 或 ANSI w。代码页字符串,或者它们可能包含 UTF-8 Unicode 字符串或其他内容。

这两种情况经常发生:std::wstring 在 Windows 上往往是 UTF-16,std::string 在 POSIX 上往往是 UTF-8。

DevSolar 的建议是合理的——看看 ICU,它会让你免于很多头痛和误解。

于 2013-05-16T09:07:10.040 回答