2013-01-21 76 views
3

我試圖從(框圖範圍:2500-257F)顯示Unicode字符。它應該是標準的utf8(Unicode標準,版本6.2)。我根本無法做到。如何在C(Linux utf8終端)中打印「方塊抽屜」Unicode字符?

我首先嚐試使用良好的舊ASCII字符,但Linux終端顯示在utf8中,沒有顯示轉換(符號?)。

誰能回答這些問題:

  • 如何在C變量(style wchar_t)Unicode字符編碼?
  • 如何對Unicode使用轉義序列,如0x或0(十六進制,十進制)?

我知道U +但它似乎沒有工作。

setlocale(LC_ALL,""); 
short a = 0x2500, b = 0x2501; 
wchar_t ac = a; 
wchar_t bc = b; 
wprintf(L"%c%c\n", ac, bc); 
exit(0); 

我知道結果與所使用的字體,但我用的是UTF8字體(http://www.unicode.org/charts/fonts.html)和代碼從2500到257F必須顯示...其實他們不是。

感謝您的幫助提前...

+0

你正在使用什麼樣的終端?你確定它使用了一個包含所有這些字形的字體嗎?另外,你知道unicode <> utf-8轉換,對嗎?即例如U + 2500是0xe29480,例如U + 257F是0xe295bf? (對不起,如果我聽起來很刺耳,但必須確保那部分是好的。) –

+1

你的問題似乎意味着你不明白unicode和unicode編碼之間的區別。您的終端可能使用utf-8編碼,因此您必須在發送到終端之前將您的unicode代碼點編碼爲utf-8編碼。這意味着還要設置UTF-8語言環境。例如LANG =「en_US.utf8」 – Keith

+0

現在我想起了它 - 您的終端可能不會以utf-8模式運行。你能向我們展示'stty'的輸出嗎? –

回答

4

使用包含的UTF-8版本的這些字符的字節一個CString。如果您打印該Cstring,它將打印該字符。

例如,對於您的兩個人物:

#include <stdio.h> 

int main (int argc, char *argv[]) 
{ 
    char block1[] = { 0xe2, 0x94, 0x80, '\0' }; 
    char block2[] = { 0xe2, 0x94, 0x81, '\0' }; 
    printf("%s%s\n", block1, block2); 
    return 0; 
} 

打印─━我。另外,如果您打印一個包含uft-8字符字節的Cstring,它將打印出沒有問題的字符。 /*假設您使用gcc */ 而且IIRC gcc無論如何都使用utf-8。

編輯:我寫這個的時候你的問題有點改變了。而我的答案現在不那麼重要。 但是從你的症狀 - 如果你看到一個?對於你期望的每個角色,我會說你的終端字體可能缺少這些角色所需的字形。

0

這取決於你所謂的「終端」。

Linux控制檯使用各種黑客來顯示unicode,但實際上它的字體限制爲512個符號IIRC,因此它不能真正顯示整個unicode範圍,它可以顯示的內容取決於加載的字體(這可能會改變未來)。

用於訪問Linux的Windows終端通常以unicode方式以各種方式進行braindamage。

物理終端通常較差,只有在ASCII的土地經營

的Linux GUI終端(如GNOME終端)可以,只要你有相應的字體,幾乎所有的顯示。

您確定不想使用ncurses而不是編寫自己的終端窗口小部件嗎?