【问题标题】:Converting string in host character encoding to Unicode in C将主机字符编码中的字符串转换为C中的Unicode
【发布时间】:2014-01-29 00:17:03
【问题描述】:

有没有办法可移植地(即符合 C 标准)将主机字符编码中的字符串转换为 Unicode 代码点数组?我正在开发一些数据序列化软件,但我遇到了一个问题,因为虽然我需要通过线路发送 UTF-8,但 C 标准不保证 ASCII 编码,因此在主机字符编码中转换字符串可以是一项不平凡的任务。

有没有图书馆可以为我处理这类事情?是否有隐藏在 C 标准库中的函数可以做这样的事情?

【问题讨论】:

  • 不,C 标准库中没有任何内容,但您可能想了解ICU
  • @JoachimPileborg:您是否考虑了 C11 和 <uchar.h> 标头?
  • @JonathanLeffler 不,我没有尽可能多地阅读 C11,所以我可能错过了很多内容。
  • @JoachimPileborg 该库似乎具有我正在寻找的实用程序,但对于我的目的来说它太重了。您是否知道任何更简单的库也能够处理这些类型的转换?
  • 您确定“主机字符编码”定义明确且正确吗?假设一个未声明的、无类型的用户提供的字符串采用特定的字符编码,这不可避免地会导致mojibake

标签: c unicode encoding


【解决方案1】:

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_tchar32_tc{16,32}rtomb() 对从 char16_tchar32_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 和一般的不同语言环境方面做得很彻底)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-03
    • 2012-06-24
    • 1970-01-01
    相关资源
    最近更新 更多