Кросс-платформенные строки (и Unicode) в C ++

Итак, я наконец вернулся к своей основной задаче - переносу довольно большого проекта C ++ из Windows в Mac.

Прямо сейчас я ' Мы столкнулись с проблемой, когда wchar_t является 16-битным в Windows, но 32-битным в Mac. Это проблема, потому что все строки представлены wchar_t, и между компьютерами Windows и Mac будут передаваться строковые данные (как в форме данных на диске, так и в форме сетевых данных). Из-за того, как это работает, было бы непросто преобразовать строки в какой-то общий формат перед отправкой и получением данных.

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

Теперь я мог бы объединить здесь несколько идей и вызвать для себя больше проблем, чем необходимо, поэтому я задавая этот вопрос. Мы' Мы думаем, что хранение всех наших строковых данных в памяти как UTF-8 имеет большой смысл. Это решает проблему wchar_t, являющуюся разным размером, это означает, что мы можем легко поддерживать несколько языков, а также значительно сокращает объем нашей памяти (у нас загружено МНОГО - в основном английских - строк) - но не похоже, что многие люди делают этот. Что-то нам не хватает? Существует очевидная проблема, с которой вам приходится иметь дело, когда длина строки может быть меньше, чем размер памяти, в которой хранятся эти строковые данные.

Или использование UTF-16 - лучшая идея? Или мы должны придерживаться wchar_t и писать код для преобразования между wchar_t и, скажем, Unicode в местах, где мы читаем / записываем на диск или в сеть?

Я понимаю, что это опасно близко к тому, чтобы запрашивать мнение - но мы нервничаем, что мы re упускает из виду что-то очевидное, потому что не похоже, что существует много строковых классов Unicode (например), но все же есть много кода для преобразования в / из Unicode, например, в boost :: locale, iconv, utf-cpp и ICU.

12
задан user438380 12 November 2010 в 23:27
поделиться