如何将Unicode代码点值(UTF16)转换为C字符数组。

3

我有一个API,它接受UniCode数据作为C字符数组,并将其作为正确的UniCode短信发送。

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

我尝试过

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。


查看了许多相关的现有问题,但尚未找到确切的解决方案。 - fkl
API 需要哪种编码?你没有说明,而且说“将 Unicode 数据作为 C 字符数组”并不能告诉我们太多信息。你必须知道期望的编码,否则就无法知道如何排列位。 - unwind
3个回答

4
UTF-16BE不是本地的执行(又称多字节)字符集,mbstowcs期望空结尾字符串,因此这不起作用。由于您正在使用Linux,该函数可能希望任何char[]序列为UTF-8。
我相信您可以在Linux中使用uniconv转换字符数据。我只使用过ICU4C项目。
您的代码将读取UTF-16BE数据,将其转换为常见形式(例如uint8_t),然后在调用API之前将其转换为本地的执行字符集(这将随后将其转换为本地的宽字符集)。
注意:如果执行字符集不包含相关的代码点,则此过程可能会有损失,但是您别无选择,因为这是API所期望的。但正如我上面指出的那样,现代Linux系统应默认使用UTF-8。我在这里写了一些关于在C中转码代码点的内容。

提问者正在使用GLib,它具有相当不错的基本Unicode功能选择:http://developer.gnome.org/glib/stable/glib-Unicode-Manipulation.html,包括转码。 - ecatmur
谢谢,我会同时探索它们。 - fkl
@ecatmur - 感谢您指出这一点;无论使用哪种API,该过程都将是相同的。 - McDowell
我该如何执行这一步骤?“在调用API之前将其转码为本地执行字符集”... 在此之前,我使用了g_utf16_to_utf8()并获得了一个utf8字符串?谢谢。 - fkl
好的,实际上我不需要这样做。只需使用g_utf16_to_utf8()和UTF16-LE即可解决我的问题。感谢@McDowell和ecatmur。 - fkl

0

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


wchar_t只是宽字符数据类型。我尝试将该数组分配给它。但问题在于API不期望wchar_t,而是采用每个字节一个字符的普通c char数组,并在之后进行转换。 - fkl

0

我认为你应该创建一个字符和整数的联合体。
typedef union wchars{int int_arr[200]; char char_arr[800]};
将数据使用memcpy函数复制到这个联合体中,以便完成你的任务。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接