Как использовать символ √ в C - PullRequest
2 голосов
/ 16 марта 2019

Я хочу использовать символ в программе, написанной ниже.

#include <stdio.h>
main(){
    char a='√';
    if (a=='√'){
        printf("Working");
    }
    else{
        printf("Not working");
    }
}

не является ASCII, поэтому он не работает.Но я хочу знать, чтобы это сработало.Заранее спасибо.

1 Ответ

8 голосов
/ 16 марта 2019

Здесь нужно знать о двух разных вещах:

  1. Сам исходный файл C может не содержать этого символа правильно.
  2. Тип 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'√') {
    ....

Но я старомоден, это кажется отрывочным, и я не рекомендую это. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...