Печать японских символов в программе C - PullRequest
2 голосов

Я хочу напечатать японские символы с помощью программы C. Я нашел диапазон Unicode для некоторых японских символов, преобразовал их в десятичные и использовал для l oop, чтобы напечатать их:

setlocale(LC_ALL, "ja_JP.UTF8");
for (int i = 12784; i <= 12799; i++) {
  printf("%c\n",i);
}

locale.h и wchar.h присутствуют в заголовке.

Вывод мне дает только ?????????? символы.

Пожалуйста, дайте мне знать, как это можно решить.

Ответы [ 2 ]

4 голосов
/ 01 мая 2020

%c может печатать только символы от 0 до 127, для расширенных символов:

printf("%lc\n", i);

или еще лучше

wprintf(L"%lc\n", i);
1 голос
/ 01 мая 2020

Кроме того @ Дэвид Раньери точный ответ, я хотел объяснить, что "вывод дает мне только ?????????? символов."


"%c" принимает аргумент int. Напомним, что char, переданный функции ..., преобразуется в int. Затем

аргумент int преобразуется в unsigned char, и результирующий символ записывается. C17dr § 7.21.6.1 8.

Таким образом printf("%c" ... обрабатывает значения 0-255. Значения за пределами этого диапазона преобразуются в этот диапазон.


Код OP ниже переписан в шестнадцатеричном формате.

// for (int i = 12784; i <= 12799; i++) {
for (int i = 0x31F0; i <= 0x31FF; i++) {
  printf("%c\n",i);
}

С настройкой и реализацией языкового стандарта OP выводятся значения печати [0xF0 - 0XFF ] привело к '?'. Я уверен, что это верно для [0x80 - 0xFF] для OP. Другие возможности существуют. Я получил .

Если бы OP выполнил следующее, более знакомый результат был бы виден, хотя и не нужные символы Хирагана.

for (int i = 0x3041; i <= 0x307E; i++) {
  printf("%c",i);
}

ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
...