2009-08-27 5 views
5

Я нахожусь в процессе обучения C++ и наткнулся на статью на сайте MSDN здесь:Что Microsoft использует в качестве типа данных для строк Unicode?

http://msdn.microsoft.com/en-us/magazine/dd861344.aspx

В первом примере кода одной строки кода, который мой вопрос касается заключается в следующем:

VERIFY(SetWindowText(L"Direct2D Sample")); 

Более конкретно, этот префикс L. Я немного прочитал и исправлю, если я ошибаюсь :-), но это нужно для строк unicode, т. Е. Для подготовки к длинному набору символов. Теперь в течение моего чтения на этом я наткнулся на другую статью на Adavnced Струнных методов в C здесь http://www.flipcode.com/archives/Advanced_String_Techniques_in_C-Part_I_Unicode.shtml

Он говорит, что есть несколько вариантов, в том числе включения в заголовке:

#define UNICODE 

ИЛИ

#define _UNICODE 

в C, снова укажите, если я ошибаюсь, оцените ваши отзывы. Далее, она показывает тип данных, подходящие для этого Юникода строки является:

wchar_t 

Это бросает в смеси макро и вида гибридного типа данных, макро существо:

_TEXT(t) 

который просто префиксы строки с л и гибридный тип данных,

TCHAR 

что это указывает, позволит юникода, если заголовок есть и ASCII, если нет. Теперь мой вопрос, или более предположение, которое я хотел бы подтвердить, использовал бы Microsoft этот тип данных TCHAR, который является более гибким или есть какая-либо польза от использования wchar_t.

Также, когда я говорю, Microsoft использует это, более конкретно для exmaple в библиотеках ATL и WTL, есть ли у кого-либо из вас предпочтения или есть какие-то рекомендации относительно этого?

Приветствия,

Эндрю

+0

Спасибо за отзывы каждого! Ценить это! :-) –

ответ

12

Для всех нового программного обеспечения, вы должны определить UNICODE и использовать wchar_t непосредственно. Использование эффектов ANSI вернется, чтобы преследовать вас.

Вы должны просто использовать wchar_t и широкие версии всех функций CRT (например: wcscmp вместо strcmp). Макросы TEXT и TCHAR и т. Д. Существуют только в том случае, если ваш код должен работать в средах ANSI и UNICODE, которые, как мне кажется, редко требуют кода.

При создании нового приложения Windows с использованием Visual Studio UNICODE автоматически определяется, и wchar_t будет работать как встроенный.

1

TCHAR меняет свой тип зависимости, если UNICODE определен, и следует использовать, когда вы хотите код, который вы можете скомпилировать для UNICODE и не-UNICODE.

Если вы хотите явно обрабатывать только данные UNICODE, тогда не стесняйтесь использовать wchar_t.

5

Короткий ответ: гибридная инфраструктура с TCHAR типа, то _TEXT() макро и различные _t* функции (_tcscpy приходит на ум), являются пережитком тех времен, когда Microsoft было два платформ сосуществующих:

  1. окон Строка NT основывалась на строковом представлении Unicode.
  2. Линия Windows 95/98/ME была основана на строчном представлении ANSI.

Строковое представление здесь означает, что все API Windows, которые ожидали или возвращали строку в ваше приложение, использовали одно или другое представление для этих строк. COM добавил еще больше путаницы, поскольку он был доступен на обеих платформах - и ожидал строки Unicode для обоих!

В те давние времена было рекомендовано написать «переносимый» код: вам было поручено использовать гибридную инфраструктуру для ваших строк, чтобы вы могли скомпилировать обе модели, указав/undefining UNICODE и/или _UNICODE для вашего приложение.

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

Остерегайтесь, хотя сегодня Unicode имеет несколько представлений: как указано выше, соглашение Unicode, подразумеваемое wchar_t, является представлением UCS-2 (все символы, закодированные в 16-битных словах). Существуют и другие широко используемые представления, где это не обязательно верно.