Как обратиться к китайскому символу в коде 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().