簡體   English   中英

File.Copy 和字符編碼

[英]File.Copy and character encoding

我注意到 .NET 3.5SP1 中File.Copy()的一個奇怪行為。 我不知道這是錯誤還是功能。 但我知道這讓我發瘋。 我們在自定義構建步驟中使用File.Copy() ,它搞砸了字符編碼。

當我在 UTF-8 編碼文本文件上復制 ASCII 編碼文本文件時,目標文件仍然是 UTF-8 編碼,但包含新文件的內容加上 UTF-8 的 3 個前綴字符。這對 ASCII 字符很好,但對其余字符不正確ANSI 代碼頁的字符 (128-255)。

這是要重現的代碼。 我首先將一個 UTF-8 文件復制到目標位置,然后將一個 ANSI 文件復制到同一目標位置。 注意第二個控制台的output output: Content of copy.txt: this is ASCII encoded: / Encoding: utf-8

File.WriteAllText("ANSI.txt", "this is ANSI encoded: é", Encoding.GetEncoding(0));
File.WriteAllText("UTF8.txt", "this is UTF8 encoded: é", Encoding.UTF8);

File.Copy("UTF8.txt", "copy.txt", true);

using (StreamReader reader = new StreamReader("copy.txt", true))
{
    Console.WriteLine("Content of copy.txt : " + reader.ReadToEnd() + " / Encoding: " +
                reader.CurrentEncoding.BodyName);
}

File.Copy("ANSI.txt", "copy.txt", true);

using (StreamReader reader = new StreamReader("copy.txt", true))
{
    Console.WriteLine("Content of copy.txt : " + reader.ReadToEnd() + " / Encoding: " + 
                reader.CurrentEncoding.BodyName);
}

為什么會發生這種情況的任何想法? 我的代碼有錯誤嗎? 關於如何解決這個問題的任何想法(我目前的想法是在文件存在之前將其刪除)

編輯:糾正 ANSI/ASCII 混淆

你在哪里寫ASCII.txt? 您在第一行中編寫了 ANSI.txt,但這肯定不是 ASCII,因為 ASCII 不包含任何重音字符。 ANSI 文件將不包含任何指示它是 ANSI 而不是 ASCII 或 UTF-8 的前導碼。

基本上,在編寫示例的過程中,您似乎已經在 ASCII 和 ANSI 之間改變了主意。

我希望任何 ASCII 文件都被“檢測”為 UTF-8,但編碼檢測依賴於具有字節順序標記的文件,它不是 UTF-8。它不像它讀取整個文件然后猜測是什么編碼是。

來自 StreamReader 的文檔:

此構造函數將編碼初始化為 UTF8Encoding,使用 stream 參數初始化 BaseStream 屬性,並將內部緩沖區初始化為默認大小。

detectEncodingFromByteOrderMarks 參數通過查看 stream 的前三個字節來檢測編碼。如果文件以適當的字節順序標記開頭,它會自動識別 UTF-8、小端 Unicode 和大端 Unicode 文本。 有關詳細信息,請參閱 Encoding.GetPreamble 方法。

現在File.Copy只是將原始字節從一個地方復制到另一個地方——它不應該改變任何字符編碼,因為它首先不會嘗試將文件解釋為文本文件。

我不太清楚你在哪里看到問題(部分原因是 ANSI/ASCII 部分)。 我建議您將“File.Copy 會改變什么嗎?”的問題分開。 和“StreamReader 檢測到什么字符編碼?” 在你的腦海和你的問題中。 答案應該是:

  • File.Copy根本不應該改變文件的內容
  • StreamReader只能檢測UTF-8和UTF-16; 如果你需要讀取一個用任何其他編碼編碼的文件,你應該在構造函數中顯式地使用 state。 (順便說一句,我個人建議使用Encoding.Default而不是Encoding.GetEncoding(0) 。我認為這樣更清楚。)

我懷疑這與 File.Copy 有什么關系。 我認為您看到的是 StreamReader 默認使用 UTF-8 進行解碼,並且由於 UTF-8 向后兼容,StreamReader 永遠沒有任何理由停止使用 UTF-8 來讀取 ANSI 編碼文件。

如果您在十六進制編輯器中打開 ASCII.txt 和 copy.txt,它們是否相同?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM