3

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

现在我有四个代码点值对应于一些本地字母表中的四个字符,我想通过将它们插入到 ac 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

4

3 回答 3

4

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

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

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

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

于 2012-06-07T08:26:33.510 回答
0

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

于 2012-06-07T07:39:14.143 回答
0

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

于 2012-06-07T10:53:28.643 回答