2014-03-19 134 views
2

我正在寫一個應該在屏幕上顯示☻字符的小程序。該方案如下:簡單的C程序沒有給出預期的輸出

#include <stdio.h> 
main() 
{ 
    printf("☻\n"); 
} 

然而,當我運行這個程序,我得到的

Γÿ║ 

輸出爲什麼會出現這樣的輸出,並且我應該怎麼做才能輸出我想?

+0

它工作在我的終端(默認爲UTF-8)。 – Emmet

+0

您生成的代碼超過127.不在127下。 – PersianGulf

回答

5

你得到的是因爲你使用的任何終端程序都不兼容某些Unicode編碼。

例如,我的Debian盒子編譯細,它實際上打印出笑臉,因爲gnome-terminal是:-)

,你所看到的三個字符,而不是一個事實一個該死的罰款的軟件是一個很好的指示,它正在輸出UTF-8。事實上,如果我在我的Debian框運行該程序,並捕獲的二進制輸出和od -xcb,我看到:

0000000 98e2 0abb 
     342 230 273 \n 
     342 230 273 012 
0000004 

顯示其出來的UTF-8,它只是gnome-terminal是足夠聰明把它變回正確的字形。

的這些字節轉換成二進制如下:

e2   98   bb 
1110 0010 : 1001 1000 : 1011 1011 

,並使用這個優秀的答案here,說明開始10該位模式連續字節,我們可以按照如下對其進行解碼:

U+000800-U+00ffff 1110yyyy yyyyyyyy xxxxxxxx 
        10yyyyxx 
        10xxxxxx 

e2   98   bb 
1110 0010 : 1001 1000 : 1011 1011 
    yyyy  yy yyxx  xx xxxx 

因此,代碼點是0010 0110 : 0011 1011,相當於263b,這完全沒有巧合,是black smiling face character


在固定的視窗顯示不正確的Unicode,通過您的評論指示的問題的方面:

我在Windows命令提示符。我應該如何使cmd.exe與unicode一起使用?

你可能想看看this question,特別是回答有關使用chcp將代碼頁更改爲65001(UTF-8)。注意我沒有測試過這個,我只是把它作爲一個指針提供給你。

+0

我在Windows命令提示符下。我應該如何使cmd.exe與unicode一起使用? – user2532642

+2

@ user2532642:所以不讓我給你一個鏈接「讓我谷歌爲你」:-( –

1
#include <fcntl.h> 

_setmode(_fileno(stdout), _O_U16TEXT); 
wprintf(L"☻\n"); 

瓦爾特