Преобразование строки из UTF-8 в UTF-16 Big endian не выполняется (используется язык C, C ++) - PullRequest
0 голосов
/ 10 ноября 2010

Я использую glib-функцию g_convert () для преобразования строки 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 ]

3 голосов
/ 10 ноября 2010

You len равно 0. GLib manual говорит, что len должно быть -1 для строки с нулевым символом в конце.

1 голос
/ 10 ноября 2010

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.

0 голосов
/ 10 ноября 2010

Похоже, ваша система не поддерживает это преобразование.(Эта ошибка означает, что iconv () возвратила EINVAL.)

В моей системе Linux это поддерживается:

echo "Hello" | iconv --from-code UTF-16BE --to-code UTF-8

(очевидно, «Hello» не является допустимым UTF-16строка, но она конвертируется во что-то, поэтому фактическое преобразование поддерживается)

Проверьте, есть ли у вас UTF-16BE в "iconv --list"

В этом конкретном случае вашпростейшим решением может быть использование 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]);
  }
}
0 голосов
/ 10 ноября 2010

Я подозреваю, что UTF-16BE не поддерживается g_convert (на основании сообщения об ошибке). Хотя преобразовать UTF-8 в UTF-16BE тривиально (без таблиц или другого подобного мусора) - вы можете сделать это преобразование самостоятельно.

Возможно, вы также захотите проверить, поддерживается ли UTF-16, и, при необходимости, выполнить собственную замену байтов. Но я не верю, что g_convert также поддерживает UTF-16.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...