2013-11-23 2 views
1

Я хочу сделать следующее назначение:символов Unicode Присвоить к полукоксу

char complete = '█', blank='░'; 

Но я получил следующее предупреждение (я использую последнюю версию GCC):

trabalho3.c: In function ‘entrar’: 
trabalho3.c:243:9: warning: multi-character character constant [-Wmultichar] 
    char complete = '█', blank='░'; 
        ^
trabalho3.c:243:3: warning: overflow in implicit constant conversion [-Woverflow] 
    char complete = '█', blank='░'; 
        ^
trabalho3.c:244:23: warning: multi-character character constant [-Wmultichar] 
    char complete = '█', blank='░'; 
          ^
trabalho3.c:244:17: warning: overflow in implicit constant conversion [-Woverflow] 
    char complete = '█', blank='░'; 
          ^

Как могу ли я выполнить это задание?

ответ

2

Когда я скопировать эти строки из проводки и повторить результат с помощью программы шестнадцатеричного дампа, выход:

0x0000: 63 68 61 72 20 63 6F 6D 70 6C 65 74 65 20 3D 20 char complete = 
0x0010: 27 E2 96 88 27 2C 20 62 6C 61 6E 6B 3D 27 E2 96 '...', blank='.. 
0x0020: 91 27 3B 0A          .';. 
0x0024: 

И когда я запускаю его через UTF-8 декодер, два блок символов определены как:

0xE2 0x96 0x88 = U+2588 (FULL BLOCK) 
0xE2 0x96 0x91 = U+2591 (LIGHT SHADE) 

И если персонажи действительно длиной 3 байта, пытаясь сохранить все три байта в один символ будет вызывать проблемы.

Вам необходимо проверить эти наблюдения; существует много возможностей для фильтрации данных между вашей системой и моей. Однако есть вероятность, что если вы посмотрите на исходный код с помощью аналогичных инструментов, вы обнаружите, что символы кодируются как UTF-8, так и UFT-16, и ни один из них не будет вписываться в один байт. Если вы считаете, что это символы в однобайтовом наборе кода (CP-1252 или что-то подобное, возможно), вы должны показать шестнадцатеричный дамп для строки кода, содержащей инициализации, и определить платформу и набор кодов, которые вы работаете с.

0

Вы можете хранить эти символы как:

  • в кодировке UTF-8 строки, const unsigned char complete[] = u8"█";
  • широкий характер определяется в <wchar.h>, const wchar_t complete = L'█';
  • в кодировке UTF-32 символов определены в <uchar.h>, const char32_t complete = U'█';
  • символ UTF-16, хотя это, как правило, плохая идея.

Используйте UTF-8, когда сможете, что-то еще, когда вам нужно. 32-битный тип - единственный, который гарантирует фиксированную ширину. В стандартной библиотеке есть функции для чтения и записи широкосимвольных строк, и во многих местах вы можете читать и писать строки UTF-8 точно так же, как ASCII, как только вы вызываете setlocale() или конвертируете их в широкие символы с mbstowcs().

Смежные вопросы