Причина, по которой существует (нестандартная) кодировка WCHAR_T
, состоит в том, чтобы упростить преобразование указателя на wchar_t
в указатель на char
и использовать его с iconv
. Формат, понимаемый этой кодировкой, соответствует собственному wchar_t
системе.
Если вы спрашиваете о glib c, а не о других реализациях lib c, то на Linux wchar_t
это 32-битный тип в собственной системе байтов и представляет собой кодовые точки Unicode. Это не то же самое, что UTF-32
, поскольку UTF-32
обычно имеет метку порядка следования байтов (BOM), а когда ее нет, - с прямым порядком байтов. WCHAR_T
всегда с прямым порядком байтов.
Обратите внимание, что некоторые системы используют другую семантику для wchar_t
. Windows всегда использует 16-битный тип с прямым порядком байтов UTF-16. Если бы вы использовали GNU libiconv на этой платформе, кодировка WCHAR_T
была бы другой, чем если бы вы запускали ее на Linux.
Настройки локали не влияют на wchar_t
, поскольку размер wchar_t
должен быть известным во время компиляции и, следовательно, не может практически меняться в зависимости от локали.
Если этот фрагмент кода действительно приводит указатель на wchar_t
и использует его при вызове iconv
, тогда вам необходимо отрегулируйте код, чтобы использовать одну из кодировок UTF-16LE
, UTF-16BE
, UTF-32LE
или UTF-32BE
, в зависимости от sizeof(wchar_t)
и порядка байтов платформы. Эти кодировки не требуют (и не допускают) спецификации, и, если вы не используете PDP-11, одна из них будет правильной для вашей платформы.
Если вы получаете данные от другого source, то вам нужно выяснить, что это такое, и использовать для него соответствующую кодировку из списка выше. Вам также, вероятно, следует отправить патч вверх по течению и попросить сопровождающего использовать другую, более правильную кодировку для обработки их формата данных.