Windows API: ANSI и широкохарактерные строки-это UTF8 или ASCII? UTF-16 или UCS-2 LE?
-
15-10-2019 - |
Вопрос
Я не совсем профессионал с кодировками, но вот что я думаю (хотя это может быть неправильно):
- ASCII-это 7-битная кодировка с фиксированной длиной, с персонажами, которые вы можете найти в диаграммах ASCII.
- UTF8-это 8-битное кодирование с переменной длиной. Все персонажи могут быть написаны в UTF8.
- UCS-2 LE/BE-16-битные 16-битные кодирования, которые поддерживают наиболее распространенные символы.
- UTF-16-16-битная кодировка переменной длины. Все персонажи могут быть написаны в UTF16.
Это все, все правильно?
Теперь по вопросам:
- Делать функции Windows "A" (например
SetWindowTextA
) Возьмите строки ASCII? Или «много-байтовые строки» (больше вопросов по этому поводу ниже)? - Возникают ли функции Windows «W» строки UTF-16 или строки UCS-2? Я думал, что они принимают в UCS-2, но имена меня смущают.
- В Widechartomultibyte, Microsoft использует слово «широкомасштабная строка», чтобы означать UTF-16. В этом контексте то, что считается «мульти-байтовой строкой»? UTF-8?
- Является
LPWSTR
«Широко-характерная строка»? Я бы сказал, что это так, но тогда ли это значит, что это UTF-16? И разве это не означает, что его можно использовать для отображения, скажем, 4-байтовых символов? Если нет, то ... отображение 4-байтовых символов невозможно? (Windows, похоже, не имеет API для них.) - Это функциональность
WideCharToMultiByte
суперсетwcstombs
, И они оба работают на одном типе строки? Или один, скажем, работает над UTF-16, в то время как другой работает на UCS-2? - Являются ли файловые пути в UTF-16 или UCS-2? Я знаю, что Windows рассматривает его как «непрозрачный массив символов» из документации Microsoft, но согласно стандарту C для таких функций, как
fwprintf
, есть ли стандартизированная кодировка? - Что такое кодирование "ANSI"? Это даже правильный термин? И как это связано с ASCII?
- (У меня было больше вопросов, но этого достаточно ... Я все равно забыл некоторые из них ...)
Это много вопросов, поэтому любые ссылки на объяснения о том, как все это соединяется (помимо чтения стандарта 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.
Другие советы
*В функциях использовалась активная кода ANSI.
*W Функция Использование UTF-16.
Мультибайт относится к тому, что передается в параметре CodePage. Чаще всего это активная кода ANSI или UTF-8.
LPWSTR-это строка UTF-16, которая может или не может быть нулевой (см. MSDN)
Я ничего не знаю о Wcstombs, я всегда использую WideChartomultibyte.
Пути файлов находятся в UTF-16. На самом деле весь текст находится UTF-16 внутри Windows.
Для кодирования ANSI вам нужно будет прочитать об этом в некоторых деталях. Вы могли бы сделать хуже, чем начать с Википедия и перейдите по ссылкам оттуда.
Я надеюсь, что это поможет, и если у меня что -то не так, любой, кто знает больше, пожалуйста, отредактируйте это, чтобы исправить любые ошибки!
Широкие строки раньше были UCS-2. Из Windows 2000 широкие строки-UTF-16. Приятно знать, нужно ли вам сохранить какую -то старую устаревшую систему.
Прежде всего вы найдете много информации в это такая тема.
ASCII - это Charset, а не кодирование. Теперь, есть несколько 8-битных Charsets, один из которых устанавливается в качестве по умолчанию в системе (вы можете изменить его в региональных условиях). *Функции принимают 8-битные символы в этом Charset. UTF-8-это не Charset, а кодирование Unicode Charset. *W-функции, насколько я понимаю, используйте UTF-16, а не UCS-2.