Windows API: ANSI и строки широких символов - это UTF8 или ASCII? UTF-16 или UCS-2 LE? - PullRequest
31 голосов
/ 04 января 2011

Я не совсем профессионал с кодировками, но вот что, я думаю, я знаю (хотя это может быть неправильно):

  1. ASCII - это 7-битное кодирование фиксированной длины ссимволы, которые можно найти в диаграммах ASCII.
  2. UTF8 - это 8-битное кодирование переменной длины.Все символы могут быть записаны в UTF8.
  3. UCS-2 LE / BE - это 16-битные кодировки фиксированной длины, поддерживающие наиболее распространенные символы.
  4. UTF-16 является 16-битным,кодирование переменной длины.Все символы могут быть написаны в UTF16.

Являются ли эти символы выше всех правильными?

Теперь по вопросам:

  1. У Windows "A"функции (например, SetWindowTextA) принимают строки ASCII?Или "многобайтовые строки" (дополнительные вопросы по этому вопросу приведены ниже)?
  2. Функции Windows "W" принимают строки UTF-16 или строки UCS-2?Я думал, что они используют UCS-2, но имена меня смущают.
  3. В WideCharToMultiByte Microsoft использует слово «строка широких символов» для обозначения UTF-16.В таком контексте, что тогда считается «многобайтовой строкой»?UTF-8?
  4. Является ли LPWSTR "строкой широких символов"?Я бы сказал, что это так, но не значит ли это, что это UTF-16?И не значит ли это, что его можно использовать для отображения, скажем, 4-байтовых символов?Если нет, то ... отображение 4-байтовых символов невозможно?(Похоже, в Windows нет API-интерфейсов для них.)
  5. Является ли функциональность WideCharToMultiByte надмножеством функциональности wcstombs, и работают ли они оба на одном и том же типе строки?Или один, скажем, работает на UTF-16, в то время как другой работает на UCS-2?
  6. Являются ли пути к файлам в UTF-16 или UCS-2?Я знаю, что Windows рассматривает его как «непрозрачный массив символов» из документации Microsoft, но согласно стандарту C для таких функций, как fwprintf, существует ли какая-либо стандартизированная кодировка?
  7. Что такое кодировка «ANSI»?Это даже правильный термин?И как это связано с ASCII?
  8. (у меня было больше вопросов, но этого достаточно ... Я все равно забыл некоторые из них ...)

Это многовопросов, так что любые ссылки на объяснения о том, как все они соединяются (кроме чтения стандарта Unicode, который в любом случае не поможет с Windows API), также будут высоко оценены.

Спасибо!

Ответы [ 4 ]

27 голосов
/ 06 января 2011

Правильно ли это прежде всего?

Да, если вы не предполагаете существование символов, не закодированных в Unicode (для большинства практических приложений это предположение подойдет).

Функции Windows "A" (например, SetWindowTextA) принимают в строках ASCII?Или "многобайтовые строки" (дополнительные вопросы по этому вопросу приведены ниже)?

Они принимают байтовые строки (т. Е. Строки, кодовая единица которых является байтом, который всегда является октетом в Windows), закодированные втекущая кодировка "ANSI" / MBCS / legacy.«ANSI» - это исторические термины для этих кодировок, но не правильные.Для западных систем Windows это обычно кодировка Windows-1252.

Функции "W" Windows принимают строки UTF-16 или UCS-2?Я думал, что они используют UCS-2, но имена меня смущают.

Начиная с Windows 2000, большинство из них поддерживают UTF-16.Название «широкий» и остальная часть терминологии Microsoft (например, «Unicode», означающий «UTF-16» или «UCS») были выбраны до того, как современный стандарт Unicode унифицировал терминологию.

ВWideCharToMultiByte, Microsoft использует слово «строка широких символов» для обозначения UTF-16.В таком контексте, что тогда считается «многобайтовой строкой»?UTF-8?

Любая другая кодировка, поддерживаемая WideCharToMultiByte, в этом контексте является «многобайтовой кодировкой», включая Windows-1251 и UTF-8.

