Как моя программа может переключаться с ASCII на Unicode?

Я хочу написать программу на C ++, которая должна работать на Unix и Windows. Эта программа должна быть в состоянии использовать как: Unicode и не Unicode среды. Его поведение должно зависеть только от настроек среды.

Одна из приятных функций, которые я хочу иметь, - это манипулирование именами файлов, читаемыми из каталогов. Это может быть Unicode ... или нет.

Как проще всего этого добиться?

7
задан Szymon Lipiński 31 August 2010 в 21:25
поделиться

4 ответа

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

Затем всякий раз, когда вы читаете любой ввод, вы должны транскодировать из формата ввода во внутренний формат. Затем из внутреннего формата в выходной формат на выходе. Если вы используете один и тот же формат внутри и снаружи, это становится операцией идентификации.

UTF-8 отлично подходит для хранения и передачи, так как хорошо сжимается.
Но мне не нравится это как внутреннее представление, поскольку оно имеет переменную длину.

UTF-16: Предполагалось, что он станет спасителем всего человечества.
Но был быстро заменен UTF-32

UTF-32: исправлено. Поэтому отлично подходит для внутреннего представления и манипуляции.
Легко конвертировать в/из UTF-8.
Очень громоздкий (каждый символ занимает 4 байта).

Большинство операционных систем либо уже преобразовали в строковое представление UTF, либо движутся в этом направлении. Таким образом, использование внутреннего устаревшего формата, такого как ISO-8859, просто означает, что вызовы ОС вызовут дополнительную работу, поскольку строка преобразуется в/из UTF. В результате это кажется пустой тратой времени (для меня).

2
ответ дан 6 December 2019 в 15:16
поделиться

Лично я бы пошел другим путем.

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

Конкретная кодировка предназначена для облегчения обмена данными, однако, поскольку в Unix по умолчанию используется UTF-8, а в Windows — UTF-16, невозможно иметь универсальную кодировку. Поэтому я бы просто предложил использовать ваше собственное внутреннее представление и применить подходящее преобразование в зависимости от ОС, на которую вы ориентируетесь. Это связано с общим интерфейсом для необходимых вам функций и реализацией для каждой ОС/кодировки.

Также обратите внимание, что вы должны иметь возможность изменять кодирование/декодирование на лету, независимо от платформы, на которой вы работаете (например, вам может быть предложено использовать UTF-32 в Unix для определенного файла), еще одна причина НЕ использовать заданную кодировку.

Подводя итог:

  • ICU великолепен
  • если вы реализуете его самостоятельно и хотите быть несколько «стандартным», используйте UTF-32 (4 байта на точку)
  • если вы ограничены в памяти 21 бита (< 3 байта) достаточно для кодирования всех существующих точек

Преобразование может показаться «компьютерным», но:

  • вы можете выполнять его в потоковом режиме
  • это намного быстрее, чем ввод-вывод

Мои 2 кт, как говорится :)

1
ответ дан 6 December 2019 в 15:16
поделиться

Вы должны решить, какую кодировку Unicode вы хотите использовать, например, UTF-8, ISO-8859-1 и т. д. Затем вы должны принять это во внимание в своем С++ при всех ваших манипуляциях со строками. Например. взгляните на w_char и wstring. Я предполагаю, что в среде, отличной от Unicode, вы имеете в виду, что входные переменные будут только ascii?

1
ответ дан 6 December 2019 в 15:16
поделиться

Лучший способ, который я видел, это иметь 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"));. Я показал два способа создания строкового типа. Либо должно работать.

0
ответ дан 6 December 2019 в 15:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: