Как включить многобайтовое кодирование в Visual Studio

Обновлено: 21.11.2024

Предыдущая статья перенесет вас в визуальную студию — выведет из ямы Папина яма с библиотеками времени выполнения помогает нам понять различные типы библиотек времени выполнения C/s++ в Windows, а также их тонкости, что особенно легкое место, чтобы сбиться с пути в C++ разработки, Мы обобщили и подытожили. В этой статье мы продолжим объяснять еще одну концепцию, которую легко спутать с многобайтовыми наборами символов разработки C++ и наборами символов Unicode.

Многобайтовые символы с широкобайтовыми символами char с wchar_t

Мы знаем, что в базовых типах данных C++ представлены два типа символов: char, wchar_t.
Char называется многобайтовым символом, один char занимает один байт, а многобайтовый символ называется потому, что он представляет слово, хотя может быть байтом или несколькими байтами. Английский символ (например, 's') представлен char (байтом), а китайский символ (например, 'Medium') представлен 3 char (тремя байтами), как показано в следующем примере.

Узлы следующие:

wchar_t называется расширенным символом , а wchar_t занимает 2 байта. Широкий символ вызывается потому, что все слова представлены двумя байтами (т. е. wchar_t), будь то английский или китайский. Посмотрите на следующий пример:

Результаты следующие:

Описание:
1. При присвоении значения переменной wchar_t с постоянным символом добавьте l впереди. например: wchar_t WCH2 = L 'in';
2. При присвоении значения массиву wchar_t с постоянной строкой добавьте L впереди. например: wchar_t wstr2[3] = L "Китай";
3. Если не добавлять L, то для английского может быть нормально, а для неанглийского (например, китайского) будет неправильно.

строка и wстрока

Массив символов может представлять собой строку, но это строка фиксированной длины, и мы должны знать длину массива перед его использованием. Чтобы облегчить работу со строками, STL определяет для нас строку и wstring. Мы, конечно, знакомы со строкой, но wstring может использовать меньше.

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

Wstring — это версия Unicode, инкапсуляция массива wchar_t на основе wchar_t.

Связанные преобразования строки в wstring:

Следующие два метода являются кроссплатформенными, их можно использовать как в Windows, так и в Linux.

Набор символов (Charcater set) и кодировка символов (Encoding)

Кодировка символов (Character Encoding): набор правил, которые можно использовать для сопоставления набора символов естественных языков (например, алфавита или таблицы слогов) с двоичными числами, которые может распознать компьютер. То есть может установить отношение соответствия между набором символов и цифровой системой, это базовая технология обработки информации. Обычно люди используют наборы символов (обычно текст) для выражения информации, в то время как компьютерная система обработки информации использует двоичные числа для хранения и обработки сообщений. Кодировка символов — это преобразование символов в двоичные кодировки, которые могут быть распознаны компьютерами.

Обычно набор символов эквивалентен одной кодировке и системе ANSI (ANSI – это код символа, который, чтобы компьютер поддерживал больше языков, обычно использует диапазон 0x80~0xff из 2 байтов для представления 1 символа), например как ASCII, ISO 8859-1, GB2312, GBK и так далее. В общем, мы говорим, что одна кодировка предназначена для определенного набора символов.
В наборе символов также может быть несколько кодировок, таких как UTF-8, UTF-16, UTF-32 и т. д., например, набор символов UCS (также набор символов, используемый Unicode).

С исторической точки зрения компьютерное кодирование символов состоит примерно из трех этапов:
Первый этап: набор символов ASCII и кодирование ASCII.
Компьютер только начинает поддерживать английский язык (то есть латинские символы), и другие языки не могут быть сохранены и отображены на компьютере. ASCII использует 7 бит (бит) одного байта (байта) для представления одного символа, а первая позиция равна 0. Позже, чтобы показать больше европейских символов, обычно используются символы и расширенный ASCII, а также EASCII,EASCII с 8 битов для представления символа, так что он может представлять более 128 символов, поддерживая некоторые западноевропейские символы.

