寫過 C 的人都應該遭遇過 用 fprintf 寫入的 Unicode 字串, 讀出是亂碼的問題.
雖然使用 CStdioFile 或 比較最近的語言如 Java, C# 對 Unicode 比較友善. 然而如果你寫的是嵌入式系統的話, 你遭遇的可能就是 C 與原始的環境.
而下面是一個解決的方法.
下面是使用 寬字元版本, 即_UNICODE 與 UNICODE 有定義的情況.
// 寫入 Unicode 內容文件 範例
void write_unicode(){
// 寫入 Unicode 內容
TCHAR* recordfilename=_T("自然_井民全_練習項目1.mp3");
// 開啟文件: (注意: 要用 wb 不能用 wt)
// 請放心! 寫入後還是可以用 Notepad 看到內容(This is a Unicode document file)
FILE *fp=_tfopen(_T("RecordInfo_API.txt"),_T("wb"));
if(fp!=NULL){
// Step 1: 寫入 Unicode 檔頭, 標明這是 Unicode 檔 (關鍵片段)
unsigned char u[2]={0xff,0xfe}; // Unicode 檔頭 = 0xfeff
fwrite(u,2,1,fp);
// Step 2: 寫入真正 Unicode 資料
_ftprintf(fp,_T("Record_Filename=%s\n"),recordfilename);
// Step 3: 關檔寫入
fclose(fp);
// Step 4: 請用 NotePad 看看內容
}else{
::MessageBox(NULL,_T("錄音資訊檔建立失敗"),_T("Error"),MB_OK);
}
}
讀取 Unicode 內容文件 範例
// 讀取 Unicode 內容文件 範例
void read_unicode(){
TCHAR recordfilename[256];
// 開啟文件: (注意: 要用 rb 不能用 rt)
FILE *fp=_tfopen(_T("RecordInfo_API.txt"),_T("rb"));
if(fp!=NULL){
// (關鍵片段)
// Step 1: 先讀取 0xfffe (你也可以跳過 2 bytes)
char unicodeheader[2];
fread(unicodeheader,2,1,fp);
// Step 2: 真正讀取 Unicode 內容
_ftscanf(fp,_T("Record_Filename=%s\n"),&recordfilename);
fclose(fp);
}
}
在 C# 怎麼讀 Unicode Text file 的資料呢? 下面是範例
// read info file
string InfoFileName = @"C:\Info.txt";
string kk;
StreamReader fs = new StreamReader(new FileStream(InfoFileName, FileMode.Open,
FileAccess.Read), System.Text.Encoding.Unicode);
while (fs.Peek() != -1) {
kk = fs.ReadLine();
}
fs.Close();
by Jing
延伸閱讀
沒有留言:
張貼留言