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