C 解決讀寫包含漢字的txt檔案時亂碼的問題

2021-04-01 10:40:11 字數 2544 閱讀 9633

[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進行讀寫。方法其實還是很簡單的,但是讀寫完一...