Проблемы преобразования Unicode - PullRequest
0 голосов
/ 21 декабря 2011

Вот вопрос новичка по Unicode.Я использую Embarcadero C ++ Builder 2009, где они предположительно изменили строки по умолчанию для использования Unicode.

  • Я печатаю различные символы в моем редакторе исходного кода, которые не являются частью стандартного "7-битного"ASCII ".
  • Моя программа использует строковый тип C ++ Builder для извлечения пользовательского ввода.
  • Я также добавляю ввод вручную, устанавливая значение в wchar_t.

Казалось бы, существуют конфликты в интерпретации символов.Иногда я получаю символ, например, с кодом 0x00C7 ('Ç'), но иногда тот же символ кодируется как 0xFFC7, например, в редакторе исходного кода.Насколько я понимаю, первый - это правильный Unicode, а второй - «что-то другое».Кто-нибудь может это подтвердить?

Интересно, откуда взялась эта «что-то еще» кодировка и как от нее избавиться?

РЕДАКТИРОВАТЬ: Дальнейшее исследование: кажется, что единственное место, где появляется кодировка 0xFF **, это когда я делаю что-то вроде этого:

string str = ...;
wchar_t wch = (wchar_t)str[i];

Тот же результат, независимо от того, является ли он std ::строка или строка VCL.wchar_t не то же самое, что Unicode?

Ответы [ 2 ]

4 голосов
/ 21 декабря 2011

Я предполагаю, что проблема в том, что в вашем компиляторе char подписано (стандарт позволяет ему быть либо подписанным, либо беззнаковым, это определяется реализацией / специфично). Таким образом, всякий раз, когда вы конвертируете символы с битом 7, установленным в 1 (от 0x80 до 0xFF), в любой больший целочисленный тип, он обрабатывается как отрицательное значение и расширяется до знака, чтобы сохранить отрицательное значение, или, другими словами, это бит 7 копируется в бит 8, бит 9 и т. д. во все старшие биты большего целочисленного типа. Таким образом, 0xC7 может превратиться в 0xFFC7 и 0xFFFFFFC7. Чтобы этого не случилось, сначала приведите chars к unsigned chars.

1 голос
/ 21 декабря 2011

Тип широких символов w_type определяется реализацией и не должен соответствовать концепции символа Unicode.Посмотрите описание w_type в стандарте Unicode .

Если «Ç» изменено на 0xFFC7, оно очень похоже на расширение знака, то есть символ внутренне сохраняется как байт 0xC7, которыйзатем берется как 8-разрядное целое число со знаком и преобразуется в 16-разрядное целое число с расширением знака.

...