首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

解決 C# RichTextBox 以 StreamWriter 寫入檔案時中文亂碼問題

     編輯:關於C語言

問題情境

在 Windows 2000 SP4 中文版、Visual Studio 2005 英文版環境下,使用 RichTextBox 顯示資料庫的 SQL 陳述式,並透過 StreamWriter 將內容寫入文字檔。當 SQL 陳述式包含中文字元時,輸出檔案卻出現亂碼。

根本原因

StreamWriter 的建構函式 StreamWriter(string path) 預設採用 UTF-8 編碼 建立寫入器。然而,系統預設編碼 (ANSI 代碼頁,繁中環境通常為 Big5/CP950) 與 UTF-8 不相容,導致中文字元在寫入時被誤解析,產生亂碼。

解決方案

使用接受 Encoding 參數的建構函式 StreamWriter(string path, bool append, Encoding encoding),明確指定編碼為 System.Text.Encoding.Default (系統預設 ANSI 編碼)。

// 正確寫法:指定編碼為系統預設值
StreamWriter sw = new StreamWriter(filename, false, System.Text.Encoding.Default);

補充說明

  • System.Text.Encoding.Default 會根據作業系統的「區域與語言選項」設定回傳對應的 ANSI 編碼 (如繁中為 Big5、簡中為 GB2312、英文為 Windows-1252)。
  • 此編碼行為與 Oracle 資料庫的字元集設定概念類似,皆依賴環境預設值。
  • 若需跨平台相容性,建議統一採用 UTF-8 (Encoding.UTF8) 並確保讀取端亦以 UTF-8 解碼。

完整範例

using System.IO;
using System.Text;
using System.Windows.Forms;

public void SaveRichTextBoxContent(RichTextBox rtb, string filePath)
{
    try
    {
        // 使用系統預設編碼 (ANSI) 避免中文亂碼
        using (StreamWriter sw = new StreamWriter(filePath, false, Encoding.Default))
        {
            sw.Write(rtb.Text);
        }
        MessageBox.Show("儲存成功!");
    }
    catch (Exception ex)
    {
        MessageBox.Show("儲存失敗:" + ex.Message);
    }
}

最佳實務建議

  1. 明確指定編碼: 除非有特殊需求,永遠不要依賴 StreamWriter 的預設 UTF-8 行為,應根據目標環境明確傳入 Encoding。
  2. 善用 using 區塊: 確保 StreamWriter 正確釋放檔案控制代碼。
  3. 跨系統部署: 若程式可能在不同語系 OS 執行,建議採用 UTF-8 並加上 BOM (new UTF8Encoding(true)),或在檔案開頭寫入編碼標記。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved