Как включить многобайтовую кодировку в visual studio

Обновлено: 04.07.2024

Когда мы работаем с кодировкой последовательности символов, у нас есть разные типы стандартов кодирования, такие как стандарты однобайтового кодирования (ASCII и Extended ASCII), стандарты многобайтового кодирования (Shift-JIS, Unicode 16 и . ), а также стандарты Unicode 32, которые Это заметно в современном программировании и разработке программного обеспечения, но в среде Visual Studio у нас есть только многобайтовая кодировка и Unicode.

У меня вопрос: как мне работать со стандартами кодирования переменной длины в среде Visual Studio? Поддерживает ли он эти типы стандартов кодирования? Если да, как я могу использовать это в визуальной студии или даже в другой среде для целей обучения? Например, как мы можем использовать кодировку UCS 2 или UTF16 в среде Microsoft Visual Studio для разработки на C ++?

1 ответ

Visual Studio C ++ поддерживает:

Строки :

  • string : тип, который описывает специализацию класса шаблона basic_string с элементами типа char
  • u16string : тип, который описывает специализацию класса шаблона basic_string с элементами типа char16_t .
  • u32string : тип, который описывает специализацию класса шаблона basic_string с элементами типа char32_t .
  • wstring : тип, который описывает специализацию класса шаблона basic_string с элементами типа wchar_t .

Символьные литералы

  • Обычные символьные литералы типа char , например 'a'
  • Символьные литералы UTF-8 типа char , например u8'a'
  • Литералы с широкими символами типа wchar_t , например L'a'
  • Символьные литералы UTF-16 типа char16_t , например u'a'
  • Символьные литералы UTF-32 типа char32_t , например U'a'

Кодировка:

Символьный литерал без префикса является обычным символьным литералом . Значение обычного символьного литерала, содержащего один символ, escape-последовательность или универсальное имя символа, которое может быть представлено в наборе символов выполнения, имеет значение, равное числовому значению его кодировки в наборе символов выполнения. Обычный символьный литерал, содержащий более одного символа, escape-последовательность или универсальное имя символа, является многосимвольным литералом. Многосимвольный литерал или обычный символьный литерал, который не может быть представлен в наборе символов выполнения, поддерживается условно, имеет тип int, а его значение определяется реализацией.

Символьный литерал, начинающийся с префикса L , является литералом расширенных символов . Значение литерала с расширенными символами, содержащего один символ, escape-последовательность или универсальное имя символа, имеет значение, равное числовому значению его кодировки в наборе расширенных символов выполнения, если только символьный литерал не имеет представления в расширенном исполнении. набор символов, и в этом случае значение определяется реализацией. Значение литерала для широких символов, содержащего несколько символов, escape-последовательности или универсальные имена символов, определяется реализацией.

Символьный литерал, начинающийся с префикса u8 , является символьным литералом UTF-8 . Значение символьного литерала UTF-8, содержащего один символ, escape-последовательность или универсальное имя символа, имеет значение, равное его значению кодовой точки ISO 10646, если оно может быть представлено одной единицей кода UTF-8 (соответствует C0 Элементы управления и блок Basic Latin Unicode). Если значение не может быть представлено одной единицей кода UTF-8, программа имеет неправильный формат. Символьный литерал UTF-8, содержащий более одного символа, escape-последовательность или универсальное имя символа, имеет неправильный формат.

Символьный литерал, начинающийся с префикса u , является символьным литералом UTF-16 . Значение символьного литерала UTF-16, содержащего один символ, escape-последовательность или универсальное имя символа, имеет значение, равное значению его кодовой точки ISO 10646, если оно может быть представлено одной единицей кода UTF-16 (соответствующей базовой многоязычный самолет). Если значение не может быть представлено одной единицей кода UTF-16, программа имеет неправильный формат. Символьный литерал UTF-16, содержащий более одного символа, escape-последовательность или универсальное имя символа, имеет неправильный формат.

Символьный литерал, начинающийся с префикса U , является символьным литералом UTF-32 . Значение символьного литерала UTF-32, содержащего один символ, escape-последовательность или универсальное имя символа, имеет значение, равное его значению кодовой точки ISO 10646. Символьный литерал UTF-8, содержащий более одного символа, escape-последовательность или универсальное имя символа, имеет неправильный формат.

Библиотека Microsoft Foundation Classes (MFC), Библиотека времени выполнения C для Visual C++ и среда разработки Visual C++, включены для облегчения международного программирования. Они предоставляют:

Поддержка стандарта Unicode на Windows. Юникод — это текущий стандарт, который должен использоваться везде, где это возможно.

Юникод — это 16-разрядная кодировка символов, предоставляющая достаточное количество кодировок для всех языков. Все символы ASCII включены в Юникод в виде расширенных символов.

Поддержка формы многобайтовой кодировки (MBCS), называемой двухбайтовым набором символов (DBCS) на всех платформах.

Символы DBCS состоят из 1 или 2 байт. Некоторые диапазоны байтов задаются для использования в качестве старших байтов. Старший байт указывает на то, что он и следующий младший байт составляют один 2-байтовый символ. Необходимо контролировать, какие байты являются старшими байтами. В отдельных многобайтовых кодировках старшие и младшие байты попадают в определенный диапазон. Когда эти диапазоны перекрываются, может потребоваться оценить контекст, чтобы определить, функционирует ли данный байт как старший или младший байт.

Поддержка средств, упрощающих программирование многобайтовых приложений, написанных для международных рынков.

при использовании версии Windows операционной системы с поддержкой многобайтовой кодировки система разработки Visual C++, включая интегрированный редактор исходного кода, отладчик и средства командной строки, полностью поддерживает многобайтовую кодировку. Дополнительные сведения см. в разделе Поддержка MBCS в Visual C++.

В этой документации многобайтовая кодировка используется для описания всех кодировок, не поддерживающих Юникод, для многобайтовых символов. В Visual C++ MBCS всегда означает DBCS. Наборы символов, превышающие 2 байта, не поддерживаются.

По определению набор символов ASCII является подмножеством всех многобайтовых кодировок. Во многих многобайтовых кодировках каждый символ в диапазоне от 0x00 до 0x7F совпадает с символом в кодировке ASCII, который имеет то же значение. Например, в строках ASCII и MBCS символ NULL 1 байт (' \ 0 ') имеет значение 0x00 и обозначает завершающий нуль-символ.

Некоторые языки, например японский и китайский, имеют большие наборы символов. Для поддержки программирования этих рынков библиотека Microsoft Foundation Class (MFC) предоставляет два разных подхода к обработке больших наборов символов:

Юникод, wchar_t основанные на расширенных символах и строки в кодировке UTF-16.

Многобайтовые кодировки (MBCS), char основанные на одиночных или двухбайтовых символах и строки, закодированные в кодировке, зависящей от языкового стандарта.

корпорация майкрософт рекомендует использовать библиотеки юникода MFC для всех новых сред разработки, а библиотеки MBCS не рекомендуются в Visual Studio 2013 и Visual Studio 2015. Это больше не требуется. предупреждения об устаревании многобайтовых кодировок были удалены в Visual Studio 2017.

Поддержка MFC для строк в Юникоде

Все библиотеки классов MFC условно поддерживаются для символов Юникода, а строки, хранящиеся в расширенных символах, — в кодировке UTF-16. В частности, класс CString поддерживает Юникод.

Эти файлы библиотеки, отладчика и библиотеки DLL используются для поддержки Юникода в MFC:

MFC версии U. lib
MFC версии обновления. LIB МФКМ версия U. lib
МФКМ версия обновления. LIB МФКС версия U. lib
МФКС версия обновления. LIB УАФКСКВ. LIB УАФКСКВД. LIB

Библиотека MFC версии U. pdb
MFC версии обновления. Файле МФКМ версия U. pdb
МФКМ версия обновления. Файле МФКС версия U. pdb
МФКС версия обновления. Файле УАФКСКВ. Файле УАФКСКВД. ФАЙЛЕ

MFC версии U.DLL
MFC версии UD.DLL
МФКМ версия U.DLL
UD.DLL версии мфкм

(версия представляет номер версии файла, например, "140" означает версию 14,0.)

Для завершения программирования в Юникоде приложения необходимо также:

Используйте _T макрос, чтобы строковые литералы кода можно было перенести в Юникод.

При передаче строк следует обратить внимание на то, требуется ли для аргументов функции длина в символах или длина в байтах. Разница важна при использовании строк Юникода.

