Подтвердить что ты не робот

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-байтовые символы невозможным? (У Windows, похоже, нет API-интерфейсов для них.)
  • Является ли функциональность WideCharToMultiByte надмножеством функции wcstombs, и оба они работают над одним и тем же типом строки? Или один, скажем, работает на UTF-16, а другой работает на UCS-2?
  • Являются ли пути к файлам в UTF-16 или UCS-2? Я знаю, что Windows рассматривает его как "непрозрачный массив символов" из документации Microsoft, но по стандарту C для таких функций, как fwprintf, есть ли стандартизованная кодировка?
  • Что такое кодировка "ANSI"? Это даже правильный термин? И как это связано с ASCII?
  • (У меня было больше вопросов, но этого достаточно... Я все-таки забыл некоторые из них).

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

Спасибо!

4b9b3361

Ответ 1

Правильны ли они выше?

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

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

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

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

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

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

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

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

LPWSTR является указателем на wchar_t, который всегда является 16-разрядным целым без знака в Windows. Какие символы могут отображаться, не связаны с кодировкой, если эта кодировка может кодировать все символы Юникода. 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 по-прежнему имеет свое странное, главным образом - undefined поведение, нечувствительное к регистру, которое вызывает много проблем, поскольку имена файлов, которые обрабатываются эквивалентными, не обязательно равны. Это нарушает многие инварианты; например, в Linux без помех от других потоков, если вы успешно создадите два файла A и A в каком-то каталоге, вы получите два разных файла, в то время как в Windows вы получите только один файл (и вообще, непредсказуемое количество файлов).

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

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

Ответ 2

  • * Функции, используемые активной кодовой страницей ANSI.

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

  • Multi-byte ссылается на все, что передается в параметре CodePage. Обычно это либо активная кодовая страница ANSI, либо UTF-8.

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

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

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

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

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

Ответ 3

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

Ответ 4

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

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