Здесь нужно знать о двух разных вещах:
- Сам исходный файл C может не содержать этого символа правильно.
- Тип
char
в семантике фактической программы также не поддерживает этот символ.
Что касается первой проблемы, это зависит от вашей платформы (и т. Д.), Но быть консервативным с источником C наиболее переносимо, что означает использование символов ASCII только в файле кода. Это означает, например, в комментариях, а также в содержательном коде. Тем не менее, многие платформы позволяют и поддерживают символы Unicode внутри исходных файлов.
Что касается второго, char
является старомодным для содержания символов и ограничен октетом, что означает произвольные символы Unicode со значениями выше 0xFF, просто не помещаются внутри них. Я предполагаю, что некоторые не-ASCII-символы зависят от платформы (кодовые страницы Windows?) Выше значения 0x7F, но в этом случае я бы воспринимал это как строку, используя escape-последовательность Юникода для этого символа: "\u221A"
.
char * sqrt = "\u221A";
if (strcmp(sqrt, "\u221A") == 0) {
printf("Working");
} else {
printf("Not working");
}
Обоснование того, что строки C (char*
) на самом деле не рассчитаны на символы не ASCII, так что в этом случае вы в конечном итоге встраиваете кодированное представление UTF8 символа (длиной три байта) в символ строка. Это работает, сохраняет значение, и сравнение работает, но если вы собираетесь работать с юникодом более широко ...
Если ваша платформа поддерживает "широкие символы" (wchar_t
или unichar
или аналогичные), которые могут содержать символы Unicode, то вы можете использовать эти типы для хранения этого символа и выполнять прямые сравнения на равенство, как это делалось:
wchar_t sqrt = L'\u221A';
if (sqrt == L'\u221A') {
...
(К вашему сведению, имейте в виду, что эти широкие типы символов могут быть недостаточно широкими для произвольных кодовых точек Unicode на вашей платформе, поэтому могут работать для символа с квадратным корнем, но не, скажем, для смайликов.)
Наконец, ради полноты, я считаю честью признать, что, учитывая современную среду разработки / набор инструментов и целевой платформы, вы, вероятно, могли бы избежать использования явного символа в литерале widechar вот так:
wchar_t sqrt = L'√';
if (sqrt == L'√') {
....
Но я старомоден, это кажется отрывочным, и я не рекомендую это. :)