Используйте переносимые версии функций обработки строк времени выполнения языка C.

Используйте следующие типы данных для символов и указателей символов:

Используйте TCHAR там, где будет использоваться char .

Используйте LPTSTR там, где будет использоваться char * .

Используйте LPCTSTR там, где будет использоваться const char * . CString предоставляет оператор LPCTSTR для преобразования между CString и LPCTSTR .

CString также предоставляет конструкторы, поддерживающие Юникод, операторы присваивания и операторы сравнения.

Ссылка на библиотеку времени выполнения определяет переносимые версии всех функций обработки строк. Дополнительные сведения см. в разделе Международная связькатегории.

Поддержка MFC для строк MBCS

Библиотека классов также включена для многобайтовых кодировок, но только для двухбайтовых наборов символов (DBCS).

В многобайтовой кодировке символ может иметь один или два байта в ширину. Если для него задано значение в два байта, его первый байт — это специальный "старший байт", который выбирается из определенного диапазона в зависимости от используемой кодовой страницы. Вместе, ведущий и «младший байт» задают уникальную кодировку символов.

Если символ _MBCS определен для сборки программы, тип TCHAR , на котором CString основана, сопоставляется с char . Вы должны определить, какие байты a CString являются старшими байтами, а какие — конечными байтами. Библиотека времени выполнения языка C предоставляет функции, помогающие определить это.

В двухбайтовой кодировке DBCS заданная строка может содержать все однобайтовые ANSI-символы, все двухбайтовые символы или сочетание двух. Для этих возможностей требуется особая осторожность при анализе строк. Сюда входят CString объекты.

Сериализация строк Юникода в MFC может считывать строки как в Юникоде, так и в многобайтовой кодировке независимо от того, какая версия приложения используется. Файлы данных переносимы между Юникодом и многобайтовой версией программы.

CString функции-члены используют специальные "универсальные" версии функций среды выполнения C, которые они вызывают, или используют функции, поддерживающие Юникод. Поэтому, например, если CString функция обычно вызывает strcmp , вместо этого вызывается соответствующая универсальная функция _tcscmp . В зависимости от того, как _MBCS _UNICODE определяются символы и, _tcscmp сопоставляет их следующим образом:

Символы Функция
_MBCS определяется _mbscmp
_UNICODE определяется wcscmp
Не определен ни один символ strcmp

Символы _MBCS и _UNICODE являются взаимоисключающими.

Сопоставления универсальных текстовых функций для всех подпрограмм обработки строк во время выполнения обсуждаются в справочнике по библиотеке C Run-Time. Список см. в разделе интернационализации.

Аналогичным образом, CString методы реализуются с помощью универсальных сопоставлений типов данных. Чтобы включить многобайтовую кодировку и Юникод, MFC использует для или, TCHAR char для или wchar_t LPTSTR char * wchar_t* LPCTSTR const char * const wchar_t* . Они обеспечивают правильное сопоставление для MBCS или Юникода.

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

Наиболее распространенная реализация многобайтовой кодировки — двухбайтовая кодировка (DBCS). Visual C++ в целом и MFC в частности полностью поддерживают DBCS.

Примеры см. в файлах исходного кода MFC.

Для платформ, использующих объемные кодировки, наилучшая альтернатива Юникоду — это MBCS. MFC поддерживает MBCS с помощью интернациализируемых типов данных и функций времени выполнения C. То же следует сделать и в вашем коде.

В MBCS символы кодируются одним или двумя байтами. В двухбайтовых символах первый или старший байт указывает, что он и следующий байт должны интерпретироваться как один символ. Первый байт относится к диапазону кодов, зарезервированных для использования в качестве старших байтов. То, какие диапазоны байтов могут быть старшими байтами, зависит от используемой кодовой страницы. Например, японская кодовая страница 932 использует в качестве старших байтов диапазон 0x81–0x9F, но корейская кодовая страница 949 использует другой диапазон.

Учитывайте следующие аспекты при программировании с использованием MBCS.

Символы MBCS в окружении символы MBCS могут присутствовать в таких строках, как имена файлов и каталогов.

Операции редактирования

Операции редактирования в приложениях с MBCS должны работать с символами, а не байтами. Курсор не должен разбивать символ, клавиша со стрелкой вправо должен перемещаться вправо на один символ и т. д. Delete должен удалить символ; Отмена должна быть повторно вставлена.

