Когда я запускаю команду chcp
в окне cmd.exe
, она представляет собой кодовую страницу, используемую в Windows.
Я думаю, что Windows использует набор символов UNICODE.
Итак, мои вопросы:
Почему Windows использует кодовые страницы ANSI вместо Unicode?
Windows использует UTF-16 или UCS-2? Могу ли я проверить это (командой или ссылкой MSDN)?
UTF-16 или UCS-2 - это просто кодировка? или это тоже набор символов?
UTF-8, UTF-16, UTF-32 и т. д. у них разный размер набора символов?
Я весьма озадачен. пожалуйста, кто-нибудь определите их.
WriteConsoleW
, текст будет отображаться как есть, и текущий CP не будет иметь никакого эффекта. если мы вызовемWriteConsoleA
- сначала текст будет переведен в Unicode черезMultiByteToWideChar
и здесь CP будет использоваться в качестве первого аргумента. поэтомуA
результат вызова API зависит от текущего CP, аW
нет. иchcp
будет действовать только для текущегоcmd.exe
- person RbMm   schedule 11.10.2017GetConsoleCP
,SetConsoleCP
иSetConsoleOutputCP
. Это не позволяет установить выходную кодовую клавиатуру независимо от входной кодовой страницы. Примечательно, что входные и выходные кодовые страницы консоли используются при использовании ее в качестве общего файла черезReadFile
иWriteFile
, для которых UTF-16LE (кодовая страница 1200) не поддерживается. - person Eryk Sun   schedule 11.10.2017SetConsole[Output]CP
в любом процессе, прикрепленном к консоли (conhost.exe) приводит к вызовуSrvSetConsoleCP
в conhost.exe, который собственно и задает CP. поэтому CP это только переменная/состояние в conhost.exe и связанные с ним затронутые процессы. если мы выполним новый cmd из текущего - это тоже повлияет на него (прикрепленный к тому же conhost.exe), но если выполнить cmd из проводника - он будет иметь отдельный conhost.exe и никакого эффекта от этого - person RbMm   schedule 11.10.2017WriteFile
иWriteConsoleA
возвращали количество записанных кодов UTF-16 вместо количества записанных байтов. Хуже того, установка входной кодовой страницы на 65001 приводит к сбою при чтении ввода за пределами 7-битного ASCII даже в обновлении Windows 10 Creators из-за статических предположений о количестве байтов ANSI на символ при определении размера внутреннего буфера, используемого для вызоваWideCharToMultiByte
. - person Eryk Sun   schedule 11.10.2017MultiByteToWideChar
(дляWriteConsoleA
/WriteFile
) с флагомMB_USEGLYPHCHARS
. В старой реализации консоли этот флаг использовался для замены классических глифов OEM-компьютеров на управляющие символы ASCII. Возможно, это усовершенствование, поскольку в буфер экрана в новой консоли записаны именно символы ASCII, а не неявно подставленные символы. - person Eryk Sun   schedule 11.10.2017