繁体   English   中英

使用ICU将UCS-2字符串转换为UTF-8

[英]Convert an UCS-2 string to UTF-8 using 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", __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-> message是一个结构:

typedef struct str
{
    char *s;
    int len;
} str_t;

十六进制转储显示以下内容(输入文本:“ aaaa”):

[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.

e6 84 80是CJK统一表意文字U + 6100的 UTF-8。 看起来sms->message.s在小端序中,而您的系统在用大端序来解释它(因此0x0061变为0x6100 )。

您可以使用UCNV_UTF16_LittleEndian转换器,或仅在将sms->message.s传递到ICU之前执行字节交换。

我不确定它是否与@ecatmur发现的endiannes问题有关,但是您正在将sms->message.s转换为Uchar*一个char* Uchar*

这里看

如果将UChar定义为#defined(例如,将其定义为char16_t),则将其定义为UCHAR_TYPE;如果是16位宽,则将其定义为wchar_t。 始终假定为未签名。

如果都不可用,则将UChar定义为uint16_t。

这使UChar的定义取决于平台,但允许与具有16位wchar_t类型的平台直接兼容字符串类型。

您确定此演员表安全吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM