我有一个UTF-16LE字符串'TEST'及其hexdump如下
feff 0074 0065 0073 0074 000a
如果我在bash上使用命令iconv将此字符串转换为UTF-8,那么它将被转换而没有任何问题。
6574 7473 000a
但是,如果我使用我的C程序执行相同的操作,那么只要遇到字符'T'的0x00,似乎iconv函数将其视为空终止即使很难我已将字符串长度指定为12(包括bom和null终止)。
65 000a
以下是我正在测试的代码。但是,如果我转换任何大小的宽字符串(只是没有0x00字节)将返回正确的输出。
char *cOutput; // Output buffer with more enough size required
size_t tOutput;
char *cInput; // string wide characters
size_t tInput;
iconv_t cd;
........
cd = iconv_open("UTF8//TRANSLIT", "UTF-16LE");
iconv(cd, &cInput, &tInput, &cOutput, &tOutput);
这个问题是否有解决办法,或者我做错了什么?任何意见都将不胜感激。
答案 0 :(得分:1)
猜测一下,您的问题是您错误地初始化tInput
,可能使用strlen(cInput)
。
此代码为我生成预期输出:
#include <stdio.h>
#include <string.h>
#include <iconv.h>
int main()
{
char utf16le_str[] = { '\xff', '\xfe', '\x74', '\x00', '\x65', '\x00',
'\x73', '\x00', '\x74', '\x00', '\x0a', '\x00' };
char dest_str[100];
char *in = utf16le_str;
char *out = dest_str;
size_t inbytes = sizeof utf16le_str;
size_t outbytes = sizeof dest_str;
iconv_t conv = iconv_open("UTF-8//TRANSLIT", "UTF-16LE");
if (conv == (iconv_t)-1) {
perror("iconv_open");
return 1;
}
if (iconv(conv, &in, &inbytes, &out, &outbytes) == (size_t)-1) {
perror("iconv");
return 1;
}
dest_str[sizeof dest_str - outbytes] = 0;
puts(dest_str);
return 0;
}