Ваш тест показывает не то, что вы думаете.
Функция printf
ожидает строковые параметры ASCII для спецификации формата %s
. UNICODE-представление для буквы a
равно 0x0061, которое хранится в памяти как 0x61, 0x00 (потому что мы имеем дело с системой little-endian ). Поскольку printf интерпретирует память как строку ASCII, 0x61, 0x00 выглядит как строка с нулевым символом в конце, длиной в один символ, так что это то, что вы печатаете.
Больше не имеет смысла использовать TCHAR. Тип TCHAR - это WCHAR или char, в зависимости от того, определен ли макрос UNICODE или нет . TCHAR полезен в тех случаях, когда вы хотите написать код, который может быть скомпилирован дважды - один раз для ASCII и один раз для UNICODE. Например, если вы хотите написать код, который можно скомпилировать для эффективной работы на платформах ASCII (например, Windows 95) и снова скомпилировать для эффективной работы на платформах UNICODE (например, Windows XP).
Теперь, когда все текущие операционные системы Windows изначально являются UNICODE, TCHAR практически не используется и существует некоторый риск его использования.
Например, ваш код TCHAR ch = L'a';
действителен при компиляции для UNICODE, поскольку в этом случае TCHAR определен как WCHAR. Но при компиляции для не UNICODE TCHAR определяется как char, и назначение символа Unicode, такого как L'a'
, для переменной char на самом деле не имеет смысла. Вы не обязательно получите синтаксическую ошибку, но вы также не обязательно получите ожидаемый код.
Примечание Там, где я использовал «ASCII» выше, мне, вероятно, следовало бы сказать «многобайтовый набор символов» или «набор символов не-UNICODE», так как не все наборы символов не-UNICODE являются ASCII.