Windows API: ANSI и Широкосимвольные строки-это UTF8 или ASCII? UTF-16 или UCS-2 LE?
Я не совсем профессионал с кодировками, но вот что я думаю, что знаю (хотя это может быть неправильно):
- ASCII-это 7-битная кодировка фиксированной длины с символами, которые вы можете найти в диаграммах ASCII.
- UTF8-это 8-разрядная кодировка переменной длины. Все символы могут быть написаны в UTF8.
- UCS-2 LE / BE-это 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, который все равно не поможет с 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.
* функции использовали активную кодовую страницу ANSI.
* W функция использует UTF-16.
многобайтовый относится к тому, что передается в параметре CodePage. Чаще всего это либо активная кодовая страница ANSI, либо UTF-8.
LPWSTR-строка UTF-16, которая может быть или не быть null-terminated (см. MSDN)
Я ничего не знаю о wcstombs, я всегда использую Так и widechartomultibyte.
пути к файлам находятся в UTF-16. На самом деле весь текст UTF-16 внутренне в Windows.
для кодирования ANSI вам нужно будет прочитать об этом более подробно. Вы могли бы сделать хуже, чем начать с Википедия и следовать по ссылкам оттуда.
Я надеюсь, что это поможет, и что если я что-то не так, кто знает больше, пожалуйста, отредактируйте это, чтобы исправить любые ошибки!
широкие строки раньше были UCS-2. Из Windows 2000 широкими строками являются UTF-16. Хорошо знать, если вам нужно поддерживать старые унаследованные системы.
прежде всего, вы найдете много информации в это так тема.
ASCII-это кодировка, а не кодировка. Теперь, есть несколько 8-битных кодировок, один из которых установлен по умолчанию в системе (его можно изменить в региональных настройках). * Функции принимают 8-разрядные символы в этой кодировке. UTF-8 - это не кодировка, а кодировка кодировки Unicode. * Функции W, как я понимаю, используют UTF-16, а не UCS-2.