Windows NT использует Unicode (UTF-16 шириной в два байта) в качестве метода кодирования по умолчанию в API Windows NT. Если вы решите использовать ASCII или многобайтовый набор символов в качестве набора символов по умолчанию, они преобразуют ASCII в Unicode. И использовать набор символов ASCII будет медленнее, чем Unicode.
Что означает это преобразование? Они только преобразовывают ASCII API в Unicode API или преобразовывают все строки?
Например:
Если вы создаете файл C / C ++ с const char* text = "Hello, world!"
, Когда вы компилируете его в Windows NT, хранилище скомпилированных двоичных файлов «Hello, world!» как Unicode (26 байт) или ASCII (13 байт)?
Вы должны решить, какую версию API вы используете: ANSI или Unicode. Либо вы используете функции явно (например, CreateFileA для ANSI, соответственно CreateFileW для Unicode), либо вы используете имя функции без «A» или «W», а переменная препроцессора _UNICODE решает, какая из двух функций используется. Некоторые функции требуют структур, которые содержат строки. Затем есть две версии этих структур (например, OSVERSIONINFOA и OSVERSIONINFOW). В настоящее время нет веских причин для ANSI.
Но это относится только к аргументы, не содержание Если вы записываете строку в файл, используя указатель на данные и их размер, перевод не выполняется.
Чтобы ответить на ваш вопрос: так как вы явно использовали char
занимает 13 байт. Если бы вы использовали wchar
это будет использовать 26 байтов. Вы могли бы написать const TCHAR* text = _T("Hello world!");
и тогда _UNICODE решит.
Компилятор не меняет тип ваших строк. Это закодирует их, как вы объявите их.
Windows NT и ее последующие версии (2000, XP, 2003, Vista, 7, 8, 8.1, 10) внутренне используют 2-байтовые символы (она называет их «широкими символами»). Windows NT раньше использовала UCS-2
кодирование; с Windows 2000 он перешел на UTF-16LE
,
Для большинства его функций API, которые обрабатывают строки, у них есть 2 разные версии; имя того, которое обрабатывает строки ANSI, заканчивается на A
, имя другого заканчивается на W
(«W» от «широких букв»). Набор макроопределений отображает имена без суффиксов на A
или W
версии. Выбор определяется наличием макроса с именем _UNICODE
, Программист, однако, свободен вызывать A
или W
функционировать напрямую, если ситуация требует этого.
Чтобы помочь разработчикам обрабатывать строки широких символов, стандартная библиотека C, предоставляемая Microsoft, содержит набор функций для обработки строк с широкими символами (эквиваленты strlen()
, strcat()
a.s.o). Их имена обычно имеют str
заменено на wcs
,
Программист решает, какую версию каждой функции использовать. В большинстве случаев нет необходимости преобразовывать кодировку (если вы придерживаетесь одного из вышеперечисленных). Однако существуют подсистемы, в которых нет опций: вам нужно преобразовать строки в Unicode, чтобы они работали.
Вы можете прочитать больше о том, как Windows обрабатывает строки в API: https://msdn.microsoft.com/en-us/library/windows/desktop/ff381407%28v=vs.85%29.aspx
Чтобы ответить на ваш вопрос, Windows не меняет ваши строки. Он только внутренне преобразует из ANSI в Unicode строки для передачи в A
версии его функций API. Он также преобразует из Unicode обратно в ANSI (если это возможно), строки, которые возвращаются A
версии функций API (GetWindowTextA()
, например).