Второй этап: кодировка ANSI (локализованная).
Чтобы компьютер мог поддерживать больше языков, вы обычно используете диапазон 0x80~0xff из 2 байтов для представления 1 символа. Например: китайские иероглифы 'in' в китайской операционной системе с использованием [0xd6,0xd0] Эти два байта памяти.
Разные страны и регионы разработали разные стандарты, в результате чего появились GB2312, BIG5, JIS и другие стандарты кодирования. Они используют 2 байта для представления символа различных кодировок расширения китайских символов, называемых кодировкой ANSI.В упрощенной китайской системе кодировка ANSI представляет кодировку GB2312, а в японской операционной системе кодировка ANSI представляет код JIS.
Различные кодировки ANSI несовместимы, и при международном обмене информацией текст на двух языках не может храниться в одном фрагменте текста в кодировке ANSI.

Этап третий: UNICODE (интернационализация)
Чтобы облегчить международный обмен информацией, международные организации разработали набор символов UNICODE, который устанавливает единый и уникальный числовой номер для каждого символа на каждом языке в соответствии с требованиями межъязыковое, кроссплатформенное преобразование и обработка текста. UNICODE распространен тремя способами: UTF-8 (1 байт), UTF-16 (2 байта), UTF-32 (4 байта таблицы).

Мы можем использовать древовидную диаграмму для представления различных наборов символов и кодовых ветвей, которые произошли от ASCII:


Рисунок 1. Компиляция различных типов

Если вы хотите узнать больше о наборах символов и кодировках символов, см.:
Набор символов и кодировка символов (Charset & Encoding)

Многобайтовые и широкосимвольные компаунды в инженерии

Щелкните правой кнопкой мыши имя своего проекта->свойства, установите следующим образом:


