Как правильно вызвать mbstowcs? - PullRequest
0 голосов
/ 25 ноября 2011

size_t mbstowcs (wchar_t * dest, const char * src, size_t n);

У меня есть некоторая информация, закодированная с использованием gb2312, которую нужно изменить на Unicode на платформе Android.

1.Прежде чем вызывать этот метод, правильно ли устанавливать locale (LC_ALL, "zh_CN.UTF-8")?

2. На сколько нужно выделить dest?

3.Что перейти к n, это strlen (src)?

Большое спасибо.

1 Ответ

2 голосов
/ 25 ноября 2011

mbstowcs() преобразует строку из многобайтовой кодировки текущей локали в строку широких символов. Строки широких символов не обязательно являются Unicode, но в Linux они (UCS32).

Если вы установите языковой стандарт на zh_CN.UTF-8, то многобайтовая кодировка текущей локали будет UTF-8, а не GB2312. Вам потребуется установить языковой стандарт GB2312 для обрабатываемого ввода с использованием этой многобайтовой кодировки.

Стандарт C подразумевает, что один многобайтовый символ будет содержать не более одного широкого символа, поэтому вы можете использовать strlen(src) в качестве верхней границы необходимого количества широких символов:

size_t n = strlen(src) + 1;
wchar_t *dest = malloc(n * sizeof dest[0]);

(glibc имеет расширение к стандартному интерфейсу mbstowcs(), который позволяет передавать ему указатель NULL, чтобы точно определить, сколько широких символов будет получено при преобразовании, но это не поможет вам Android.) Это работает так:

size_t n = mbstowcs(NULL, src, 0) + 1;

Значение n, которое должно быть передано, является максимальным количеством широких символов, которые должны быть записаны через указатель dest, включая завершающий нулевой широкий символ.

Однако вместо этого вы должны использовать libiconv, который был успешно скомпилирован для Android. Он позволяет вам явно выбирать интересующие вас исходные и конечные наборы символов и намного лучше подходит для этой проблемы.

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