Итак, я наконец вернулся к своей основной задаче - портировал довольно большой проект на С++ из Windows в Mac.
Сразу же я попал в проблему, когда wchar_t - 16 бит в Windows, но 32-бит на Mac. Это проблема, потому что все строки представлены wchar_t, и будут выполняться строковые данные между машинами Windows и Mac (как в виде данных на диске, так и в виде сетевых данных). Из-за того, как он работает, было бы не совсем просто преобразовать строки в какой-то общий формат перед отправкой и получением данных.
В последнее время мы действительно начали поддерживать гораздо больше языков, поэтому мы начинаем работать с множеством данных Unicode (а также с языками справа налево).
Теперь я мог бы объединить несколько идей здесь и вызвать больше проблем для себя, чем нужно, поэтому я задаю этот вопрос. Мы думаем, что сохранение всех наших данных в памяти, как UTF-8, имеет большой смысл. Это решает проблему wchar_t с разными размерами, это означает, что мы можем легко поддерживать несколько языков, а также значительно уменьшать наш объем памяти (у нас есть большая часть - в основном, на английском языке) - но это не похоже на то, что многие люди делают это. Что-то нам не хватает? Там очевидная проблема, с которой вам приходится иметь дело, где длина строки может быть меньше размера памяти, хранящей эти строковые данные.
Или использует UTF-16 лучше? Или мы должны придерживаться wchar_t и писать код для преобразования между wchar_t и, скажем, Unicode в местах, где мы читаем/записываем на диск или в сеть?
Я понимаю, что это опасно близко к запросам мнений - но мы нервничаем, что упускаем из виду что-то очевидное, потому что не похоже, что есть много классов строк Unicode (например) - но все же есть много кода для преобразования в/из Юникода, например, в boost:: locale, iconv, utf-cpp и ICU.