Бинарный исполняемый файл Windows NT, внутренняя константная строка

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 байт)?

-1

Решение

Вы должны решить, какую версию API вы используете: ANSI или Unicode. Либо вы используете функции явно (например, CreateFileA для ANSI, соответственно CreateFileW для Unicode), либо вы используете имя функции без «A» или «W», а переменная препроцессора _UNICODE решает, какая из двух функций используется. Некоторые функции требуют структур, которые содержат строки. Затем есть две версии этих структур (например, OSVERSIONINFOA и OSVERSIONINFOW). В настоящее время нет веских причин для ANSI.

Но это относится только к аргументы, не содержание Если вы записываете строку в файл, используя указатель на данные и их размер, перевод не выполняется.

Чтобы ответить на ваш вопрос: так как вы явно использовали char занимает 13 байт. Если бы вы использовали wchar это будет использовать 26 байтов. Вы могли бы написать const TCHAR* text = _T("Hello world!"); и тогда _UNICODE решит.

2

Другие решения

Компилятор не меняет тип ваших строк. Это закодирует их, как вы объявите их.

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(), например).

1

По вопросам рекламы [email protected]