- Использование кодовой страницы UTF-8 Use the UTF-8 code page
- — API-интерфейсы и-W -A vs. -W APIs
- Задание кодовой страницы процесса UTF-8 Set a process code page to UTF-8
- Примеры Examples
- Преобразование кодовой страницы Code page conversion
- Кодовые страницы консоли Console Code Pages
- Устранение проблем с кодировкой в Windows 7
- Убираем кракозябры в Windows 7
- Способ 1: Смена системной локали
- Способ 2: Изменение кодировки через системный реестр
- Способ 3: Переустановка операционной системы
- Заключение
Использование кодовой страницы UTF-8 Use the UTF-8 code page
Используйте кодировку UTF-8 для обеспечения оптимальной совместимости между веб-приложениями и другими * платформами на основе nix (UNIX, Linux и разновидности), свести к сведению ошибки локализации и снизить затраты на тестирование. Use UTF-8 character encoding for optimal compatibility between web apps and other *nix-based platforms (Unix, Linux, and variants), minimize localization bugs, and reduce testing overhead.
UTF-8 — это универсальная кодовая страница для интернационализации и способная кодировать весь набор символов Юникода. UTF-8 is the universal code page for internationalization and is able to encode the entire Unicode character set. Он используется в Интернете по умолчанию, а также на платформах на основе NIX. It is used pervasively on the web, and is the default for *nix-based platforms.
Закодированный символ занимает от 1 до 4 байт. An encoded character takes between 1 and 4 bytes. Кодировка UTF-8 поддерживает более длинные последовательности байтов (до 6 байт), но большая кодовая точка Юникода 6,0 (U + 10FFFF) занимает всего 4 байта. UTF-8 encoding supports longer byte sequences, up to 6 bytes, but the biggest code point of Unicode 6.0 (U+10FFFF) only takes 4 bytes.
— API-интерфейсы и-W -A vs. -W APIs
Интерфейсы API Win32 часто поддерживают варианты «-A» и «W». Win32 APIs often support both -A and -W variants.
— Варианты, распознаваемые кодовую страницу ANSI, настроенную для системы и поддержки char* , а варианты-W работают в кодировке UTF-16 и поддерживают WCHAR . -A variants recognize the ANSI code page configured on the system and support char* , while -W variants operate in UTF-16 and support WCHAR .
До недавнего времени Windows выделена «Юникод»-W Variant для API. Until recently, Windows has emphasized «Unicode» -W variants over -A APIs. Однако последние выпуски использовали кодовую страницу ANSI и — API-интерфейсы в качестве средства для поддержки приложений в кодировке UTF-8. However, recent releases have used the ANSI code page and -A APIs as a means to introduce UTF-8 support to apps. Если кодовая страница ANSI настроена для UTF-8, то API-интерфейсы работают в кодировке UTF-8. If the ANSI code page is configured for UTF-8, -A APIs operate in UTF-8. Эта модель имеет преимущество поддержки существующего кода, построенного с помощью API-интерфейсов, без изменения кода. This model has the benefit of supporting existing code built with -A APIs without any code changes.
Задание кодовой страницы процесса UTF-8 Set a process code page to UTF-8
Начиная с версии Windows 1903 (Май 2019), можно использовать свойство Активекодепаже в appxmanifest для упакованных приложений или манифест Fusion для неупакованных приложений, чтобы заставить процесс использовать UTF-8 в качестве кодовой страницы процесса. As of Windows Version 1903 (May 2019 Update), you can use the ActiveCodePage property in the appxmanifest for packaged apps, or the fusion manifest for unpackaged apps, to force a process to use UTF-8 as the process code page.
Вы можете объявить это свойство и целевой объект или выполнить его в более ранних сборках Windows, но необходимо как обычно выполнять обнаружение и преобразование кодовых страниц прежних версий. You can declare this property and target/run on earlier Windows builds, but you must handle legacy code page detection and conversion as usual. При использовании минимальной целевой версии Windows версии 1903 кодовая страница процесса всегда будет UTF-8, поэтому можно избежать обнаружения и преобразования кодовой страницы прежних версий. With a minimum target version of Windows Version 1903, the process code page will always be UTF-8 so legacy code page detection and conversion can be avoided.
Примеры Examples
Манифест appx для упакованного приложения: Appx manifest for a packaged app:
Манифест Fusion для неупакованного приложения Win32: Fusion manifest for an unpackaged Win32 app:
Добавление манифеста в существующий исполняемый файл из командной строки с помощью команды mt.exe -manifest -outputresource: ;#1 Add a manifest to an existing executable from the command line with mt.exe -manifest -outputresource: ;#1
Преобразование кодовой страницы Code page conversion
Поскольку Windows изначально работает в UTF-16 ( WCHAR ), может потребоваться преобразовать данные UTF-8 в UTF-16 (или наоборот) для взаимодействия с API Windows. As Windows operates natively in UTF-16 ( WCHAR ), you might need to convert UTF-8 data to UTF-16 (or vice versa) to interoperate with Windows APIs.
MultiByteToWideChar и WideCharToMultiByte позволяют выполнить преобразование между UTF-8 и UTF-16 ( WCHAR ) (и другими кодовыми страницами). MultiByteToWideChar and WideCharToMultiByte let you convert between UTF-8 and UTF-16 ( WCHAR ) (and other code pages). Это особенно полезно, когда устаревший API Win32 может понимать только WCHAR . This is particularly useful when a legacy Win32 API might only understand WCHAR . Эти функции позволяют преобразовать входные данные UTF-8 в WCHAR для передачи в API-интерфейс, а затем преобразовать все результаты при необходимости. These functions allow you to convert UTF-8 input to WCHAR to pass into a -W API and then convert any results back if necessary. При использовании этих функций с CodePage параметром CP_UTF8 , имеющим значение, используйте dwFlags либо 0 или MB_ERR_INVALID_CHARS , в противном случае — ERROR_INVALID_FLAGS . When using these functions with CodePage set to CP_UTF8 , use dwFlags of either 0 or MB_ERR_INVALID_CHARS , otherwise an ERROR_INVALID_FLAGS occurs.
CP_ACP«CP_UTF8 соответствует только в том случае, если работает в Windows версии 1903 (май 2019) или выше, а описанное выше свойство активекодепаже имеет значение UTF-8. CP_ACP equates to CP_UTF8 only if running on Windows Version 1903 (May 2019 Update) or above and the ActiveCodePage property described above is set to UTF-8. В противном случае она учитывает устаревшую системную кодовую страницу. Otherwise, it honors the legacy system code page. Рекомендуется использовать CP_UTF8 явно. We recommend using CP_UTF8 explicitly.
Кодовые страницы консоли Console Code Pages
Кодовая страница — это сопоставление кодов символов 256 с отдельными символами. A code page is a mapping of 256 character codes to individual characters. Разные кодовые страницы включают разные специальные символы, как правило, настроенные для языка или группы языков. Different code pages include different special characters, typically customized for a language or a group of languages.
С каждой консолью связаны две кодовые страницы: одна для ввода и одна для выхода. Associated with each console are two code pages: one for input and one for output. Консоль использует страницу входного кода для преобразования ввода с клавиатуры в соответствующее символьное значение. A console uses its input code page to translate keyboard input into the corresponding character value. Он использует свою кодовую страницу вывода для преобразования символьных значений, записанных различными функциями вывода, в изображения, отображаемые в окне консоли. It uses its output code page to translate the character values written by the various output functions into the images displayed in the console window. Приложение может использовать функции сетконсолекп и жетконсолекп для установки и получения кодовых страниц входного кода консоли и функций сетконсолеаутпуткп и GetConsoleOutputCP для установки и получения страниц с выходным кодом. An application can use the SetConsoleCP and GetConsoleCP functions to set and retrieve a console’s input code pages and the SetConsoleOutputCP and GetConsoleOutputCP functions to set and retrieve its output code pages.
Идентификаторы кодовых страниц, доступных на локальном компьютере, хранятся в реестре в следующем разделе: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage The identifiers of the code pages available on the local computer are stored in the registry under the following key: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage
Сведения об использовании функций реестра для определения доступных кодовых страниц см. в разделе Registry. For information about using the registry functions to determine the available code pages, see Registry.
Рекомендуется для всех новых и обновленных приложений командной строки, чтобы избежать кодовых страниц и использовать Юникод. It is recommended for all new and updated command-line applications to avoid code pages and use Unicode. Форматированный текст UTF-16 можно отправить в семейство API-интерфейсов для W консоли. UTF-16 formatted text can be sent to the W family of console APIs. Отформатированный текст UTF-8 можно отправить в семейство интерфейсов API консоли после того, как вы убедитесь, что кодовая страница имеет значение 65001 (CP_UTF8) с функциями сетконсолекп и сетконсолеаутпуткп . UTF-8 formatted text can be sent to the A family of console APIs after ensuring the code page is first set to 65001 (CP_UTF8) with the SetConsoleCP and SetConsoleOutputCP functions.
Устранение проблем с кодировкой в Windows 7
Убираем кракозябры в Windows 7
Основная причина рассматриваемой неполадки – не распознается установленная системой кодировка либо выбрана неправильная таблица перекодировки. Устранить эту проблему можно несколькими методами.
Способ 1: Смена системной локали
В большинстве случаев устранить трудности с распознаванием кодировки можно сменой системной локали – с русской на английскую, затем снова на русскую. Делается это следующим образом:
- Откройте «Пуск» (в английской версии «Start») и выберите пункт «Панель управления» («Control Panel»).
Перейдите к разделу «Языки и клавиатуры» («Keyboards and Languages»), после чего воспользуйтесь выпадающим меню «Выберите язык интерфейса» («Change System Locale»), в котором выберите вариант «English».
Перезагрузите компьютер, после чего повторите шаги 1-3, но на этот раз выберите язык интерфейса «Русский».
После рестарта машины проблема с кракозябрами должна быть устранена. Если нет, читайте далее.
Способ 2: Изменение кодировки через системный реестр
Второй метод исправления ошибок с чтением кодировки заключается в ручном выборе требуемых таблиц через системный реестр.
Первый вариант
- Откройте средство «Выполнить» комбинацией клавиш Win+R, пропишите команду regedit и нажмите Enter на клавиатуре.
Перейдите по адресу
Далее предстоит довольно затратная по времени процедура – каждый из ключей, который находится в этом каталоге, следует заменить на CP_1251 : откройте произвольный ключ двойным щелчком левой кнопки мыши по нему, введите новое значение ключа и нажимайте «ОК».
Альтернативный вариант
Первая представленная последовательность замены кодировки неэффективна по времени, но существует способ её ускорить – создать файл REG с заранее прописанными командами.
- Откройте «Блокнот» с администраторскими полномочиями: откройте «Пуск», начните вводить название программы в строке поиска, затем кликните правой кнопкой мыши по результату и выберите соответствующий пункт в контекстном меню
Вставьте в окно следующий текст:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage]
«1250»=»c_1250.nls»
«1251»=»c_1251.nls»
«1252»=»c_1252.nls»
«1253»=»c_1253.nls»
«1254»=»c_1254.nls»
«1255»=»c_1255.nls»
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontMapper]
«ARIAL»=dword:00000000
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontSubstitutes]
«Arial,0″=»Arial,204»
«Comic Sans MS,0″=»Comic Sans MS,204»
«Courier,0″=»Courier New,204»
«Courier,204″=»Courier New,204»
«MS Sans Serif,0″=»MS Sans Serif,204»
«Tahoma,0″=»Tahoma,204»
«Times New Roman,0″=»Times New Roman,204»
«Verdana,0″=»Verdana,204»
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage
Внимание! Обязательно после последней строчки введите пустую строку!
В конце процедуры нажмите «Сохранить».
Закрывайте «Блокнот» и переходите к директории, в которую сохранили файл. Обратите внимание, что теперь его иконка имеет вид файла реестра. На этом этапе рекомендуем сделать резервную копию данных — откройте «Редактор реестра» и воспользуйтесь пунктами «Файл» — «Экспорт».
После этого можно запустить созданный REG-файл двойным щелчком ЛКМ.
Подтвердите, что желаете внести изменения.
В большинстве случаев вышеуказанных действий достаточно для устранения всех проблем с кракозябрами, но стоит иметь в виду, что они могут привести к другим неполадкам, поэтому применять его рекомендуем исключительно в крайнем случае.
Способ 3: Переустановка операционной системы
Описанные выше способы могут не иметь желаемого эффекта – проблема продолжает наблюдаться, несмотря на действия пользователя. В таком случае некорректную ассоциацию таблиц кодировок вручную изменить невозможно, и единственным способом её устранить будет переустановка ОС.
Заключение
Мы рассмотрели методы устранения проблемы с отображением кракозябр вместо нормального текста в Windows 7. Напоследок хотим отметить, что такой сбой чаще всего наблюдается в пиратских «репаках», поэтому ещё раз напоминаем – используйте только лицензионное ПО или его свободные аналоги.