Предварительное замечание: Unicode и символов Unicode в этом ответе, учитывая контекст самого вопроса, относится к UCS-2 (до XP) и UTF-16 (начиная с XP), которые взаимозаменяемы с широким символом, wchar_t
, WCHAR
и другими терминами в контексте Win32 API. Стандарты Unicode предлагают несколько кодировок, таких как UTF-8, UTF-16 и UTF-32 для кодирования одинакового количества символов - разные воплощения стандарта имеют разную область. Суррогатные коды используются для выхода из базовой многоязычной плоскости (BMP), примерно первых 64K кодовых точек, и, следовательно, кодируют более, чем могут быть закодированы с 16-битными символами и одним символом для кодовой точки. Суррогатные расширения были разработаны для стандарта Unicode 2.0, который был принят в течение года, когда был выпущен NT 4.0, но в некоторые годы после была выпущена первая версия Unicode для Windows, NT 3.51. Это первоначальный стандарт не учитывает больше символов, чем в BMP и поэтому Unicode символов или широкий характер даже сейчас используется синоним Unicode в контексте API Win32, хотя это неточно.
Чтобы ответить на вопрос, который вы основной поднятую:
ли wchar_t
строки просто не сравнимы с использованием "==" оператор?
Нет, они не являются ни строками, ни ANSI, то есть в качестве основы используется тип char
. Помните, что строка C (как wchar_t
, так и char
) является указателем. Это означает, что с ==
вы сравнивали два значения указателя, которые были определенно не равны. В конце концов, это буквальная строка (т. Е. Внутри вашего образа программы), а другая - где-то в куче. Таким образом, они определенно являются двумя разными сущностями.
Если вы хотите использовать ==
вам придется использовать язык, такие как C++ с STL класса std::string
(или std::basic_string<_TCHAR>
) или (в Windows) в АТЛ класса CString
(или скорее CStringT
). Эти классы иногда называются классами умных строк и используют средство C++ для переопределения operator==()
. Однако вы должны иметь в виду, что семантика отличается в зависимости от реализации, поэтому не каждый класс умной строки будет сравнивать содержимое строки. Некоторые могут просто сравнить равенство this
(т. Е. Это один и тот же экземпляр), в то время как другие могут сравнивать содержимое строки, нечувствительное к регистру или чувствительное к регистру по своему усмотрению.
Для сравнения строк C у вас есть следующие функции, доступные для вашего сценария использования:
- Для "ANSI" символы (
char
) строк: strcmp
, _stricmp
(и "подсчитанная" варианта: _strncmp
, _strnicmp
... есть больше)
- Для символов Unicode (
wchar_t
) строк: wcscmp
, _wcsicmp
(и "насчитали" варианты: _wcsncmp
, _wcsnicmp
... есть больше)
- Для переменного символа "типа" (
TCHAR
) строк: _tcscmp
, _tcsicmp
(и "учтенных" вариантов: _tcsncmp
, _tcsnicmp
... есть больше)
Вы можете запомнить эти префиксы:
str
-> строка
wcs
-> широкий символьная строка
tcs
- строка> T символов
Примечание стороны: с #include <tchar.h>
и windows.h
макросы TEXT
и _T
эквивалентна и используются, чтобы объявить строковый литерал, который будет либо «ANSI» или Unicode в зависимости от определяю, в наращивании времени. То же самое справедливо и для _TCHAR
и TCHAR
, в то время как последнее, по-видимому, выступает в контексте Win32 API.
Таким образом, сборка Unicode расширит _T("something")
до L"something"
, в то время как сборка «ANSI» расширит ее до "something"
.
Как TCHAR, рассмотрим чтение через аргументы, изложенные в: Is TCHAR still relevant? (указал rubenvb) Есть действительные пункты за и против TCHAR
/_TCHAR
использования, и вы должны принять решение и придерживаться его - т.е. быть последовательным.
1. Строки нельзя сравнивать таким образом. 2. См. Это: http://www.codeproject.com/Articles/76252/What-are-TCHAR-WCHAR-LPSTR-LPWSTR-LPCTSTR-etc – Ajay