我需要使用 C++ 在嵌入式设备上编写应用程序。 我可能也需要支持 Unicode(尽管我不是这方面的专家)。我有 也可以看看 Joel Spoolsky 关于 Unicode 的文章:http://www.joelonsoftware.com/articles/Unicode.html
我的问题是我上面提到的,使用 Unicode 的方式是什么 在这样的 C++ 应用程序中?我应该到处使用 wchar_t 吗?还是 std::wstring?
一直使用wchar_t可能会遇到什么问题? (这篇文章提到了 unicode 字符串可能会遇到的一些问题:Switching from std::string to std::wstring for embedded applications? - 但我仍然有点困惑,不知道该怎么做)。
最佳答案
“支持”Unicode 很好超越使用 wchar_t
或 std::wstring
(它们仅仅是“适合某些宽字符的类型”根据当前的语言环境和平台,可能是也可能不是真正的 Unicode 编码”)。
想想 isalpha()
、标记化、转换为/来自不同编码等,您就明白了。
除非您知道,否则您可以使用 wchar_t
/std::wstring
等内置内容(而且您不会问在那种情况下),你最好使用 ICU库,它是 Unicode 支持 的最先进实现。 (即使是其他方面值得推荐的 Boost.Locale 也依赖于 ICU 来提供实际逻辑。)
在 ICU 中执行 Unicode 的 C 方式是 UChar []
(UTF-16) 类型的数组,C++ 方式是 icu::UnicodeString
类。我碰巧使用一个遗留代码库,该代码库竭尽全力与 UChar []
一起“凑合”以获得性能声明(共享引用、内存池、写时复制等),但仍然无法胜过 icu::UnicodeString
,因此即使在嵌入式环境中,您也可以放心使用后者。他们在那里做得很好。
Post scriptum:请注意,wchar_t
是实现定义的长度;我所知道的 Unix 上是 32 位,Windows 上是 16 位——这带来了额外的麻烦,因为 wchar_t
应该是“宽的”,但 UTF-16 在涉及 Unicode 时仍然是“多字节”。如果您可以依赖支持 C++11 的环境,char16_t
resp。 char32_t
会是更好的选择,但仍然不知道像组合字符这样的精细打印。
关于c++ - 嵌入式软件上的 Unicode 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16583122/