Нужно ли мне использовать wstring в следующем случае? - PullRequest
1 голос
/ 16 марта 2010

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

  1. Я использую std :: ofstream file
  2. Я компилирую свое приложение в режиме MBCS, а не в Unicode.
  3. Я использую следующий код, чтобы преобразовать CString в std :: string и записать его в файл, используя ofstream

std::string Utils::ToString(CString& cString) {
    /* Will not work correctly, if we are compiled under unicode mode. */
    return (LPCTSTR)cString;
}

К моему удивлению. Это просто работает. Я думал, что мне нужно, по крайней мере, использовать wstring. Я пытаюсь провести расследование.

Вот сгенерированный MBCS.txt.

альтернативный текст http://sites.google.com/site/yanchengcheok/Home/stackoverflow0.PNG

  1. Я пытаюсь напечатать один символ с именем 脚 (его значение 0xBDC5)
  2. Когда я использую CString для переноса этого символа, его длина равна 2.
  3. Когда я использую Utils :: ToString для выполнения преобразования в std :: string, возвращаемая длина строки равна 2.
  4. Я пишу в файл, используя std :: ofstream

Мой вопрос:

  1. Когда я проверяю MBCS.txt с помощью шестнадцатеричного редактора, значение отображается как BD (LSB) и C5 (MSB). Но я использую машинку с прямым порядком байтов. Разве шестнадцатеричный редактор не должен показывать мне C5 (LSB) и BD (MSB)? Я проверяю из Википедии. GB2312, похоже, не имеет специфического порядка байтов.
  2. Кажется, что использование std :: string + CString просто отлично работает для моего случая. Могу ли я знать, в каком случае вышеуказанная методология не будет работать? а когда мне стоит начать использовать wstring?

1 Ответ

0 голосов
/ 16 марта 2010

Около 1. Порядковый номер - это проблема, с которой вы сталкиваетесь, когда сериализуете единицу в терминах меньших единиц (то есть сериализуете сейзеты в терминах октетов). Я далеко не специалист по кодированию CJK, но мне кажется, что GB2112 - это набор кодированных символов, который можно использовать с несколькими схемами кодирования. Схемы кодирования, указанные на странице википедии как используемые для GB2112 (ISO 2022, EUC-CN и HZ), определены в виде октетов. Таким образом, нет никакой проблемы с порядком байтов при сериализации в виде октетов.

Сравните это со схемами кодирования Unicode: UTF-8 определен в терминах октетов и не имеет проблемы с порядком байтов при сериализации в виде октетов, UTF-16 определяется в терминах сейсетов, и если сериализован как октеты, должен быть указан порядок байтов, UTF- 32 определяется в терминах 32-битных единиц, и если он сериализован как октеты, должен быть указан endianness.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...