2013-11-23 43 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'█';
  • <uchar.h>限定的UTF-32字符,const char32_t complete = U'█';
  • 一個UTF-16字符,雖然這通常是一個壞主意。

如果可以的話,使用UTF-8,必要時使用其他的東西。 32位類型是唯一保證固定寬度的類型。標準庫中有一些函數用於讀取和寫入寬字符字符串,並且在許多語言環境中,您可以在調用setlocale()或使用mbstowcs()將它們轉換爲寬字符時,像ASCII一樣讀取和寫入UTF-8字符串。