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

2021-04-20 12:44:11 字數 2165 閱讀 7101

為了解決這個問題,我寫了乙個類,來取得乙個文字檔案的encoding,這樣我們就可以建立對應的streamreader和streamwriter來讀寫,保證不會出現亂碼現象。其實原理很簡單,文字編輯器(比如xp自帶的記事本)在生成文字檔案時,如果編碼格式和系統預設的編碼(中文系統下預設為gb2312)不一致時,會在txt檔案開頭部分新增特定的;編碼位元組序標識(encoding bit order madk,簡寫為bom)」,類似pe格式的"mz"檔案頭。這樣它在讀取時就可以根據這個bom來確定該文字檔案生成時所使用的encoding。這個bom我們用記事本等程式開啟預設是看不到的,但是用stream按位元組讀取時是可以讀到的。我的這個txtfileencoding類就是根據這個bom;檔案頭」 來確定txt檔案生成時用到的編碼的。

由於在gb2312和utf7編碼都沒有bom,所以需要指定乙個預設的encoding,在找不到合法的bom時,將返回這個encoding。有誰知道如何區分gb2312和utf7編碼txt檔案的方法,也請告訴我。

由於只是static方法,所以不用new,直接通過類名呼叫方法,使用起來也很簡單。

using system; 

using system.text; 

using system.io; 

namespace system.shangfei.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; } }

} 測試

using system; 

using farproc.text; 

using system.text; 

using system.io;  } 

} net下的string永遠是unicode的,所以只能判斷txt檔案的encoding。對於byte,只有自己知道它的encoding才能轉換為string 轉換為其他編碼的byte,乙個例外是把整個txt檔案通過stream讀入byte後也可以根據它的前幾個位元組判斷

encoding,對於片斷,我們就無能為力了:)

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

c 解決讀寫包含漢字的txt檔案時亂碼的問題 當我們用system.io.streamreader讀取包含漢字的txt檔案時,經常會讀出亂碼 streamwriater寫文字檔案也 有類似的問題 原因很簡單,就是檔案的編碼 encoding 和streamreader writer的encoding...

C 讀寫txt檔案

首先windows 7中的txt文件中,預設每行末尾會加 r 和 n 表示此行結束。回車表示游標移到行首,換行表示游標移至下一行,所以二者要配合使用。因此利用string的split函式讀取txt檔案是就需要額外加入換行符和回車符作為分隔符。例外一點就是split函式讀取至每行結束時,雖然行尾換行符...

c 讀寫txt檔案

最近專案又遇到了乙個問題,最初我把上傳失敗的記錄儲存在配置檔案中,這個失敗的記錄有上百條,導致在配置檔案中的value很長,這樣在vs中就破壞了xml的結構,導致xml不能正確解析。最後決定將這些上傳失敗的記錄單獨儲存在乙個txt文字中,這樣就需要對txt進行讀寫。方法其實還是很簡單的,但是讀寫完一...