如何将unicode点值(utf 16)转换为C char数组

时间:2012-06-07 07:24:45

标签: c unicode character-encoding

我有一个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

3 个答案:

答案 0 :(得分:4)

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

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

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

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

答案 1 :(得分:0)

我认为使用wchar_t可以解决您的问题。 如果我错了或遗失了某些东西,请纠正我。

答案 2 :(得分:0)

我认为你应该创建一个字符和整数的联合。
typedef union wchars{int int_arr[200]; char char_arr[800]};为您的作业记录数据到此联盟中