2008-09-25 5 views
10

У нас есть набор приложений, которые были разработаны для набора символов ASCII. Теперь мы пытаемся установить его в Исландии и сталкиваемся с проблемами, когда исландские персонажи напортачиваются.Как вы пишете код, безопасный для UTF-8?

Мы работаем над своими проблемами, но мне было интересно: есть ли там хороший «справочник» для написания кода на C++, который предназначен для 8-битных символов и который будет работать правильно, когда данные UTF-8 будут переданы Это?

Я не могу ожидать, что каждый прочитает весь стандарт Юникода, но если есть что-то более доступное для усвоения, я хотел бы поделиться им с командой, чтобы мы снова не сталкивались с этими проблемами.

Повторное создание всех приложений для использования wchar_t или другого строкового представления в настоящее время невозможно. Я также отмечу, что эти приложения обмениваются данными по сетям с серверами и устройствами, использующими 8-битные символы, поэтому, даже если бы мы сделали Unicode внутри, у нас все еще были бы проблемы с переводом на границах. По большей части эти приложения просто передают данные; они не «обрабатывают» текст каким-либо образом, кроме копирования его с места на место.

В качестве операционных систем используются Windows и Linux. Мы используем std :: string и простые старые строки C. (И не спрашивайте меня, чтобы защитить любого из проектных решений, я просто пытаюсь помочь исправить беспорядок..)


Вот список того, что было предложено:

+0

Не могли бы вы подтвердить нашу ОС вашего приложения? Вы программируете для Windows? Вы массово используете std :: string или более низкий уровень C header? – paercebal 2008-09-25 16:54:15

+0

Если вам нравится ответ, пожалуйста, поддержите его - нет причин быть скупой. – 2008-09-25 17:02:48

+0

Только 30 минут, и вы уже требуете повышения репутации? :) – 2008-09-25 17:15:56

ответ

-1

Вы можете использовать широкий гр символы (wchar_t вместо char и std :: wstring вместо std :: string). Это не позволяет автоматически решить 100% ваших проблем, но это хороший первый шаг.

Также используйте строковые функции, которые поддерживают Unicode (см. Документацию). Если что-то манипулирует широкими символами или строкой, обычно известно, что они широкие.

+0

Повторная запись всех приложений для использования различных представлений символов невозможна. – 2008-09-25 16:46:57

1

Имейте в виду, что полная юникода не помещается в 16bit символов; поэтому либо используйте 32-битные символы, либо кодирование с переменной шириной (наиболее популярным является UTF-8).

0

Исландский использует ISO Latin 1, поэтому должно быть достаточно восьми бит. Нам нужно больше деталей, чтобы выяснить, что происходит.

1

UTF-8 был разработан точно с учетом ваших проблем. Единственное, о чем я буду думать, это то, что ASCII - это действительно 7-битная кодировка, поэтому, если какая-либо часть вашей инфраструктуры использует 8-й бит для других целей, это может быть сложно.

10

Просто по большей части 8-битный. Тем не менее, вам нужно знать, что любой символ, отличный от ASCII, разбивается на несколько байтов, поэтому вы должны учитывать это, если текст или текст усечения для отображения.

UTF-8 имеет то преимущество, что вы всегда можете указать, где вы находитесь, в многобайтовом символе: если бит 7 установлен и бит 6 сброшен (байт равен 0x80-0xBF), это байтовый байт, а если бит 7 и 6 установлены, а 5 сбрасывается (0xC0-0xDF), это старший байт с одним байтом конца; если 7, 6 и 5 установлены, а 4 сбрасывается (0xE0-0xEF), это старший байт с двумя байтами и т. д. Количество последовательных битов, установленных на самом значимом бите, - это общее количество байтов, составляющих символ. То есть:

110x хххх = двухбайтовый символ
1110 хххх = три байта символов
1111 0ххх = четыре байта символов
т.д.

Исландский алфавит все содержащиеся в ISO 8859-1 и, следовательно, Windows-1252. Если это приложение в консольном режиме, имейте в виду, что консоль использует кодовые страницы IBM, поэтому (в зависимости от локали системы) она может отображаться в 437, 850 или 861. У Windows нет встроенной поддержки отображения для UTF-8; вы должны преобразовать в UTF-16 и использовать Unicode API.

Вызов SetConsoleCP и SetConsoleOutputCP, определяющий кодовую страницу 1252, поможет с вашей проблемой, если это приложение в консольном режиме. К сожалению, выбранный шрифт консоли должен быть шрифтом, который поддерживает кодовую страницу, и я не вижу способа установить шрифт. Стандартные растровые шрифты поддерживают только стандартную кодовую страницу OEM по умолчанию.

1

Возможно, вы захотите зарегистрироваться icu. У них могут быть доступные функции, которые облегчат работу с строками UTF-8.

0

Исландский, как французский, немецкий и большинство других языков Западной Европы, может поддерживаться с использованием 8-битного набора символов (CP1252 для Windows, ISO 8859-1, а также Latin1 on * x). Это был стандартный подход, прежде чем Unicode был изобретен, и по-прежнему довольно распространен. Как вы говорите, у вас есть ограничение, что вы не можете переписать приложение для использования wchar, и вам не нужно.

Не удивляйтесь, что UTF-8 вызывает проблемы; UTF-8 кодирует символы, отличные от ASCII (например, акцентированные латинские буквы, шип, эт и т. Д.), Как ДВА БЫТОВ каждый.

Единственный общий совет, который можно дать довольно простой (в теории): (1) решить, какой набор символов вы собираетесь поддерживать (Unicode, Latin1, CP1252, ...) в вашей системе (2), если вам предоставляются данные, закодированные каким-либо другим способом (например, UTF-8), затем перекодируйте его на свой стандарт (например, CP1252) на системной границе (3), если вам нужно предоставить данные, закодированные каким-либо другим способом.

 Смежные вопросы

  • Нет связанных вопросов^_^