wxWidgets и Unicode - PullRequest
       4

wxWidgets и Unicode

0 голосов
/ 02 января 2011

Я хочу использовать корейский перевод в моем довольно большом приложении wxwidgets. Приложение использует платформу перевода wxwidgets, основанную на gettext.

У меня есть рабочие переводы на французский, немецкий и русский. Я все равно хочу использовать Unicode, но мой первый вопрос:

  1. нужна ли моему приложению поддержка юникода для отображения корейского и японского языков?

  2. Если это так, - просто для интереса - почему русский язык работает без, так как он имеет кириллицу?

  3. У меня есть тысячи строковых литералов. Должен ли я ставить перед каждым из них букву «L»? (wxString foo ("foo") -> wxString foo (L "foo"))

  4. если это так, кто-то создал сценарий regex, sed или perl, чтобы сделать это в ок. 500 .cpp файлов? (пожалуйста! =))

  5. Изменится ли это в wxWidgets 3.0?

  6. Общие вопросы по Unicode: я использую эти строковые литералы во многих описательных и многих технических целях ... как отображаемый текст, а также части шейдеров GLSL и XML. Эти API имеют char * / const char * в качестве аргументов функции, поэтому мое внутреннее представление wxString не должно иметь значения в этих областях. Теория и практика: правда ли это? Кто-нибудь может поделиться опытом?

  7. Я занимаюсь какой-либо обработкой текста (сравнение, поиск строк и т. Д.) - есть ли логические различия между юникодом и ansi?

  8. Есть ли какое-либо замечаемое влияние на производительность при использовании Unicode?

Спасибо! Венди

Ответы [ 3 ]

2 голосов
/ 02 января 2011
  1. На http://www.wxwidgets.org/about/i18n.php есть корейский .po файл для собственных строк wxWidget. Если ваше приложение правильно отображает собственные строки wxWidget при использовании этого файла, ему не требуется поддержка Unicode для отображения корейского и японского языков.
  2. ISO-8859-5 - это 8-битный набор символов с кириллическими буквами.
  3. Только если 1. не дает правильного результата. Но если вы хотите перевести строку, вы должны были использовать _ () .
  4. Я не знаю.
  5. wxWidgets 3.0 не будет иметь отдельных сборок Unicode и ANSI. 2.9.1 тоже не имеет.
  6. Это зависит от того, как вы используете аргументы. C- и C ++ - функции обычно работают с представлением строк и не знают какой-либо конкретной кодировки символов. В частности, то, что вы считаете персонажем, и то, что программа считает персонажем, может быть разными вещами.
  7. См. 6.
  8. Я не знаю, но многие наборы инструментов используют UTF-16 или UTF-32 вместо UTF-8, потому что эти схемы проще. Это компромисс между скоростью и размером.
2 голосов
/ 02 января 2011

Обращаясь к некоторым вашим вопросам ...

  • нужна ли моему приложению поддержка юникода для отображения корейского и японского языков?
  • Если это так, - просто для интереса - почему русский работает без, так как у них есть кириллический набор букв?

Русский вписывается в однобайтовую кодировку, как и западноевропейские языки (хотя это другая кодировка). Корейский и японский (и китайский) нет. Есть много обходных путей для этого, но самый элегантный из известных мне на сегодняшний день - это использование Unicode, чтобы вам не нужно было перестраивать приложение для каждой локали; просто измените каталог сообщений.

  • Общий вопрос по Юникоду: я использую эти строковые литералы во многих описательных и во многих технических отношениях ... в качестве отображаемого текста, а также частей шейдеров GLSL и XML. Эти API имеют char * / const char * в качестве аргументов функции, поэтому мое внутреннее представление wxString не должно иметь значения в этих областях. Теория и практика: правда ли это? Кто-нибудь может поделиться опытом?

Только строки, которые будут показаны (не технически) пользователям, должны быть локализованы, поэтому они единственные, которые должны быть в Unicode. Наиболее распространенным подходом является использование UTF-8 (который является особым способом кодирования Unicode), поскольку это означает, что строки ASCII - наиболее распространенный тип, передаваемый внутри программ - абсолютно одинаковы, что значительно упрощает работу. Недостатком является то, что у вас больше нет дешевого индексирования в строке, поскольку не все символы имеют одинаковое количество байтов в длину. Это может быть что угодно, от не проблема до правильного королевского препятствия PITA, в зависимости от того, что делает программа.

  • Я занимаюсь какой-либо обработкой текста (сравнение, поиск строк и т. Д.) - есть ли логические различия между юникодом и ansi?

Сравнения работают нормально, как и простой поиск строк. Другие операции (например, получение 20 th символа строки или определение количества символов в строке, которые вы нашли в подстроке) являются неприятными, поскольку у вас нет постоянной ширины символов. Гадость может быть уменьшена с помощью широких символов, но их менее удобно использовать для внешних данных (они создают потенциальные проблемы с порядком байтов, если вы не начнете работать с метками порядка байтов, и это совсем другое дело).

  • Есть ли какое-либо ремаркируемое влияние на производительность при использовании Unicode?

Зависит от того, что именно вы делаете. С UTF-8, если вы в основном имеете дело с текстом ASCII, то у вас очень мало проблем с производительностью для большинства операций. С широкими символами вы тратите больше памяти на каждый символ, что, естественно, влияет на производительность (но это может быть приемлемо, поскольку это означает, что у вас есть индексирование с постоянным временем).

0 голосов
/ 03 января 2011

1.Приходится ли моему приложению поддержка юникода для отображения корейского и японского языков?

Благодаря Освальду я узнал, что вы можете получить перевод на корейский язык без использования юникода в своих wxwidgetsприложение.Измените (по крайней мере под Windows) настройки для программ, не поддерживающих Юникод.Но мне все еще нужно проверить, достаточно ли этого для всего приложения.

3.У меня есть тысячи строковых литералов.Должен ли я ставить перед каждым из них букву «L»?(wxString foo ("foo") -> wxString foo (L "foo"))

Если вам нужно использовать юникод с wxwidgets до 3.0, вам нужно.Но не используйте 'L' в wxwidgets, используйте wxT ("foo")

4.if так, если кто-то создал скрипт regex, sed или perl, чтобы сделать это в ca.500 .cpp файлов?

Я сделал хотя бы поиск и замену в Visual Studio:

Search: {"([^"]*)"}
Replace: wxT(\1)

Но будьте осторожны!Заменит все строковые литералы, #include "file.h" на #include wxT ("file.h")

  1. Будет ли это изменение в wxWidgets 3.0?

Да.См. Ответ / цитата выше.

...