Разработка приложения для использования UTF-8 или UTF-16 - PullRequest
3 голосов
/ 22 января 2012

Я занимаюсь разработкой приложения, которое будет в основном использоваться английскими и испанскими читателями. Однако в будущем я хотел бы иметь возможность поддерживать более расширенные языки, такие как японский. Размышляя о дизайне программы, я столкнулся со стеной в UTF-8 против UTF-16 против многобайтовых. Я хотел бы скомпилировать свою программу для поддержки UTF-8 или UTF-16 (для случаев, когда используются такие языки, как китайский). Чтобы это произошло, я думал, что у меня должно быть что-то вроде

#if _UTF8
typedef char char_type;
#elif _UTF16
typedef unsigned short char_type;
#else
#error
#endif

Таким образом, в будущем, когда я использую UTF-16, я могу переключать #define (и, конечно, иметь такой же тип # if / # endif для таких вещей, как sprintf и т. Д.). У меня есть свой собственный строковый тип, так что я бы тоже использовал этот случай.

Будет ли считаться «плохой идеей» замена каждого использования только одного использования «char» моим «char_type» с использованием сценария, упомянутого выше? Если так, то почему это считается плохой идеей и как я могу достичь того, что упомянул выше?

Причина, по которой я хотел бы использовать одно или другое, связана с эффективностью памяти. Я бы предпочел не использовать UTF-16 все время, если я его не использую.

Ответы [ 3 ]

5 голосов
/ 22 января 2012

UTF-8 может представлять каждый символ Unicode.Если ваше приложение должным образом поддерживает UTF-8, вы любите любой язык.

Обратите внимание, что родные элементы управления Windows не имеют API-интерфейсов для установки текста UTF-8, если вы пишете приложение для Windows.Тем не менее, легко создать приложение, которое использует UTF-8 для внутренних целей и конвертирует UTF-8 -> UTF-16 при настройке текста в Windows, и конвертирует UTF-16 -> UTF-8 при получении текста из Windows.Я сделал это, и это сработало потрясающе и было НАМНОГО лучше, чем написание приложения WCHAR.Преобразовать UTF-8 <-> 16 тривиально;В Windows есть API для этого, или вы можете найти простую (одну страницу) функцию, чтобы сделать это в вашем собственном коде.

2 голосов
/ 22 января 2012

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

Возможно, вы захотите взглянуть на это обсуждение: https://softwareengineering.stackexchange.com/questions/102205/should-utf-16-be-considered-harmful, чтобы узнать о преимуществах различных типов популярных кодировок.

0 голосов
/ 24 января 2012

По сути, это то, что Windows делает с TCHAR (за исключением того, что Windows API интерпретирует char как кодовую страницу "ANSI" вместо UTF-8).

Я думаю, что это плохая идея.

...