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. Он позволяет вам явно выбирать интересующие вас исходные и конечные наборы символов и намного лучше подходит для этой проблемы.