2014-11-04 70 views
0

好吧,我得打印UTF-8編碼的字符到終端。但打印到文件不能像我所期望的那樣工作。使用wchar.h和locale.h這樣:fprintf()問題utf-8 linux

#include <locale.h> 
#include <wchar.h> 

int main(){ 
    setlocale(LC_ALL,""); 

    wint_t index = 0; 

    FILE* fpinout = fopen("UTF-8.txt","w"); 
    for(index = 0; index < 0x200; index++){ 
     printf("%i:\t%lc\n", index, index); //works fine, prints utf-8 chars to terminal 
     fprintf(fpinout,"%i\t%lc", index, index); //does not work, output is wierd 
    } 
    fclose(fpinout); 
} 

我試圖使用索引那裏都作爲wint_t和wchar_t。 我的UTF-8.txt文件看起來像這樣:

र㄀ĉल㌂̉ऴ㔄ԉश㜆܉स㤈उ〱ਉㄱଉ㈱ఉ㌱ഉ㐱ฉ㔱༉㘱ဉ㜱ᄉ㠱ሉ㤱ጉ〲ᐉㄲᔉ㈲ᘉ㌲ᜉ㐲᠉㔲ᤉ㘲ᨉ㜲ᬉ㠲ᰉ㤲ᴉ〳ḉㄳἉ㈳ ㌳℉㐳∉㔳⌉㘳␉㜳 
┉㠳☉㤳✉〴⠉ㄴ⤉㈴⨉㌴⬉㐴Ⰹ㔴ⴉ㘴⸉㜴⼉㠴〉㤴ㄉ〵㈉ㄵ㌉㈵㐉㌵劚㐵㘉㔵㜉㘵㠉㜵㤉㠵㨉㤵㬉〶㰉ㄶ㴉㈶㸉㌶㼉㐶䀉㔶䄉㘶䈉 
㜶䌉㠶䐉㤶䔉〷䘉ㄷ䜉㈷䠉㌷䤉傌䨉㔷䬉㘷䰉㜷䴉㠷三㤷伉〸倉ㄸ儉㈸刉㌸匉㐸吉㔸唉㘸嘉㜸圉㠸堉㤸変〹娉ㄹ嬉㈹尉㌹崉㑶帉 
㔹弉㘹怉㜹愉㠹戉㤹按〱रㅤ㄰攉〱लㅦ㌰有〱ऴㅨ㔰椉〱शㅪ㜰欉〱सㅬ㤰洉ㄱरㅮㄱ漉ㄱलㅰ㌱焉ㄱऴㅲ㔱猉ㄱशㅴ㜱甉ㄱसㅶ㤱眉 
㈱रㅸㄲ礉㈱लㅺ㌲笉㈱ऴㅼ㔲紉㈱शㅾ㜲緝㈱स胂㈱ह臂㌱र苂㌱ऱ菂㌱ल蓂㌱ळ藂㌱ऴ蛂㌱व蟂㌱श裂㌱ष觀㌱स諂㌱ह詁㐱र賂㐱ऱ跂㐱ल軂㐱 
ळ迂㐱ऴ郂㐱व釂㐱श鋂㐱ष鏂㐱स鉑㐱ह闂㔱र雂㔱ऱ韂㔱ल飂㔱ळ駂㔱ऴ髂㔱व鯂㔱श鰃㔱ष鷂㔱स黂㔱ह鿂㘱रꃂ㘱ऱꇂ㘱लꋂ㘱ळꏂ㘱ऴ꓂ 
㘱वꗂ㘱शꛂ㘱षꟂ㘱सꣂ㘱ह꧂㜱रꫂ㜱ऱꯂ㜱ल곂㜱ळ귂㜱ऴ껂㜱व꿂㜱श냂㜱ष뇂㜱स닂㜱ह돂㠱र듂㠱ऱ뗂㠱ल뛂㠱ळ럂㠱ऴ룂㠱व맂㠱श뫂 
㠱ष믂㠱स볂㠱ह뷂㤱र뻂㤱ऱ뿂㤱ल胃㤱ळ臃㤱ऴ苃㤱व菃㤱श蓃㤱ष藃㤱स蛃㤱ह蟃〲र裃〲ऱ覎〲ल諃〲ळ訶〲ऴ賃〲व躍〲श軃〲ष迃〲स郃〲ह 
釃ㄲर鋃ㄲऱ鏃ㄲल鈴ㄲळ闃ㄲऴ雃ㄲव韃ㄲश飃ㄲष駃ㄲस髃ㄲह鯃㈲र鰓㈲ऱ鷃㈲ल黃㈲ळ鿃㈲ऴꃃ㈲वꇃ㈲शꋃ㈲षꏃ㈲स꓃㈲हꗃ㌲रꛃ㌲ऱꟃ㌲ 
लꣃ㌲ळ꧃㌲ऴ꫃㌲वꯃ㌲श곃㌲ष귃㌲स껃㌲ह꿃㐲र냃㐲ऱ뇃㐲ल닃㐲ळ돃㐲ऴ듃㐲व뗃㐲श뛃㐲ष럃㐲स룃㐲ह맃㔲र뫃㔲ऱ믃㔲ल볃㔲ळ뷃㔲ऴ뻃 
㔲व뿃 

任何幫助表示讚賞。

+0

以二進制模式打開文件可能有幫助..'fopen(「UTF-8.txt」,「 wb「);' – Haris 2014-11-04 12:56:03

+0

您的終端和您的文件查看器正在使用不同的解碼。相同的數據將被轉換爲「stdout」和「UTF-8.txt」,但你不會以同樣的方式讀取它們。 – chux 2014-11-04 15:18:45

+0

@chux我使用gedit作爲文本編輯器/查看器,並且已經能夠打開UTF-8格式的文件,通過這個過程: open gedit> open>在字符編碼中選擇utf-8> openfile 通過這樣做我得到正確的輸出。但我不能默認這樣做。 我也可以確認可以寫一個文本文件,並從中讀取,沒有問題,輸出到終端正確的字符。 – 2014-11-09 14:53:44

回答

0

這樣你寫UTF32的事實。以二進制模式打開文件將無濟於事。它將保持UTF32LE。

您應該使用轉換爲UTF8編碼。使用ICU庫或wctomb/wctombs/wclen c函數(http://man7.org/linux/man-pages/man3/wctomb.3.html)。請注意,wctomb *函數通常是語言環境相關的(如果希臘語語言環境通常無法正常使用日語)

+0

你可以在答案上擴大一點嗎? – 2014-11-04 16:26:50

+0

當然,但我想知道什麼不清楚給你。 UTF-8是可變長度編碼,每個符號可以從1(對於ASCII)開始直到4字節(在實際應用中)和6從理論上開始。終端足夠聰明,因爲它是以UTF8模式運行的,文件是通常的文件,它們包含你提供的內容,並且表示你提供的UTF-8視角是你在編輯器中打開文件時實際看到的。維基百科的文章是好的恕我直言http://zh.wikipedia.org/wiki/UTF-8 – 2014-11-06 12:56:15

+0

我想知道如何使用ICU庫的C/C++,特別是在Ubuntu Trusty,以實現這一結果。我正在使用C :: B IDE。 我發現這個關於建立和安裝ICU的教程:http://www.linuxfromscratch.org/blfs/view/svn/general/icu.html 但現在呢? – 2014-11-09 14:45:13