Я хочу написать программу на C ++, которая должна работать на Unix и Windows. Эта программа должна быть в состоянии использовать как: Unicode и не Unicode среды. Его поведение должно зависеть только от настроек среды.
Одна из приятных функций, которые я хочу иметь, - это манипулирование именами файлов, читаемыми из каталогов. Это может быть Unicode ... или нет.
Как проще всего этого добиться?
Вы должны решить, как вы представляете текст внутри.
Это должно быть постоянным независимо от того, что еще вы выберете.
Затем всякий раз, когда вы читаете любой ввод, вы должны транскодировать из формата ввода во внутренний формат. Затем из внутреннего формата в выходной формат на выходе. Если вы используете один и тот же формат внутри и снаружи, это становится операцией идентификации.
UTF-8 отлично подходит для хранения и передачи, так как хорошо сжимается.
Но мне не нравится это как внутреннее представление, поскольку оно имеет переменную длину.
UTF-16: Предполагалось, что он станет спасителем всего человечества.
Но был быстро заменен UTF-32
UTF-32: исправлено. Поэтому отлично подходит для внутреннего представления и манипуляции.
Легко конвертировать в/из UTF-8.
Очень громоздкий (каждый символ занимает 4 байта).
Большинство операционных систем либо уже преобразовали в строковое представление UTF, либо движутся в этом направлении. Таким образом, использование внутреннего устаревшего формата, такого как ISO-8859, просто означает, что вызовы ОС вызовут дополнительную работу, поскольку строка преобразуется в/из UTF. В результате это кажется пустой тратой времени (для меня).
Лично я бы пошел другим путем.
Какой бы формат вы ни выбрали, он должен поддерживать Unicode, это само собой разумеющееся. Однако вы, конечно, не должны ограничиваться использованием существующей кодировки.
Конкретная кодировка предназначена для облегчения обмена данными, однако, поскольку в Unix по умолчанию используется UTF-8, а в Windows — UTF-16, невозможно иметь универсальную кодировку. Поэтому я бы просто предложил использовать ваше собственное внутреннее представление и применить подходящее преобразование в зависимости от ОС, на которую вы ориентируетесь. Это связано с общим интерфейсом для необходимых вам функций и реализацией для каждой ОС/кодировки.
Также обратите внимание, что вы должны иметь возможность изменять кодирование/декодирование на лету, независимо от платформы, на которой вы работаете (например, вам может быть предложено использовать UTF-32 в Unix для определенного файла), еще одна причина НЕ использовать заданную кодировку.
Подводя итог:
ICU
великолепен Преобразование может показаться «компьютерным», но:
Мои 2 кт, как говорится :)
Вы должны решить, какую кодировку Unicode вы хотите использовать, например, UTF-8, ISO-8859-1 и т. д. Затем вы должны принять это во внимание в своем С++ при всех ваших манипуляциях со строками. Например. взгляните на w_char и wstring. Я предполагаю, что в среде, отличной от Unicode, вы имеете в виду, что входные переменные будут только ascii?
Лучший способ, который я видел, это иметь typedef
и очень мало макросов, определенных на основе условной компиляции. Например:
#ifdef UNICODE
#define mychar wchar_t
#define s(a) L ## a
typedef std::wstring mystringa;
#else
#define mychar char
#define s(a) a
typedef std::string mystringa;
#endif
typedef std::basic_string<mychar> mystringb;
и так далее. Затем вы должны использовать строки как s("foo")
и mystringa(s("foo"));
. Я показал два способа создания строкового типа. Либо должно работать.