2014-12-05 64 views
0

我需要一些在Linux上使用g ++編碼文件的解釋。需要解釋在linux上使用C++創建utf-8編碼文件

我有一個簡單的代碼:

int main() 
{ 
    FILE * pFile; 
    char buffer[] = { 'x' , 'y' , 'z' ,'é' }; 
    pFile = fopen ("myfile", "wt, ccs=UTF-8"); 
    //pFile = fopen ("myfile", "wt"); 
    fwrite (buffer , sizeof(char), sizeof(buffer), pFile); 
    fclose (pFile); 
    return 0; 
} 

即使「CCS = UTF-8」的部分上則fopen線加入,此程序輸出文件始終在ISO-8859-1編碼。但是,如果我在Linux上使用vi創建一個包含這些字符的文件,則生成的文件是UTF-8編碼的(我使用命令「file myfile」查看文件的編碼模式,並確認「xxd -b myfile」這種行爲)。

所以我想已瞭解:

1-爲什麼G ++對Linux不默認創建一個UTF-8的文件?

2-如果創建的文件不是以UTF-8編碼,ccs = UTF-8的目標是什麼?

3-如何基於這個簡單的代碼創建一個UTF-8文件?

謝謝。

回答

1

您的文件可能看起來在ISO-8859-1中,但實際上並不是。它很簡單。

您的文件包含字節A9,這是é的UTF-8表示的低位字節。

當你寫'é',編譯器應該警告你:

aaa.c:4:38: warning: multi-character character constant [-Wmultichar] 
    char buffer[] = { 'x' , 'y' , 'z' ,'é' }; 
             ^

char不是用於字符的類型,它是一個字節一個類型。 GCC將多字節字符文字視爲大端整數。在這裏,你立即施放它char,留下最低字節:A9

(順便說一句,在é ISO-8859-1是E9,不A9

你打開帶有編碼的文件,但你將字節保存到其中。這些字節對應於ISO-8859-1字符xyz©

如果要寫字,不是字節,然後用wchar_t代替charfputws代替fwrite

#include <stdio.h> 
#include <wchar.h> 

int main() 
{ 
    FILE * pFile; 
    // note final zero and L indicating wchar_t literal 
    wchar_t buffer[] = { 'x' , 'y' , 'z' , L'é' , 0}; 
    // note no space before ccs 
    pFile = fopen ("myfile", "wt,ccs=UTF-8"); 
    fputws(buffer, pFile); 
    fclose (pFile); 
    return 0; 
}