Является ли LPWSTR "строкой широких символов"?Я бы сказал, что это так, но не значит ли это, что это UTF-16?И не значит ли это, что его можно использовать для отображения, скажем, 4-байтовых символов?Если нет, то ... отображение 4-байтовых символов невозможно?(Похоже, в Windows нет API для них.)

LPWSTR - это указатель на wchar_t, который всегда является 16-разрядным целым числом без знака в Windows.Какие символы могут отображаться, не связано с кодировкой, если эта кодировка может кодировать все символы Unicode.Windows обычно может отображать символы, отличные от BMP, но не везде (например, консоль не может).

Является ли функциональность WideCharToMultiByte надмножеством функций wcstombs, и оба они работают натакой же тип строки?Или один, скажем, работает на UTF-16, в то время как другой работает на UCS-2?

Не знаю, но я не думаю, что они сильно отличаются.Я полагаю, вы просто пытаетесь преобразовать не-BMP символ в UTF-8 и посмотрите, верен ли результат.

Являются ли пути к файлам в UTF-16 или UCS-2?Я знаю, что Windows рассматривает его как «непрозрачный массив символов» из документации Microsoft, но согласно стандарту C для таких функций, как fwprintf, существует ли какая-либо стандартизированная кодировка?

Пути к файлам действительно являются непрозрачными массивами UTF-16 символов, что означает, что Windows не выполняет никакого перевода при сохранении или чтении имен файлов (например, Linux и в отличие от Mac OS X).Но Windows по-прежнему имеет свое странное, в основном неопределенное, нечувствительное к регистру поведение, которое вызывает много проблем, потому что имена файлов, которые рассматриваются как эквивалентные, не обязательно равны.Это ломает много инвариантов;например, в Linux без вмешательства других потоков, если вы успешно создадите два файла A и a в некотором каталоге, вы получите два отдельных файла, в то время как в Windows вы получите только один файл (и вообще, непредсказуемое количество файлов).

Что такое кодировка "ANSI"?Это даже правильный термин?И как это связано с ASCII?

ANSI - американская организация по стандартизации.Использование этого слова при обращении к кодировкам является неправильным, но часто встречающимся, поэтому вы должны знать об этом.Я предпочитаю термин устаревшая 8-битная кодировка , потому что я думаю, что это, по сути, то, что это такое: кодировка не-Unicode, которая сохраняется только для совместимости с устаревшими (Windows 9x) приложениями.В западных системах это обычно Windows-1252, который является надлежащим расширенным набором ASCII.

7 голосов
/ 04 января 2011
  1. * Функции используют активную кодовую страницу ANSI.

  2. * Функция W использует UTF-16.

  3. Многобайтный относится ко всему, что передается в параметре CodePage.Обычно это активная кодовая страница ANSI или UTF-8.

  4. LPWSTR - это строка UTF-16, которая может заканчиваться или не заканчиваться нулем (см. MSDN )

  5. Я ничего не знаю о wcstombs, я всегда использую WideCharToMultiByte.

  6. Пути к файлам в UTF-16.Фактически весь текст в Windows - это UTF-16.

  7. Для кодирования ANSI вам необходимо ознакомиться с этим более подробно.Вы могли бы сделать хуже, чем начать с Википедии и перейти по ссылкам оттуда.

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

5 голосов
/ 06 января 2011

Широкие струны раньше были UCS-2.В Windows 2000 широкие строки - это UTF-16.Полезно знать, нужно ли вам поддерживать какую-то старую устаревшую систему.

1 голос
/ 04 января 2011

Прежде всего, вы найдете много информации в этой теме .

ASCII - это кодировка, а не кодировка. Теперь есть несколько 8-битных кодировок, одна из которых установлена ​​по умолчанию в системе (вы можете изменить это в региональных настройках). * Функции принимают 8-битные символы в этой кодировке. UTF-8 - это не кодировка, а кодировка кодировки Unicode. * W функции, как я понимаю, используют UTF-16, а не UCS-2.

...