Windows API: ANSI и Широкосимвольные строки-это UTF8 или ASCII? UTF-16 или UCS-2 LE?

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

  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, который все равно не поможет с API Windows), также будут высоко оценены.

спасибо!

4 ответов


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

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

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

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

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

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

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

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

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

LPWSTR указатель wchar_t который всегда является 16-разрядным целым числом без знака в 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-битная кодировка, потому что я думаю, что это по существу так: кодировка без Юникода, которая хранится только для совместимости с устаревшими приложениями (Windows 9x). В западных системах это обычно Windows-1252, который является правильным надмножеством ASCII.


  1. * функции использовали активную кодовую страницу ANSI.

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

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

  4. LPWSTR-строка UTF-16, которая может быть или не быть null-terminated (см. MSDN)

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

  6. пути к файлам находятся в UTF-16. На самом деле весь текст UTF-16 внутренне в Windows.

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

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


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


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

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