C - Распечатать массив, заполненный символами Unicode - PullRequest
0 голосов
/ 23 ноября 2018

Я хочу напечатать массив (/ string), который заполнен символами Unicode (и нормальными), например, квадратами.

Вот мой код:

#include <stdio.h>

int main()
{
    char array[5];
    for (int i = 0; i < 4; i++){
        array[i]='\u25A1';
    }
    array[4]='A';
    printf("%s", array);
    return 0;
}

Это простопечатает "ííííA◊".Почему он не печатает квадраты и как это исправить?

Согласно fileformat.info исходный код квадрата

C / C ++ / Java - "\ u25A0"

Я также попробовал квадрат

UTF-8 (шестнадцатеричный), который равен «0xE2 0x96 0xA0 (e296a0)»

Ни одна из этих работ.

1 Ответ

0 голосов
/ 23 ноября 2018

array[i] = '\u25A1' не будет правильно компилироваться в C. По крайней мере, вы должны получить предупреждение компилятора.

'\u25A1' относится к типу char16_t (два байта на символ), здесь это не имеет значения.

\u может использоваться в качестве escape-последовательности в строковом литерале для представления кодовых точек Unicode ниже 0x10000.Пример:

strcpy(array, u8"\u25A0");
printf(array);
Output: ■

Обратите внимание, что u8"\u25A0" сохраняется как 4 байта (0xE2, 0x96, 0xA0 + нулевой символ) на основе преобразования UTF8.Он также может быть напечатан следующим образом (если консоль поддерживает вывод UTF8):

strcpy(array, "\xE2\x96\xA0");
printf(array);
Output: ■

Кроме того, строка должна заканчиваться нулем, последний символ в строке долженбыть нулем.

Чтобы сохранить UTF8 в байтах, вы можете назначить значения следующим образом:

array[0] = 0xE2;
array[1] = 0x96;
array[2] = 0xA0;
array[3] = '\0';

Если ваша среда разработки поддерживает это, вы также можете объявить

char array[] = u8"■";
...