我正在使用g_convert()glib函数将utf-8字符串转换为utf-16大端字符串。转换失败。我们收到错误消息“不支持转换”
有人可以提供解决这个问题的线索。
由于
以下是用于从UTF-8转换字符串的代码。到UTF16 Bigendian
unsigned short *result_str;
gsize bytes_read, bytes_written;
gssize len = 0;
GError *error = NULL;
result_str = (unsigned short *)g_convert("text data", len, "UTF-16BE", "UTF-8", &bytes_read, &bytes_written, &error);
答案 0 :(得分:3)
您len
为0. GLib manual表示对于以NULL结尾的字符串,len
必须为-1。
答案 1 :(得分:1)
g_convert在封面下方使用iconv。
在使用cygwim的机器上,我可以做到
iconv -l
列出了支持的编码,UTF-16BE确实出现在列表中: -
$ iconv -l | grep BE
UCS-2BE UNICODE-1-1 UNICODEBIG CSUNICODE11
UCS-4BE
UTF-16BE
UTF-32BE
James@XPL3KWK28 ~
$ iconv -f UTF-8 -t UTF16-BE
iconv: conversion to UTF16-BE unsupported
iconv: try 'iconv -l' to get the list of supported encodings
您可以看到它不支持转换为UTF-8或从UTF-8转换。
您可能需要分两个阶段执行此操作:UTF-8到UTF-16,然后是UTF-16到UTF-16BE。
答案 2 :(得分:0)
我怀疑UTF-16BE
不支持g_convert
(基于错误消息)。将UTF-8转换为UTF-16BE虽然很简单(没有表格或其他类似垃圾) - 您可以自己进行转换。
您可能还想检查是否支持UTF-16
并在必要时进行自己的字节交换。但我不相信g_convert
也支持UTF-16
。
答案 3 :(得分:0)
您的系统似乎不支持该转换。 (此错误表示iconv()返回EINVAL。)
在我的Linux系统上,它似乎得到了支持:
echo "Hello" | iconv --from-code UTF-16BE --to-code UTF-8
(显然“Hello”不是一个有效的UTF-16字符串,但它确实被转换为某个东西,因此似乎支持实际的转换)
查看“iconv --list”中是否有UTF-16BE
在这种特殊情况下,您最简单的解决方案可能就是使用g_utf8_to_utf16(): http://library.gnome.org/devel/glib/stable/glib-Unicode-Manipulation.html#g-utf8-to-utf16
您可以轻松地执行自己的byteswap,未经测试的代码:
if (G_BYTE_ORDER != G_BIG_ENDIAN) {
for (i = 0; i < len; ++i) {
result_str[i] = GUINT16_TO_BE(result_str[i]);
}
}