Как я могу использовать wstring (s) в Linux API? - PullRequest
4 голосов
/ 04 сентября 2011

Я хочу разработать приложение в Linux. Я хочу использовать wstring, потому что мое приложение должно поддерживать Unicode, и я не хочу использовать строки UTF-8.

В ОС Windows использовать wstring легко. Поскольку любой ANSI API имеет форму Unicode. например, есть два API CreateProcess, первый API это CreateProcessA, а второй API CreateProcessW.

wstring app = L"C:\\test.exe";
CreateProcess
(
  app.c_str(), // EASY!
  ....
);

Но, похоже, работать с wstring в Linux сложно! например, в Linux есть API под названием parport_open (это просто пример).

и я не знаю, как отправить мою wstring в этот API (или такие API, как parport_open, которые принимают строковый параметр).

wstring name = L"myname";
parport_open
(
  0, // or a valid number. It is not important in this question.
  name.c_str(), // Error: because type of this parameter is char* not wchat_t*
  ....
);

У меня вопрос, как я могу использовать wstring в API Linux?

Примечание : я не хочу использовать строки UTF-8.

Спасибо

Ответы [ 2 ]

3 голосов
/ 04 сентября 2011

Linux API (в последних ядрах и с правильной настройкой локали) почти во всех дистрибутивах по умолчанию используют строки UTF-8 1 .Вы тоже должны использовать их внутри своего кода.Сопротивление бесполезно.

wchar_t (и, следовательно, wstring) в Windows были удобны, только когда Unicode был ограничен 65536 символами (то есть wchar_t использовалось для UCS-2), теперь, когда 16-битные Windows wchar_t используются для UTF-16. Преимущество 1 wchar_t = 1 символа Юникод давно исчезло, поэтому у вас есть те же недостатки использования UTF-8.На сегодняшний день ИМХО подход Linux является наиболее правильным.( Другой мой ответ по UTF-16 и почему Windows и Java используют его )

Кстати, и string, и wstring не поддерживают кодирование, так что выне может надежно использовать любой из этих двух для манипулирования кодовыми точками Unicode.Я слышал, что wxString из инструментария wxWidgets прекрасно справляется с UTF-8, но я никогда не проводил обширных исследований по этому поводу.

  1. на самом деле, как указано ниже, ядро ​​стремится быть независимым от кодирования, то есть обрабатывает строки как непрозрачные последовательности байтов (с NUL-завершением?) (И именно поэтому кодировки, которые используют "большие" типы символовкак UTF-16 не может быть использован).С другой стороны, где бы ни выполнялось фактическое манипулирование строками, используется текущая настройка локали, и по умолчанию почти во всех современных дистрибутивах Linux она установлена ​​на UTF-8 (что для меня приемлемо по умолчанию).
0 голосов
/ 04 сентября 2011

Я не хочу использовать строки UTF-8.

Что ж, вам нужно преодолеть это нежелание, по крайней мере, при вызове API.Linux использует однобайтовые кодировки строк, неизменно UTF-8.Очевидно, что вы должны использовать однобайтовый строковый тип, поскольку вы явно не можете передавать широкие символы в функцию, которая ожидает char*.Используйте string вместо wstring.

...