Обработка строк

В приложении, использующем MBCS, обработка строк вызывает особые проблемы. Символы из одного и двух байтов могут быть перемешаны в одной строке. Поэтому необходимо всегда проверять старшие байты.

Поддержка библиотеки времени выполнения

Библиотеки времени выполнения языка C и MFC поддерживают однобайтовые и многобайтовые кодировки, а также Юникод. Однобайтовые строки обрабатываются с помощью str семейства функций времени выполнения, строки MBCS обрабатываются с помощью соответствующих _mbs функций, а строки Юникода обрабатываются с помощью соответствующих wcs функций. В реализациях функций-членов классов MFC используются переносимые функции времени выполнения, которые в некоторых обстоятельствах сопоставляются с обычным семейством функций str , функциями MBSC или функциями Юникода, как описано в разделе "Переносимость MBSC и Юникода".

Переносимость MBSC и Юникода

С помощью файла заголовка TCHAR. h можно создавать приложения с одним байтом, MBCS и Юникод из одних и тех же источников. TCHAR. h определяет макросы с префиксом _tcs , str _mbs wcs соответствующим функциям, или. Чтобы создать многобайтовую кодировку, определите символ _MBCS . Чтобы создать Юникод, определите символ _UNICODE . По умолчанию _UNICODE для приложений MFC определено значение. Дополнительные сведения см. в разделе Универсальные текстовые сопоставления в файле Tchar. h.

Если одновременно определить и, то поведение не определено _UNICODE _MBCS .

Файлы заголовков Mbctype.h и Mbstring.h определяют функции и макросы MBCS, которые могут понадобиться в некоторых случаях. Например, _ismbblead сообщает, является ли указанный байт в строке старшим.

Для международного переноса кода программа имеет кодировку Юникод или многобайтовую кодировку (MBCS).

В настройках проекта Visual Studio можно выбирать набор используемых символов. Обычно там есть два пункта:

Я раньше считал, что многобайтовая кодировка - это ANSI, 8 битные символы, зависимость от кодовой страницы. А юникод - это UTF16-LE, который обычно упаковывается в wchar_t, и при этом значащий символ может быть представлен 1 или 2 символами wchar_t.

Считал я так потому, что при выборе многобайтовой кодировки - WinAPI макросы разворачивались из, например, CreateFile() в CreateFileA(), а синоним TCHAR скрывал за собой char. То есть, многобайтовая кодировка в настройках проекта приводила к использованию ANSI версий WinAPI функций и типов.

Но теперь я окончательно запутался. Помогите разобраться в этом вопросе.

37.8k 10 10 золотых знаков 43 43 серебряных знака 79 79 бронзовых знаков

Самое первое, что нужно понять, что юникод и utf-XXX - это разные штуки. Самая ближайшая аналогия - классы и объекты.

Юникод - это просто таблица, в которой каждому символу сопоставлен какой то код-число.

utf-8, utf-16-le и другие - это то, как этот код-число кодируется в "железе".

То есть, самому юникоду побоку на байты, на биты. Там числа.

utf-8 сделан так, что если использовать только первые 128 символов юникода, то по внешнему виду его нельзя отличить от кодировки ANSI. Они совпадают с точностью до битового представления (если конечно не считать BOM, который может быть вначале). Эта особенность как раз и дала возможность легко добавить поддержку юникода (юникода, а не utf16).

Но у uft-8 есть один фатальный недостаток - многие функции с ним "тяжело работают". К примеру, посчитать длину строки (strlen). И тут начинаются танцы с бубном, что считать длину строки - количество байт или количество символов или количество видимых пользователю символов (ага, не все символы юникода видимы. часть из них это "модификаторы". Например, добавляем спец модификатор к И и получам Й . Длина строки будет 4 2 или 1, в зависимости от того, как считать).

В UTF16 с этим чуточку проще. Там почти всегда все символы по два байта. Длину считать легко, ну кроме тех случаев, когда кодируется двумя двухбайтовыми.

И Майкрософт решила использовать UTF16-LE. Это интересное решение, легко кодится и большинстве случаев пользователи-программисты просто поменяли свои типы на t* типы и все заработало. Но сделали глупость и назвали это "юникодом".

Читайте также: