Использование iconv с WCHAR_T на Linux - PullRequest
0 голосов
/ 27 мая 2020

У меня есть следующий код на Linux: -

rc = iconv_open("WCHAR_T", SourceCode);

до использования iconv для преобразования данных в строку широких символов (wchar_t).

Я пытаясь понять, чего он достигает, чтобы перенести его на платформу, где параметр 1, "WCHAR_T", не существует.

Это приводит к таким подвопросам, как:

  • Есть ли единственное представление wchar_t на Linux?
  • Какую кодовую страницу это использует? Я представляю, может быть, UTF-32
  • Использует ли он какие-либо настройки локали для достижения этой цели?

Я надеюсь на ответ, который говорит что-то вроде: «Код, который вы показываете, сокращение для выполнения следующих двух действий вместо этого .... "и тогда я мог бы сделать эти два шага вместо сокращения на платформе, где опция "WCHAR_T" для iconv_open не существует.

1 Ответ

0 голосов
/ 27 мая 2020

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

...