Как обратиться к китайскому символу в коде C

У меня есть программа на C, которая в настоящее время читает на китайском языке и сохраняет их как type wchar_t, То, что я хочу сделать, это искать определенный символ в тексте, но я не уверен, как ссылаться на символ в коде.

Я по сути хочу сказать:

wchar_t character;

if (character == 个) {
    return 1;
}

else return 0;

Некоторая логика была опущена, очевидно. Как мне выполнить такую ​​логику на китайском в Си?

Изменить: Получил это на работу. Этот код компилируется с -std=c99 и печатает символ "个".

1 #include <locale.h>
2 #include <stdio.h>
3 #include <wchar.h>
4 
5 
6 int main() {
7         wchar_t test[] = L"\u4E2A";
8         setlocale(LC_ALL, "");
9         printf("%ls", test);
10 }

2 ответа

Решение

В зависимости от вашего компилятора, если он допускает источник в поддерживаемой кодировке Unicode, вы можете просто сравнить его с реальным символом, в противном случае вы можете использовать константу широких символов:

#include <stdio.h>

int main()
{
    int i;
    wchar_t chinese[] = L"我不是中国人。";
    for(i = 0; chinese[i]; ++i)
    {
        if(chinese[i] == L'不')
            printf("found\n");
        if(chinese[i] == L'\u4E0D')
            printf("also found\n");
    }
}

Обратите внимание, что строка широких символов L"xxx" в то время как широкий характер L'x', Кодовая точка Unicode BMP может быть указана с помощью \uXXXX,

К вашему сведению, я скомпилировал с Visual Stdio 2012 с исходными кодировками UTF-8 с BOM, UTF-16 (little-endian) и UTF-16 (big-endian). UTF-8 без спецификации не работал.

Благодаря приведенным выше объяснениям. Теперь я могу написать следующий код, который работает на Mac M1 (MacOS Monterey):

      // To run this program:
// $ gcc -o test test_Chinese.c
// $ ./test

#include <stdio.h>
#include <wchar.h>
#include <locale.h>

int len(wchar_t *str) {
    int i;
    while (str[i]) { i++; }
    printf("i=%d\n", i);
    return i;
}
int main() {
    setlocale(LC_CTYPE, ""); // need this for wprintf()
    wchar_t str[] = L"國民、国民。평화、平和。";
    for(int i = 0; str[i]; ++i) {
        if(str[i] == L'民')       // note: single quote for one character
            printf("found at %d; ", i);
        if(str[i] == L'\u6C11')  // UTF-32-BE Big Endian: 0x00006c11 of L'民'
            printf("also found at %d\n", i);
    }
    wchar_t star1 = 0x2606;    // or L'\u2606'
    wchar_t star2 = L'\u2605'; // or 0x2605;
    wprintf(L"Black Star: %lc\n", star1); // here using printf() will have no output
    wprintf(L"White Star: %lc\n", star2);
    wprintf(L"multi-lingual string: '%ls'\n", str);
    printf("length of 多國語文str: %d; str[2]: '%lc'\n", len(str), str[2]);
    // next line leads to errors
    //wprintf("length of 多國語文str: %d、str[2]:%lc\n", len(str), str[2]);
}

Но я не понял, когда использовать wprintf() или printf().

Другие вопросы по тегам