使用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

你能帮我用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", __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.