我需要使用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? - 但我仍然感到困惑,因为不知道该怎么做。
答案 0 :(得分:6)
“支持”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 []
来表示性能声明(共享引用,内存池,写时复制等),但仍然无法胜过{{ 1}},因此即使在嵌入式环境中使用后者也会感到安全。他们在那里做得很好。
发布脚本:请注意icu::UnicodeString
是实现定义的长度;在我所知道的Unix上是32位,在Windows上是16位 - 由于wchar_t
应该是“宽”的,因此提供了额外的麻烦,但是当涉及到Unicode时,UTF-16仍然是“多字节”。如果您可以依赖于支持C ++ 11的环境,wchar_t
可以。 char16_t
将是更好的选择,但仍然不能像组合字符那样更精细的打印。
答案 1 :(得分: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,它会让你免于一大堆头痛和误解。