0

g_convert() glib 関数を使用して、utf-8 文字列を utf-16 ビッグ エンディアン文字列に変換しています。変換に失敗しています。「変換はサポートされていません」というエラーが表示されます

誰かがこの問題を克服する手がかりを与えることができますか.

ありがとう

以下は、文字列を UTF-8 から変換するために使用されるコードの一部です。UTF16 バイエンディアンに

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 への 2 段階でこれを行う必要があります。

于 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 に答える