none
預設編碼與BOM檔的問題 RRS feed

  • 問題

  • 我有三個編碼的檔案
    ANSI.TXT
    UTF8_BOM.TXT
    UTF8_noBOM.TXT

    但測試時,卻到判斷BOM檔的問題,
    如果不判斷編碼,那使用ANSI的會有亂碼,但使用UTF8的二個檔可以顯示。

    如果判斷編碼,ANSI及UTF8這二個檔ok,但無BOM檔的UTF8會亂碼。

    請問該如何解決UTF8不含BOM檔的問題呢?
                        //不判斷編碼,ANSI就亂碼
                        using (StreamReader objReader = new StreamReader(filename))
                        {
                            textBox1.Text = objReader.CurrentEncoding.EncodingName + "\r\n";
                            textBox1.Text += objReader.ReadToEnd();
                            objReader.Close();
                        }
    
                        //判斷編碼,但無BOM就亂碼
                        Encoding coding = GetEncoding(filename);
                        using (StreamReader objReader = new StreamReader(filename, coding))
                        {
                            textBox3.Text = objReader.CurrentEncoding.EncodingName + "\r\n";
                            textBox3.Text += objReader.ReadToEnd();
                            objReader.Close();
                        }
    
                        //觀察二進位碼
                        using (FileStream myFile = File.Open(filename, FileMode.OpenOrCreate, FileAccess.ReadWrite))
                        {                       
                            BinaryReader myReader = new BinaryReader(myFile);
                            int dl = System.Convert.ToInt16(myFile.Length);
                            byte[] myData = myReader.ReadBytes(dl);
                            myReader.Close();
                            myFile.Close();
                            textBox2.Clear();
                            foreach (byte b in myData)
                            {
                                textBox2.Text += Convert.ToInt32(b).ToString("X").PadLeft(2, '0') + " ";
                            }
                        }
    

            public static Encoding GetEncoding(string filename)
            {
                Encoding result = System.Text.Encoding.Default;
                FileStream file = null;
                try
                {
                    file = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read);
    
                    if (file.CanSeek)
                    {
                        //   get   the   bom,   if   there   is   one   
                        byte[] bom = new byte[4];
                        file.Read(bom, 0, 4);
    
                        //   utf-8   
                        if (bom[0] == 0xef && bom[1] == 0xbb && bom[2] == 0xbf)
                            result = System.Text.Encoding.UTF8;
                        //   ucs-2le,   ucs-4le,   ucs-16le,   utf-16,   ucs-2,   ucs-4   
                        else if ((bom[0] == 0xff && bom[1] == 0xfe) ||
                        (bom[0] == 0xfe && bom[1] == 0xff) ||
                        (bom[0] == 0 && bom[1] == 0 && bom[2] == 0xfe && bom[3] == 0xff))
                            result = System.Text.Encoding.Unicode;
                        //   else   ascii   
                        else
                            result = System.Text.Encoding.Default;
                    }
                    else
                    {
                        //   can't   detect,   set   to   default   
                        result = System.Text.Encoding.Default;
                    }
    
                    return result;
                }
                finally
                {
                    if (null != file) file.Close();
                }
            }
    

    2009年12月9日 上午 09:45

解答

  • 簡單解法是沒有辦法。

    更多的資訊可以找一些博碩士論文,裡面有用語意分析來判斷是否為合理內容,再來判斷文字編碼。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    • 已提議為解答 Lolota Lee 2009年12月15日 上午 06:02
    • 已標示為解答 2009年12月16日 上午 04:16
    2009年12月9日 下午 01:11