【发布时间】:2014-01-29 00:17:03
【问题描述】:
有没有办法可移植地(即符合 C 标准)将主机字符编码中的字符串转换为 Unicode 代码点数组?我正在开发一些数据序列化软件,但我遇到了一个问题,因为虽然我需要通过线路发送 UTF-8,但 C 标准不保证 ASCII 编码,因此在主机字符编码中转换字符串可以是一项不平凡的任务。
有没有图书馆可以为我处理这类事情?是否有隐藏在 C 标准库中的函数可以做这样的事情?
【问题讨论】:
有没有办法可移植地(即符合 C 标准)将主机字符编码中的字符串转换为 Unicode 代码点数组?我正在开发一些数据序列化软件,但我遇到了一个问题,因为虽然我需要通过线路发送 UTF-8,但 C 标准不保证 ASCII 编码,因此在主机字符编码中转换字符串可以是一项不平凡的任务。
有没有图书馆可以为我处理这类事情?是否有隐藏在 C 标准库中的函数可以做这样的事情?
【问题讨论】:
C11 标准 ISO/IEC 9899:2011 有一个新的标头 <uchar.h> 以及一些基本设施来提供帮助。它在 §7.28 Unicode 实用程序 <uchar.h> 部分中进行了描述。
定义了两对函数:
c16rtomb() 和 mbrtoc16() — 使用类型 char16_t aka uint_least16_t。c32rtomb() 和 mbrtoc32() — 使用类型 char32_t aka uint_least32_t。名称中的r 表示“可重启”;这些函数旨在被迭代调用。 mbrtoc{16,32}() 对从多字节代码集(因此为 mb)转换为 char16_t 或 char32_t。 c{16,32}rtomb() 对从 char16_t 或 char32_t 转换为多字节字符序列。
我不确定他们是否会做你想做的事。 <uchar.h> 标头和因此这些功能在 Mac OS X 10.9.1 上不可用,无论是 Apple 提供的 clang 还是“自制”GCC 4.8.2,所以我没有机会调查他们。标头似乎在带有 GCC 4.8.1 的 Linux (Ubuntu 13.10) 上可用。
我认为ICU 可能是一个更好的选择——不过,它是一个相当大的库(但那是因为它在支持一般的 Unicode 和一般的不同语言环境方面做得很彻底)。
【讨论】: