[c#]解決讀寫包含漢字的txt檔案時亂碼的問題
當我們用system.io.streamreader讀取包含漢字的txt檔案時,經常會讀出亂碼(streamwriater寫文字檔案也
有類似的問題),原因很簡單,就是檔案的編碼(encoding)和streamreader/writer的encoding不對應。
為了解決這個問題,我寫了乙個類,來取得乙個文字檔案的encoding,這樣我們就可以建立對應的
streamreader和streamwriter來讀寫,保證不會出現亂碼現象。其實原理很簡單,文字編輯器(比如xp自帶的記事
本)在生成文字檔案時,如果編碼格式和系統預設的編碼(中文系統下預設為gb2312)不一致時,會在txt檔案開頭
部分新增特定的「編碼位元組序標識(encoding bit order madk,簡寫為bom)」,類似pe格式的"mz"檔案頭。這樣
它在讀取時就可以根據這個bom來確定該文字檔案生成時所使用的encoding。這個bom我們用記事本等程式開啟預設
是看不到的,但是用stream按位元組讀取時是可以讀到的。我的這個txtfileencoding類就是根據這個bom「檔案頭」
來確定txt檔案生成時用到的編碼的。//
// 2005-8-8
// // // // // //
using
system;
using
system.text;
using
system.io;
namespace
farproc.text
///
///取得乙個文字檔案的編碼方式。如果無法在檔案頭部找到有效的前導符,encoding.default將被返回。
///
///檔名。
///
public
static encoding getencoding(string filename)
///
///取得乙個文字檔案流的編碼方式。
///
///文字檔案流。
///
public
static encoding getencoding(filestream stream)
///
///取得乙個文字檔案的編碼方式。
///
///檔名。
///
預設編碼方式。當該方法無法從檔案的頭部取得有效的前導符時,將返回該編碼方式。
///
public
static encoding getencoding(string filename, encoding defaultencoding)
///
///取得乙個文字檔案流的編碼方式。
///
///文字檔案流。
///
預設編碼方式。當該方法無法從檔案的頭部取得有效的前導符時,將返回該編碼方式。
///
public
static encoding getencoding(filestream stream, encoding defaultencoding)
if(stream.length >= 4)
//根據檔案流的前4個位元組判斷encoding
//unicode ;
//be-unicode ;
//utf8 = ;
if(byte1 == 0xfe && byte2 == 0xff)//unicodebe
if(byte1 == 0xff && byte2 == 0xfe && byte3 != 0xff)//unicode
if(byte1 == 0xef && byte2 == 0xbb && byte3 == 0xbf)//utf8
//恢復seek位置
stream.seek(origpos, seekorigin.begin);
}
return targetencoding;
}
}
}
由於在gb2312和utf7編碼都沒有bom,所以需要指定乙個預設的encoding,在找不到合法的bom時,將返回這個
encoding。有誰知道如何區分gb2312和utf7編碼txt檔案的方法,也請告訴我。
由於只是static方法,所以不用new,直接通過類名呼叫方法,使用起來也很簡單。
using
system;
using
farproc.text;
using
system.text;
using
system.io;
namespace
}
}
.***下的string永遠是unicode的,所以只能判斷txt檔案的encoding。對於byte,只有自己知道它的
encoding才能轉換為string 轉換為其他編碼的byte,乙個例外是把整個txt檔案通過stream讀入byte後也可以根據它的前幾個位元組判斷
encoding,對於片斷,我們就無能為力了:)
C 解決讀寫包含漢字的txt檔案時亂碼的問題
為了解決這個問題,我寫了乙個類,來取得乙個文字檔案的encoding,這樣我們就可以建立對應的streamreader和streamwriter來讀寫,保證不會出現亂碼現象。其實原理很簡單,文字編輯器 比如xp自帶的記事本 在生成文字檔案時,如果編碼格式和系統預設的編碼 中文系統下預設為gb2312...
C 讀寫txt檔案
首先windows 7中的txt文件中,預設每行末尾會加 r 和 n 表示此行結束。回車表示游標移到行首,換行表示游標移至下一行,所以二者要配合使用。因此利用string的split函式讀取txt檔案是就需要額外加入換行符和回車符作為分隔符。例外一點就是split函式讀取至每行結束時,雖然行尾換行符...
c 讀寫txt檔案
最近專案又遇到了乙個問題,最初我把上傳失敗的記錄儲存在配置檔案中,這個失敗的記錄有上百條,導致在配置檔案中的value很長,這樣在vs中就破壞了xml的結構,導致xml不能正確解析。最後決定將這些上傳失敗的記錄單獨儲存在乙個txt文字中,這樣就需要對txt進行讀寫。方法其實還是很簡單的,但是讀寫完一...