C ++: заставить мой проект поддерживать Unicode - PullRequest
7 голосов
/ 13 марта 2011

Мой проект на C ++ в настоящее время занимает около 16K строк кода, и я признаю, что вообще не думал о поддержке юникода.

Все, что я сделал, это пользовательский typedef для std::string как String и переход к кодированию.

Я никогда не работал с юникодом в написанных мною программах.

  • Насколько сложно сейчас переключить мой проект на Unicode? Это даже хорошая идея?

  • Можно ли просто переключиться на std::wchar без особых проблем?

Ответы [ 3 ]

7 голосов
/ 13 марта 2011

Вероятно, наиболее важной частью создания приложения, поддерживающего Unicode, является отслеживание кодировки ваших строк и обеспечение того, чтобы ваши публичные интерфейсы были хорошо определены и просты в использовании с кодировками, которые вы хотите использовать.

Переключение на более широкий символ (в c ++ wchar_t) не обязательно является правильным решением. На самом деле, я бы сказал, что обычно это не самое простое решение. Некоторые приложения могут сойти с рук, указав, что все строки и интерфейсы используют UTF-8 и вообще не нуждаются в изменении. std::string вполне может использоваться для строк в кодировке UTF-8.

Однако, если вам нужно интерпретировать символы в строке или интерфейсе с интерфейсами, отличными от UTF-8, вам придется проделать больше работы, но, не зная больше о вашем приложении, невозможно порекомендовать единственный лучший подход.

2 голосов
/ 13 марта 2011

Есть некоторые проблемы с использованием std::wstring.Если ваше приложение будет хранить текст в Unicode, и оно будет работать на разных платформах, у вас могут возникнуть проблемы.std::wstring зависит от wchar_t, который зависит от компилятора.В Microsoft Visual C ++ этот тип имеет ширину 16 бит и поэтому будет поддерживать только кодировки UTF-16.Компилятор GNU C ++ указывает, что этот тип имеет ширину 32 бита, и поэтому будет поддерживать только кодировки UTF-32.Если вы затем сохраните текст в файле из одной системы (например, Windows / VC ++), а затем прочитаете файл из другой системы (Linux / GCC), вам придется подготовиться к этому (в этом случае конвертировать из UTF-16 вUTF-32).

1 голос
/ 15 марта 2011

Могу ли я просто переключиться на [std::wchar_t] без каких-либо серьезных проблем?

Нет, это не так просто.

  • Кодировкаwchar_t строка зависит от платформы.Windows использует UTF-16.Linux обычно использует UTF-32.(C ++ 0x уменьшит эту разницу, введя отдельные типы char16_t и char32_t.)
  • Если вам требуется поддержка Unix-подобных систем, у вас нет всех функций UTF-16, которыеWindows есть, так что вам нужно написать свои _wfopen и т. Д.
  • Используете ли вы какие-либо сторонние библиотеки? они поддерживают wchar_t?
  • Хотя широкие символы обычно используются для представления в памяти, на диске и в Интернете форматы намного с большей вероятностью будет в кодировке UTF-8 (или в другом кодировании на основе char), чем в UTF-16/32.Вам придется конвертировать их.
  • Вы не можете просто искать и заменять char на wchar_t, потому что C ++ смешивает «символ» и «байт», и вы должны определить, какой char s - это символы, а char s - байты.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...