Что Microsoft использует в качестве типа данных для строк Unicode? - PullRequest
5 голосов
/ 27 августа 2009

Я нахожусь в процессе изучения C ++ и наткнулся на статью о MSDN здесь:

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

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

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

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

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

#define UNICODE 

ИЛИ

#define _UNICODE

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

wchar_t

Он добавляет в смесь макрос и тип гибридного типа данных, причем макрос:

_TEXT(t)

, который просто добавляет строку с префиксом L и гибридным типом данных как

TCHAR 

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

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

Приветствия

Andrew

Ответы [ 4 ]

12 голосов
/ 27 августа 2009

Для всех новых программ вы должны определить UNICODE и напрямую использовать wchar_t. Использование ANSI заставит вас снова преследовать.

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

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

5 голосов
/ 27 августа 2009

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

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

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

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

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

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

2 голосов
/ 27 августа 2009

В Windows это wchar_t с кодировкой UTF-16 (2 байта).

Источник: http://www.firstobject.com/wchar_t-string-on-linux-osx-windows.htm

1 голос
/ 27 августа 2009

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

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

...