我知道这个问题已经被问过很多次了,我确实阅读了一些答案,但是有一些建议的解决方案,我试图找出其中最好的解决方案。
我正在编写一个 C99 应用程序,它基本上接收以 UTF-8 编码的 XML 文本。
它的部分工作是复制和操作该字符串(查找子字符串,cat it,例如..)
因为我现在不想使用外部非标准库,所以我尝试使用 wchar_t 来实现它。
目前,我使用 mbstowcs 将其转换为 wchar_t 以便于操作,并且对于某些输入我尝试使用不同的语言 - 它工作得很好。
事实是,我确实读到有些人对 UTF-8 和 mbstowcs 有一些问题,所以我想听听这种使用是否被允许/可接受。
我面临的另一个选择是使用带有 WCHAR_T 参数的 iconv。问题是,我在一个平台(不是 PC)上工作,它的区域设置非常仅限于 ANSI C 区域设置。那个怎么样?
我也遇到过一些非常流行的 C++ 库。但我对 C99 的实现有限制。
另外,我会在另一个平台上编译此代码,其中 wchar_t 的 sizeof 不同(我的机器上为 2 字节与 4 字节)。我怎样才能克服这个问题?使用固定大小的字符容器?但是,我应该使用哪些操作函数呢?
很高兴听到一些想法。谢谢。
C没有定义什么编码char
and wchar_t
类型是,标准库只要求一些在两者之间转换的函数,而没有说明如何转换。如果依赖于实现的编码char
则不是 UTF-8mbstowcs
将导致数据损坏。
如中所述C99 标准的基本原理 http://www.open-std.org/jtc1/sc22/wg14/www/docs/C99RationaleV5.10.pdf:
然而,这五个功能往往限制性太强,而且太原始,无法开发管理字符的可移植国际程序。
...
C90 故意选择不发明更完整的多字节和宽字符库,而是选择等待它们的自然发展,因为 C 社区获得了更多关于宽字符的经验。
源自here http://www.open-std.org/jtc1/sc22/wg14/.
因此,如果您的文件中有 UTF-8 数据char
没有标准的 API 方法可以将其转换为wchar_t
s.
在我看来wchar_t
除非必要,否则通常应该避免 - 例如,如果您使用 WIN32 API,则可能需要它。我不相信它会简化字符串操作。wchar_t
在 Windows 上始终为 UTF-16LE,因此您可能仍需要多个wchar_t
无论如何表示单个 Unicode 代码点。
我建议你调查一下重症监护室项目 http://site.icu-project.org/- 至少从教育的角度来看。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)