我有一个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
答案 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]};
为您的作业记录数据到此联盟中