Windows API: ANSI и широкохарактерные строки-это UTF8 или ASCII? UTF-16 или UCS-2 LE?

StackOverflow https://stackoverflow.com/questions/4592261

Вопрос

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

  1. ASCII-это 7-битная кодировка с фиксированной длиной, с персонажами, которые вы можете найти в диаграммах ASCII.
  2. UTF8-это 8-битное кодирование с переменной длиной. Все персонажи могут быть написаны в UTF8.
  3. UCS-2 LE/BE-16-битные 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), также будут высоко оценены.

Благодарю вас!

Это было полезно?

Решение

Это все, все правильно?

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

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

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

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

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top