在使用php+mysql編寫網頁時,曾近就因為顯示中文亂碼”口口口???”困擾我很長時間,沒想到在c#制作浏覽器或擷取xml頁面時也經常會遇到顯示中文亂碼的問題,可想而知怎樣解決編碼問題或統一編碼問題是非常嚴重的問題。下面就講講我的一些了解及解決方法吧!
該方法通過擷取相應url的應答内容,通過指派資料流,再從位元組流中讀取内容指派給webbrowser控件中實作最簡單的浏覽器;但通過該方法常常會遇到現實中文字元亂碼問題,或者是顯示格式錯誤等問題.例如通路google等.
ps:這裡有另外一種方法調用webbrowser的navigate方法将指定位置的文檔加載到控件中,其中一種重載方法navigate(string)将制定的統一資源定位符url處的文檔加載到webbrowser控件中替換上一個文檔,而且實作該方法不會出現亂碼問題、排版問題、缺少http報錯問題.其實我很想知道封裝的該函數是如何實作的.
通過擷取網頁的響應字元集string str = response.characterset(隻讀屬性)可以發現,當字元集為utf-8時才能正常顯示,否則其他編碼方式都會出現中文亂碼;這裡最常出現的亂碼編碼方式為iso-8859-1,big5,gbk,gb2312等;而utf-8通常能顯示中文.
iso-8859-1:又稱latin-1或"西歐語言",是單位元組編碼,自身不能顯示中文,配合gbk或utf-8顯示中文,通常以byte[]形式存儲,以iso-8859-1格式解碼會是亂碼,通常采用gb2313解碼;
big5:通行于台灣、香港地區的一個繁體字編碼方案,俗稱”大五碼“.上面通路香港google就是big5出現的亂碼.
utf-8:是一種針對unicode的可變長度字元編碼,又稱萬國碼.它可以用來表示unicode标準中的任何字元,且其編碼中的第一個位元組仍與ascii相容,逐漸成為電子郵件、網頁及其他存儲或傳送文字的應用中,優先采用的編碼.
gb2312:是中華人民共和國國家漢字資訊交換用編碼,全稱"資訊交換用漢字編碼字元集",基本集共收入漢字6763個和非漢字圖形字元682個.gbk亦漢字編碼标準.
出現編碼方式的根本原因是在解析時使用的字元編碼和網頁的編碼方式不同,是以采用的解決方法通常是:
1.首先利用httpwebresponse.characterset屬性擷取字元集;
2.在根據不同的字元集設定相應的encoding來避免亂碼.
其中最簡單的方法是先擷取其指定網頁的字元集,在根據它的字元集采用相應的編碼方式進行解碼讀取.我們采用下面代碼擷取該url的字元集為"iso-8859-1"
在設定其對應的編碼方式,通過定義encoding enc字元編碼方式,其方法getencoding("相應編碼方式")設定字元編碼,然後在streamreader(stream,enc)中采用對應設定的編碼方式從位元組流中讀取内容.
顯示結果如下:其中characterset采用iso-8859-1編碼方式,但從網頁源代碼中發現它的charset=gb2312是以我設定的encoding.getencoding("gbk或gb2312").能正确顯示中文漢字:
其實當擷取指定網頁字元集時,采用指定編碼方式對其進行解碼的核心代碼就是幾句:(同樣可設定webbrowser.documentstream)
也可以采用擷取到的文章内容content通過byte[] utf8bytes = system.text.encoding.convert(iso_8859_1, utf_8, isobytes);這樣的語句轉換為相應的内容顯示;經常能看到這樣的通過byte[]轉換iso-8859-1的方法,但本人沒有嘗試過.個人認為在讀入時就采用相對應的編碼方式比較好.
然後在點選按鈕事件中調用該函數即可:webbrowser1.documenttext = gethtmlbywebrequest(textbox1.text.trim());就能實作通路亂碼的網站,但網站還是有一個問題:在通路sohu時是亂碼,其他網站基本都能正常通路.這讓我有陷入思考中.下面是通路google,同時在該函數中最後添加file.writealltext("text.html",
content, encoding.utf8);還能擷取儲存靜态頁面.
文章主要是針對我在采用webbrowser編寫簡單浏覽器時遇到的中文亂碼問題,通常會顯示為"口口口"或"???",不同的編碼方式iso-8859-1、gbk、big5、utf-8采用相應的編碼方式即可避免.文章以php+mysql遇到的中文亂碼開頭,這裡也以它結尾,在php+mysql中需要注意兩個方面:
(1).php網頁|mysql|apache|浏覽器中|伺服器對應的編碼方式一緻,就會避免亂碼問題,其中utf-8對應utf-8,gb2312(國标碼)對應txt中ansi編碼方式;
(2).注意有無bom問題(為識别unicode檔案,以u+feff字元開頭,作為位元組順序标記byte-order mark,bom來識别檔案中使用的編碼和位元組順序),通常apache中charset設定為utf-8,是以采用ultraedit設定檔案格式為utf-8無bom另存為即可.
希望文章能幫助到大家,如果文章中有錯誤或不足之處,請大家海涵!