使用ICU将UCS-2字符串转换为UTF-8
你能帮我用ICU把UCS-2字符串转换成UTF-8吗 我正在使用下面的代码,但它不起作用使用ICU将UCS-2字符串转换为UTF-8,c,utf-8,utf-16,icu,C,Utf 8,Utf 16,Icu,你能帮我用ICU把UCS-2字符串转换成UTF-8吗 我正在使用下面的代码,但它不起作用 UErrorCode status = U_ZERO_ERROR; UConverter *conv; char buf[1000]; int32_t buflen; conv = ucnv_open("utf-8", &status); if (U_FAILURE(status)) { LOG(L_ERROR, "%s: Can not open the ICU converter\n
UErrorCode status = U_ZERO_ERROR;
UConverter *conv;
char buf[1000];
int32_t buflen;
conv = ucnv_open("utf-8", &status);
if (U_FAILURE(status))
{
LOG(L_ERROR, "%s: Can not open the ICU converter\n", __FUNCTION__);
}
else
{
buflen = ucnv_fromUChars(conv, buf, sizeof(buf), (UChar*)sms->message.s, sms->message.len, &status);
if (U_FAILURE(status))
{
LOG(L_ERROR, "%s: Error in conversion: %s\n", __FUNCTION__, u_errorName(status));
}
}
LOG(L_DEBUG, "%s: Conversion made ...\n", __FUNCTION__);
hexdump(sms->message.s, sms->message.len);
hexdump(buf, buflen);
sms->消息是一个结构:
typedef struct str
{
char *s;
int len;
} str_t;
hextump打印以下内容(输入文本:“aaaa”):
e6 84 80
是一种用于CJK统一表意文字的UTF-8。它看起来像是sms->message.s
是用小写字母表示的,而您的系统是用大写字母表示的(因此0x0061
变成0x6100
)
您可以使用
UCNV\u UTF16\u LittleEndian
转换器,或者在将sms->message.s
传递到ICU之前执行字节交换。我不确定它是否与@ecatmur发现的endiannes问题有关,但您正在将sms->message.s
这是char*
转换成Uchar*
看看:
将UChar定义为UChar#u类型,如果已定义(例如,到char16_t),或将wchar#t定义为16位宽;始终假定为未签名
如果两者都不可用,则将UChar定义为uint16\t
这使得UChar平台的定义依赖于平台,但允许直接字符串类型与16位wchar\t类型的平台兼容
你确定这个演员阵容是安全的吗?你可能还想用
c
或c++
或任何东西来标记你的问题,以确保正确的人看到它。你是对的,我需要一个字节交换。我正在使用这个函数:short swap\u bytes\u 16(short input)
{
return(input>>8)|(input
[DEBUG] add_recv_sms_to_db: Conversion made ...
000000: 00 61 00 61 00 61 00 61 .a.a.a.a
000000: e6 84 80 e6 84 80 e6 84 80 e6 84 80 00 00 49 00 ..............I.