[英]Need explanation on creating utf-8 encoded files on linux using c++
我需要在Linux上使用g ++進行文件編碼的一些說明。
我有一個簡單的代碼:
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;
}
即使在fopen行上添加了“ ccs = UTF-8”部分,該程序的輸出文件也始終以iso-8859-1編碼。 但是,如果我在Linux上使用vi創建包含這些字符的文件,則生成的文件是UTF-8編碼的(我使用命令“ file myfile”查看文件的編碼模式,並使用“ xxd -b myfile”確認這種行為)。
所以我想理解:
1-為什么Linux上的g ++默認情況下不會創建UTF-8文件?
2-如果創建的文件未使用UTF-8編碼,則ccs = UTF-8的目的是什么?
3-如何基於此簡單代碼創建UTF-8文件?
謝謝。
您的文件可能看上去符合ISO-8859-1,但實際上不是。 簡直是壞了。
您的文件包含字節A9
,它是é
的UTF-8表示形式的低字節。
當您編寫'é'
,編譯器應該警告您:
aaa.c:4:38: warning: multi-character character constant [-Wmultichar]
char buffer[] = { 'x' , 'y' , 'z' ,'é' };
^
char
不是char
的類型,而是一個字節的類型。 GCC將多字節字符文字視為大端整數。 在這里,您將其立即轉換為char
,保留最低字節: A9
(順便說一句,ISO-8859-1中的é
是E9
,而不是A9
)
您使用編碼打開文件,但隨后將字節保存到其中。 字節對應於ISO-8859-1字符xyz©
。
如果要寫字符而不是字節,請使用wchar_t
代替char
和fputws
代替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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.