【问题标题】:How to convert uni code point value (utf16) to C char array如何将 uni 代码点值(utf16)转换为 C char 数组
【发布时间】:2012-06-07 07:24:45
【问题描述】:

我有一个 api,它将 uni 代码数据作为 c 字符数组并将其作为 uni 代码中的正确短信发送。

现在我有四个代码点值对应于某些本地字母表中的四个字符,我想通过将它们插入 c char 数组来正确发送它们。

我试过了

char test_data[] = {"\x00\x6B\x00\x6A\x00\x63\x00\x69"};

其中 0x006B 是一个代码点,依此类推。

内部的api正在调用

int len = mbstowcs(NULL,test_data,0);

上面的结果为 0。似乎 0x00 被视为终止空值。

我想将上述代码点正确分配给 c 数组,以便它们在接收电话上生成相应的 utf16 字符(它确实支持字符集)。如果需要,我也可以更改 API。

平台是带有 glib 的 Linux

【问题讨论】:

  • 查看了很多相关的现有问题,但还没有完全找到解决方案
  • API 需要哪种编码?您并没有说明这一点,并且说“将 unicode 数据作为 C 字符数组”确实并没有说明什么。您必须知道预期的编码,否则当然无法知道如何排列位。

标签: c unicode character-encoding


【解决方案1】:

UTF-16BE 不是本机执行(AKA 多字节)字符集mbstowcs 确实需要以空字符结尾的字符串,所以这不起作用。由于您使用的是 Linux,因此该函数可能期望任何 char[] 序列为 UTF-8。

我相信您可以在 Linux 中使用 uniconv 对字符数据进行转码。我只使用了ICU4C 项目。

您的代码将读取 UTF-16BE 数据,将其转码为通用格式(例如 uint8_t),然后在调用 API 之前将其转码为原生执行字符集(这将然后将其转码为本机宽字符集。)

注意:如果执行字符集不包含相关代码点,这可能是一个有损过程,但您别无选择,因为这是 API 所期望的。但正如我上面提到的,现代 Linux 系统应该默认使用 UTF-8。我写了一点关于在 C here 中转码代码点的内容。

【讨论】:

  • 提问者正在使用 GLib,它有相当不错的基本 Unicode 工具选择:developer.gnome.org/glib/stable/glib-Unicode-Manipulation.html,包括转码。
  • 谢谢我会探索他们两个
  • @ecatmur - 感谢您指出这一点;无论使用何种 API,该过程都是相同的。
  • 如何执行此步骤? “然后在调用API之前将其转码为本机执行字符集”......在此之前我使用g_utf16_to_utf8()并获得了一个utf8字符串?谢谢
  • 好吧,我实际上不必这样做。只是使用 g_utf16_to_utf8() 和 UTF16-LE 对我有用。谢谢@McDowell 和 ecatmur
【解决方案2】:

我认为使用 wchar_t 可以解决您的问题。 如果我错了或遗漏了什么,请纠正我。

【讨论】:

  • wchar_t 只是宽字符数据类型。我尝试将此数组分配给它。但关键是api并不期望wchar_t。它采用每个字节一个字符的普通 c 字符数组,然后将其转换。
【解决方案3】:

我认为您应该创建一个字符和整数的联合。
typedef union wchars{int int_arr[200]; char char_arr[800]};
将数据 memcpy 到此联合中以进行分配

【讨论】:

    猜你喜欢
    • 2021-07-16
    • 1970-01-01
    • 2017-01-06
    • 2021-11-18
    • 1970-01-01
    • 2011-06-08
    • 2021-07-22
    • 2022-01-22
    • 2019-08-14
    相关资源
    最近更新 更多