0

我正在使用 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);
4

4 回答 4

3

len是 0。GLib手册说,len对于以 NULL 结尾的字符串,它必须是 -1。

于 2010-11-10T01:45:25.037 回答
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-16,然后从 UTF-16 到 UTF-16BE。

于 2010-11-10T02:20:00.727 回答
0

我怀疑UTF-16BE不支持g_convert(基于错误消息)。不过,将 UTF-8 转换为 UTF-16BE 很简单(没有表格或其他类似的垃圾)——您可以自己进行转换。

您可能还想检查是否UTF-16支持并在必要时进行自己的字节交换。但我也不相信g_convert支持UTF-16

于 2010-11-10T01:43:31.333 回答
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

您可以轻松地做自己的字节交换,未经测试的代码:

if (G_BYTE_ORDER != G_BIG_ENDIAN) {
  for (i = 0; i < len; ++i) {
    result_str[i] = GUINT16_TO_BE(result_str[i]);
  }
}
于 2010-11-10T01:50:05.643 回答