Рисунок 2:Набор символов

      Если установлено использование набора символов Unicode, будут предварительно скомпилированы макросы: _unicode, Unicode

    В чем разница между набором символов Unicode и набором многобайтовых символов? Давайте рассмотрим пример:
    Есть программа, которая должна открыть всплывающее окно с окном MessageBox:

    Приведенная выше демонстрация очень проста, если не сказать больше! Когда мы устанавливаем для набора символов значение «Многобайтовый набор символов», мы можем нормально компилироваться и работать. Но когда мы устанавливаем его в набор символов Unicode, у нас возникает следующая ошибка компиляции:

    Ошибка C2664: 'MessageBoxW': невозможно преобразовать параметр 2 из 'const char [+]' в 'LPCWSTR'

    Это связано с тем, что MessageBox имеет две версии, одну MESSAGEBOXW для версии Unicode и одну для MessageBoxA для многобайтовой версии, и они разделены разными макросами, которые используют разные версии предустановленных макросов. Мы использовали набор символов Unicode для предустановки макросов _UNICODE, Unicode, поэтому во время компиляции будет использоваться MessageBoxW, когда мы передаем многобайтовую постоянную строку, это определенно проблема, но следует передать строку широких символов, будет «Title» в L " На нем же "Это тестовая программа!".

    Приведенный выше набор многобайтовых символов обычно относится к набору символов ANSI (многобайтовый), а для ANSI используется набор символов второй полосы (набор символов) и кодировка символов (кодировка). Набор символов Unicode — это набор символов Unicode, который обычно относится к Unicode в кодировке UTF-16. То есть каждый символ кодируется двумя байтами, два байта могут представлять 65 535 символов, а 65 535 символов могут представлять большинство языков мира.

    Обычно рекомендуется Unicode, так как его можно адаптировать к языку каждой страны и он будет широко использоваться в международном программном обеспечении. мы используем многобайтовые методы только тогда, когда требования к памяти очень высоки или если вы хотите быть совместимым с кодом C.

    Знакомство с макросом _t(), _text() или L ""

    Помимо использования L "заголовок" в вызове MessageBox в предыдущем разделе, вы также можете использовать _t ("заголовок") и _text ("заголовок"). И вы обнаружите, что _t и _text чаще используются в программах MFC и WIN32, в чем разница между _t, _text и L?

    Благодаря многобайтовому символу на первой полосе и расширенному байтовому символу мы знаем, что можно обозначить многобайтовую символьную (char) строковую константу в общих двойных кавычках, таких как "string Test", и широкобайтовый символ. символьная (wchar_t) строковая константа с буквой L, например, L "проверка строки" перед кавычками.

    Посмотрев определение файла заголовка Tchar.h, мы знаем, что функции _t и _text одинаковы, это предопределенный макрос.

    Давайте посмотрим на определение __t (x) и обнаружим, что его два:

    Ясно? Когда набор символов нашего проекта настроен на использование набора символов Unicode, _t и _text будут предшествовать постоянной строке с L, в противном случае (то есть при использовании многобайтового набора символов) он будет рассматриваться как общая строка.

    Dword, LPSTR, LPWStr, LPCSTR, LPCWSTR, LPTSTR, LPCTSTR

    VC + + Существуют некоторые распространенные макросы, которые вы можете спутать, например DWORD, LPSTR, LPWStr, LPCSTR, LPCWSTR, LPTSTR, LPCTSTR. Подведем итог:
    Распространенные макросы:

    < td>LPWStr < td>Const tchar*
    тип MBCS UNICODE
    WCHAR wchar_t wchar_t
    LPSTR char* char*
    LPCSTR Const char* Const char*
    wchar_t* wchar_t*
    Lpcwstr Const wchar_t* Const wchar_t*
    TCHAR Char wchar_t
    LPTSTR tchar* (или char*) tchar* (или wchar_t*)
    Lpctstr Const tchar*

    Методы взаимного преобразования:
    LPWSTR->LPTSTR:W2T ();
    LPTSTR->LPWSTR:T2W ();
    LPCWSTR->LPCSTR:W2CT ();
    LPCSTR->LPCWSTR:T2CW();

    Строковые функции:
    Существуют также некоторые функции манипулирования строками, и они также имеют отношение взаимного соответствия:

    MBCS UNICODE
    Strlen();< /td> Wcslen();
    strcpy(); wcscpy();
    strcmp(); WCSCMP();
    Strcat(); Wcscat();
    STRCHR(); WCSCHR();
    . .< /td>

    С этими функциями и именем макроса вы, возможно, обнаружили некоторую закономерность, обычно префикс w (или суффикс W) используется для широких символов, без префикса w (или с суффиксом a) обычно используется для многобайтовых символов. символов.

    Понимание причин CString и механизма работы

    CString: динамический массив TCHAR, который является своего рода оболочкой массива TCHAR. Это совершенно отдельный класс, который инкапсулирует такие операторы, как "+" и методы работы со строками, другими словами, CString представляет собой набор методов для операций TCHAR. Его роль заключается в облегчении программы WIN32 и программ MFC для обработки строк и преобразования типов.

    Для получения более подробной информации об использовании CString см.:
    Разница и преобразование между CString и строкой, char*
    Общее использование CString

    Справочная статья:
    Набор символов и кодировка символов (Charset & Encoding)
    Символы, байты и кодировки
    "Серия статей по программированию ядра Windows" Два разговора о наборах символов ANSI и Unicode
    Dword, LPSTR, LPWStr, LPCSTR, LPCWSTR, LPTSTR, LPCTSTR

    Turn: поиграйте с визуальной студией — с вашим пониманием многобайтового кодирования с кодом Unicode

    В результате глубокого изучения кода hMailServers C/C++ я обнаружил ряд функций и типов данных, поддерживающих MBCS (многобайтный),
    например, пространство имен HM:String, которое определяется как строка ANSI.

    Мне было интересно прочитать об этом в книге Джеффри Рихтерса "Windows via C/C++ 5th on Page 15"

    Начиная с Windows NT, все версии Windows создаются с нуля с использованием Unicode. То есть все
    основные функции для создания окон, отображения текста, выполнения операций со строками и т. д.
    требуют строк Unicode. Если вы вызываете какую-либо функцию Windows, передавая ей строку ANSI (строку
    из 1-байтовых символов), функция сначала преобразует строку в Unicode, а затем передает строку Unicode
    операционной системе. Если вы ожидаете, что функция вернет строки ANSI, система
    преобразует строку Unicode в строку ANSI перед возвратом в ваше приложение. Все эти преобразования происходят незаметно для вас. Конечно, система
    выполняет все эти преобразования строк, тратя время и память.

    Я думаю, что в 2019 году нам больше не нужны ANSI и многобайтовые коды, и мы должны удалить их.
    Мы должны просто придерживаться Unicode, и в результате мы получим некоторую скорость для всех строковых операций, а общая
    база кода должна уменьшиться без потери каких-либо функций.

    martin Developer
    Сообщений: 6843 Присоединился: 2003-11-21 01:09 Местоположение: Швеция Контакт:

    Хм, давно я не смотрел на этот код. В hMailServer есть два типа строк: HM::String и HM::AnsiString. HM::String внутренне полагается на wchar_t, а HM::AnsiString полагается на char.

    Значит, HM::String, на которую вы ссылаетесь, на самом деле не ANSI, а UTF-16LE, верно?

    hMailServer также использует HM::AnsiString (char). Идея заключалась в том, чтобы использовать его в местах, где использование строк в кодировке Unicode не имеет смысла. Например, текст, отправленный по SMTP/POP3/IMAP, не будет использовать кодировку Unicode. Другим примером являются функции запросов для MySQL, которые принимают char*, а не wchar_t*. Если у вас есть алгоритм, который хочет сканировать последовательность символов, передача wchar_t* может привести к проблемам, поскольку каждый фактический символ может представлять> 1 байт.

    На самом деле я забыл часть этого, но мне кажется, что в настоящее время он использует UTF-16LE для большинства случаев (String), но все еще использует AnsiString. Я вас неправильно понял?

    Dravion Senior user
    Сообщений: 1740 Присоединился: 26.09.2015 11:50 Местоположение: Германия Контактное лицо:

    Хм, давно я не смотрел на этот код. В hMailServer есть два типа строк: HM::String и HM::AnsiString. HM::String внутренне полагается на wchar_t, а HM::AnsiString полагается на char.

    Пока мы говорим о LE процессора x86, он может поддерживать формат порядка наименьших значащих байтов (LSB).
    Это будет другой разговор с процессорами, отличными от x86.

    VS позволяет указать глобально, установив макрос _UNICODE или _MBCS, как обрабатываются типы данных, такие как char или wchar_t.
    Если ваш исходный файл ИЛИ включенный заголовочный файл ИЛИ ваш препроцессор проекта Visual Studio установлен на _MBCS, это классический тип данных c char.
    Но если для него задано значение _UNICODE, объявления типа char* foo; автоматически обрабатывается как w_char* foo;

    Вы можете отменить это поведение в любое время, используя вызов API для ANSI или широких символов в своем коде, но это делает код более нечитаемым
    и трудным для понимания. Вот почему я думаю, что установка по умолчанию _UNICODE в главном файле проекта VC++ hMailServer имеет смысл.

    Вы просто должны помнить, что char* — это w_char*, если вы используете его в своем коде.

    Кроме того, это ускорит выполнение кода, поскольку нет необходимости в приведении типов, поскольку Windows API может обрабатывать w_char 1:1.

    hMailServer также использует HM::AnsiString (char). Идея заключалась в том, чтобы использовать его в местах, где использование строк в кодировке Unicode не имеет смысла. Например, текст, отправленный по SMTP/POP3/IMAP, не будет использовать кодировку Unicode. Другим примером являются функции запросов для MySQL, которые принимают char*, а не wchar_t*. Если у вас есть алгоритм, который хочет сканировать последовательность символов, передача wchar_t* может привести к проблемам, поскольку каждый фактический символ может представлять> 1 байт.

    На самом деле я забыл часть этого, но мне кажется, что в настоящее время он использует UTF-16LE для большинства случаев (String), но все еще использует AnsiString. Я вас неправильно понял?

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

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

    BeSmart Новый пользователь
    Сообщений: 7 Присоединился: 21 мая 2019 г., 10:26

    Простое использование Unicode для всех и каждого, безусловно, не самое разумное решение, и есть веская причина использовать ANSI только для областей ANSI. Разработка программного обеспечения заключается не в простоте, а в правильном выполнении работы. Кроме того, Unicode уже включен для приложений MFC по умолчанию.

    Dravion Senior user
    Сообщений: 1740 Присоединился: 26.09.2015 11:50 Местоположение: Германия Контактное лицо:

    Простое использование Unicode для всех и каждого, безусловно, не самое разумное решение, и есть веская причина использовать ANSI только для областей ANSI. Разработка программного обеспечения заключается не в простоте, а в правильном выполнении работы. Кроме того, Unicode уже включен для приложений MFC по умолчанию.

    MS хочет, чтобы мы использовали Unicode для каждого проекта.
    Это мудрое решение, поскольку Windows NT всегда была и всегда будет использовать Unicode в первую очередь.
    О типах строк. Вы не должны приводить что-либо явно к Multibyte или Unicode, прежде чем проверять, безопасно ли это для Socket Connections.
    Если вы используете этот тип кастинга, это рецепт для Кошмара Безопасности. Кто-то может внедрить всевозможные символы, пытаясь обмануть формат
    определения строк и передать непроверенные символы непосредственно в стек и вызвать переполнение буфера, внедрить вредоносный двоичный код оболочки в качестве полезной нагрузки и получить права суперпользователя ЛОКАЛЬНОЙ МАШИНЫ (это псевдоним для СИСТЕМА NT Учетная запись пользователя, которая имеет самые высокие
    разрешения, возможные в операционной системе Windows типа Windows NT).

    Единственное, что нужно злоумышленнику, — это изучить исходный код сокета hMailServers, найти ошибку в строке формата ANSI/UNICODE, подготовить
    полезную нагрузку с помощью Metasploit и бум. Вот почему вы не должны смешиваться с последовательностями Multibyte 2 и Widechar 4 Byte.

    В компьютере символы обычно не сохраняются в виде изображений. Каждый символ представлен кодировкой. И какой код использует каждый символ для представления. Это зависит от используемого набора символов (кодировки).

    Многобайтовый набор символов:

    Вначале в Интернете существует только один набор символов — ANSI из набора символов ASCII. Он ИСПОЛЬЗУЕТ 7 бит для представления символа. Всего это означает 128 символов, включая английские буквы, цифры, знаки препинания и другие распространенные символы. персонажи . после , А затем расширить , Использовать 8 бит Представляет символ , Можно сказать 256 символов , В основном в исходных 7 бит Некоторые специальные символы добавляются к набору символов . позже, с добавлением языков со всего мира, ASCII больше не может удовлетворять потребности в обмене информацией, чтобы иметь возможность выражать слова других стран, страны в ASCII на основе развития своих собственных набор символов. Они взяты из набора символов, производных от стандарта ANSI, обычно называются набором символов ANSI. Их официальное название должно быть MBCS (многобайтовая система символов, многобайтовая система символов). Эти производные наборы символов характеризуются 127 битами ASCII, совместимыми с ASCII 127, они используют более 128 в качестве начального байта, идут в ногу с начальным байтом после второго (даже третьего) символов и начального байта вместе как фактическое кодирование. Таких наборов символов много. Наш общий GB-2312 — один из них.

    Набор символов Unicode:

    Unicode Научное название yes «Универсальный кодированный набор символов из нескольких октетов», именуемый UCS.UCS. Его можно рассматривать как «Набор символов Unicode». Аббревиатура. 、 Сохраните этот код .UTF да Аббревиатура «формат преобразования UCS» .

    UTF-16 Существует три вида: UTF-16,UTF-16BE(Big Endian),UTF-16LE(Little Endian),UTF-16. Вам нужно начать файл с именем BOM(Byte Order Mark) Чтобы указать, что файл имеет формат Big Endian, по-прежнему Little Endian. Unicode. Рекомендуемый способ маркировки порядка байтов в спецификации — BOM ​​(метка порядка байтов). остаться UCS Существует код под названием "ZERO WIDTH NO-BREAK SPACE" Символы , Его код FEFF. и FFFE остаются UCS. Это несуществующий символ, поэтому его не должно быть в фактической передаче. UCS Спецификация предполагает, что мы передаем поток байтов до того, как сначала передаются символы «НУЛЕВАЯ ШИРИНА БЕЗ-РАЗРЫВА ПРОБЕЛА». Итак, если получатель получает FEFF, это означает, что поток байтов имеет формат Big-Endian Of ; Если вы получаете FFFE, это означает, что поток байтов имеет Little-Endian Of . Итак, символ "ZERO WIDTH NO-BREAK SPACE", также известный как BOM.

    Нежелательная спецификация UTF-8. Чтобы указать порядок байтов, но вы можете использовать спецификацию, чтобы показать, как кодировать. символ "НУЛЕВАЯ ШИРИНА БЕЗ РАЗРЫВА ПРОБЕЛ" UTF-8 Кодировка EF BB BF( Читатели могут использовать метод кодирования, который мы представили ранее для проверки). Итак, если получатель получает EF BB BF Первый поток байтов, я знал, что это кодировка UTF-8.

    Windows Используется ли спецификация для обозначения кодировки текстового файла.

    L Он используется для обозначения символа (цепочки) широкими символами (цепочка). Когда вы находитесь в VS2005. Предыдущие версии IDE Рабочие часы, Вы можете работать в этих двух разных методах кодирования И в Unicode. , Символ ( прядь ) Доп. Перед константой L Чтобы сообщить компилятору, что это расширенный символ. MS Для нас определены несколько связанных макросов: _T (определено в tchar.h), _TEXT (также определено в tchar.h).

    TEXt(): Если вы определяете Unicode, идентификационным символом будет Unicode; в противном случае -- с помощью набора символов ANSI . остаться VS2010 Использовать набор символов Unicode:

    Зачем использовать Unicode?( Вот цитата из 《Windows Programming core》)
    При разработке приложений настоятельно рекомендуется использовать символы и строки Unicode по следующим причинам:

    wchar_t и char Преобразование между типами:

    Многобайтовый набор символов и Unicode Дополнительные статьи о наборах символов

    Набор символов ASCII . Развернуть Набор символов ASCII .Unicode Сколько символов поддерживает набор символов? 256 символов и 65 536 символов

    1 Многобайтовый набор символов, например, "IT Let's Learn", sizeof Длина памяти равна 7, Поскольку передняя часть 2 Каждая буква занимает один байт, Последние два китайских символа занимают по 2 байта, В конце \0 Занять один байт .strlen То есть результат длины строки равен 6. .

    Проблема 1: Зачем нужны символы ASCII-кода .Unicode-кода и так далее . Что именно они делают? Прежде всего, поймите тот факт, что: В компьютере вы можете использовать только последовательность сохраненных 0 и 1, Когда мы сохраняем символ в компьютере, Как мы представляем общие символы.

    Набор символов Unicode, код utf8, кодировка base64 проста для понимания. Набор символов Unicode, ASCII, наборы кодирования GB2312 и т. д., Аналогично различным словарям, Различная кодировка символов, Аналогично словам в словаре, на какой странице и в какой строке . Когда разные отделы .

    В последней статье вы познакомитесь с Visual Studio—— Вытащите вас из ямы Библиотека среды выполнения Яма помогает нам понять Windows Различные типы C/C++ Библиотека среды выполнения и ее контекст. Это C++ В нем особенно легко сбиться с пути в разработке.

    Каталог (?)[-] Многобайтовые символы и широкобайтовые символы char И wchar_t строка И wstring строка И wstring Соответствующее преобразование набора символов Набор символов И кодировка символов Кодировка .

    Набор символов нашего программного файла написан нами .c Набор символов файла с расширением, Вот системный набор символов ANSI по умолчанию, Вот картинка: Нас не волнует набор символов, указанный выше, Что нас волнует about is Набор символов исходной программы И процедурный набор символов Execute, Слово исходной программы.

    Случайная рекомендация

    asp.net Функция закрытия текущей страницы :Response.Write("");// Всплывающий вопрос: .

    При использовании Android Studio При разработке используются сторонние библиотеки SlidingMenu (теперь это не рекомендуется), При всем этом, Но нам нужно знать, как импортировать стороннюю библиотеку, После ознакомления с различными материалами, я знаю простой и доступный метод .

    SHOW CREATE TABLE Имя таблицы \G Предисловие В объяснении базы данных, На самом деле, многие вещи очень подробны, В предыдущем процессе обучения я не заметил. Может быть в дальнейшей работе столкнусь, поэтому сделаны записи. Далее , чем я собираюсь поделиться .

    $on Обычно используется для прослушивания пользовательских событий. Параметры могут быть переданы после срабатывания // мониторинга события event1 vm.$on('event1',function(msg)< console.log(msg) >) // срабатывания событие1 Настроить .

    Прежде всего, хорошо поработайте над конфигурацией среды, оставайтесь в mvc.xml. Конфигурация в 1. Включите сканирование компонентов 2. На основе открытой аннотации mvc 3. Настройте процессор

    Надежда — это хорошо, Но только размышления. Пятая глава — это сводка знаний [Трехуровневый механизм системного вызова (Далее)] Глубокое понимание процесса системного вызова system_call Это не обычная функция, Это просто начало фрагмента ассемблерного кода, И куча вызовов функций — это не строго соблюдается внутри .

    В последней статье вы познакомитесь с Visual Studio, вытащите вас из ямы библиотеки времени выполнения, чтобы помочь нам понять различные типы библиотек времени выполнения C/C++ в Windows и их тонкости, которые особенно легко отклонить в разработке C++ Мы обобщили и обобщили не в том месте. В этой статье мы продолжим объяснять еще одну концепцию, которую легко спутать при разработке C++ — многобайтовый набор символов и набор символов Unicode.

    Узлы следующие:

    wchar_t называется расширенным символом , а wchar_t занимает 2 байта. Причина, по которой он называется широким символом, заключается в том, что все символы должны быть представлены двумя байтами (т. е. wchar_t), будь то английский или китайский языки. Посмотрите на следующий пример:

    Результаты следующие:

    Описание:

    1. При использовании константных символов для присвоения значения переменной wchar_t добавьте L впереди. Например: wchar_t wch2 = L'中';
    2. При присвоении значения массиву wchar_t с постоянной строкой добавьте L впереди. Например: wchar_t wstr2[3] = L"Китай";
    3. Если буква L не добавлена, это нормально для английского языка, но не для языка, отличного от английского (например, для китайского).

    Строка — это обычная многобайтовая версия, основанная на char, своего рода инкапсуляции массива char.

    wstring — это версия Unicode, основанная на wchar_t, инкапсуляции массива wchar_t.

    **Кодировка символов:** – это набор правил, которые можно использовать для сопоставления набора символов (например, алфавита или таблицы слогов) символов естественного языка с двоичными числами, которые может распознать компьютер. То есть он может установить соответствующую связь между набором символов и цифровой системой, которая является базовой технологией обработки информации. Обычно люди используют набор символов (как правило, слов) для выражения информации, тогда как компьютерные системы обработки информации используют двоичные числа для хранения и обработки информации. Кодировка символов — это преобразование символов в двоичные коды, которые может распознать компьютер.

    Как правило, набор символов эквивалентен методу кодирования, системе ANSI (ANSI – это код символа, чтобы компьютер поддерживал больше языков, обычно используйте 2 байта в диапазоне 0x80~0xFF для представления 1 символа) набор символов, такой как ASCII, ISO 8859-1, GB2312, GBK и так далее. Обычно мы говорим, что кодировка предназначена для определенного набора символов.
    В наборе символов также может быть несколько методов кодирования. Например, существуют такие методы кодирования, как UTF-8, UTF-16 и UTF-32 в наборе символов UCS (также наборе символов, используемом Unicode).

    С точки зрения истории развития компьютерного кодирования символов, оно, вероятно, прошло три этапа:
    первый этап: набор символов ASCII и кодирование ASCII.
    Компьютер поддерживает только английский язык (то есть латинские символы) в начале, а другие языки не могут быть сохранены и отображены на компьютере. ASCII использует 7 битов байта для представления символа, а первая позиция равна 0. Позже, чтобы выразить более часто используемые европейские символы, ASCII был расширен. С EASCII EASCII использует 8 бит для представления символа, поэтому он может представлять на 128 символов больше и поддерживает некоторые западноевропейские символы.

    Второй этап: кодировка ANSI (локализация)
    чтобы компьютер поддерживал больше языков, обычно для представления 1 символа используются 2 байта в диапазоне 0x80~0xFF. Например: китайский иероглиф «中». В китайской операционной системе для хранения используются два байта [0xD6,0xD0].
    Разные страны и регионы сформулировали разные стандарты, что привело к их собственным стандартам кодирования, таким как GB2312, BIG5, JIS. Эти расширенные методы кодирования различных китайских символов, которые используют 2 байта для представления символа, называются кодировкой ANSI. В упрощенной китайской системе код ANSI представляет собой код GB2312, а в японской операционной системе код ANSI представляет собой код JIS.
    Разные коды ANSI несовместимы друг с другом. При международном обмене информацией невозможно хранить тексты на двух языках в одном и том же кодированном тексте ANSI.

    Третий этап: UNICODE (Интернационализация)
    Чтобы сделать международный обмен информацией более удобным, международные организации разработали набор символов UNICODE, установив единый и уникальный номер для каждого символа в различных языках для удовлетворения потребности кросс-языка, кросс-платформенное преобразование текста и требования к обработке. UNICODE имеет три распространенных метода кодирования: UTF-8 (представление 1–4 байта), UTF-16 (представление 2 байта)), UTF-32 (представление 4 байта).

    Мы можем использовать древовидную диаграмму для представления различных наборов символов и ветвей кодирования, разработанных на основе ASCII:

    1. Если установлено значение "Использовать набор символов Unicode", будут предварительно скомпилированы макросы: _UNICODE, UNICODE

    Вышеупомянутая демонстрация очень проста и излишня говорить! Когда мы устанавливаем набор символов в многобайтовый набор символов, он может нормально компилироваться и работать. Но когда мы установим набор символов Unicode, будут следующие ошибки компиляции:

    ошибка C2664: "MessageBoxW": невозможно преобразовать параметр 2 из "const char [18]" в "LPCWSTR"

    Это связано с тем, что существует две версии MessageBox: одна для MessageBoxW для Unicode, а другая для MessageBoxA для нескольких байтов. Они разделены разными макросами, и разные макросы настроены на использование разных версий. Мы используем Use Unicode Character Set для установки макросов _UNICODE и UNICODE, поэтому MessageBoxW будет использоваться при компиляции. В это время у нас определенно будут проблемы, когда мы будем передавать многобайтовую константную строку, а мы должны передавать широкую символьную строку. Просто измените «Заголовок» на L «Заголовок», «Это тестовая программа!» то же самое.

    Приведенный выше многобайтовый набор символов обычно относится к набору символов ANSI (многобайтовый). Для ANSI см. второй подраздел «Набор символов» (Charcater Set) и «Кодировка символов» (Encoding). Набор символов Unicode — это набор символов Unicode, обычно относящийся к Unicode в кодировке UTF-16. То есть каждый символ закодирован как два байта, два байта могут представлять 65 535 символов, а 65 535 символов могут представлять большинство языков в мире.

    Обычно рекомендуется использовать Unicode, поскольку он может адаптироваться к различным национальным языкам и будет очень удобен при разработке программного обеспечения на международном уровне. Если требования к хранилищу не очень высоки или совместимы с кодом C, мы будем использовать многобайтовый подход.

    Из первого подраздела многобайтовых символов и широкобайтовых символов мы знаем, что при выражении многобайтовых символьных (char) строковых констант они могут быть заключены в общие двойные кавычки, такие как «Проверка строки»; и это означает широкобайтовые символы ( Когда wchar_t ) строковые константы, добавьте L перед кавычками, например L "Тест строки".

    Глядя на определение файла заголовка tchar.h, мы знаем, что _T и _TEXT имеют одну и ту же функцию, которая является предопределенным макросом.

    Давайте еще раз посмотрим на определение __T(x) и обнаружим, что его два:

    Теперь вы понимаете?Когда для набора символов нашего проекта установлено значение «Использовать набор символов Unicode», _T и _TEXT добавят L перед константной строкой, в противном случае (то есть при использовании многобайтового набора символов) он будет обработан как обычная строка. .

    ТипыMBCSUNICODE
    WCHARwchar_twchar_t
    LPSTRchar*char *
    LPCSTRconst char*const char*
    LPWSTRwchar_t*wchar_t*
    LPCWSTRconst wchar_t*const wchar_t*
    TCHARcharwchar_t
    LPTSTR TCHAR* (или char*)TCHAR* (или wchar_t*)
    LPCTSTR константа TCHAR*константа TCHAR*

    Метод взаимного преобразования:
    LPWSTR->LPTSTR : W2T();
    LPTSTR->LPWSTR: T2W();
    LPCWSTR->LPCSTR: W2CT();
    LPCSTR->LPCWSTR: T2CW();

    ANSI->UNICODE: A2W();
    UNICODE->ANSI: W2A();

    Строковые функции:
    Существуют также некоторые функции работы со строками, они также имеют взаимно однозначное соответствие:

    MBCSUNICODE
    strlen(); wcslen();
    strcpy();wcscpy();
    strcmp();wcscmp();
    strcat();wcscat();
    strchr();wcschr();

    В названии этих функций и макросов можно найти некоторые законы Хуо. Как правило, символы с префиксом w (или суффиксом W) используются для широких символов, а символы без префикса w (или суффикса A) обычно используются для многобайтовых символов.

    Содержание, которое будет описано в следующей статье:
    Познакомите вас с Visual Studio, чтобы вы могли интерпретировать три соглашения о вызовах __cdecl, __fastcall и __stdcall

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