首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

VB.NET 解決 HttpWebResponse 讀取 GB2312 編碼網頁亂碼問題

     編輯:程式設計綜合問答

問題背景

在使用 VB.NET 進行網頁請求時,透過 HttpWebResponse 獲取回應串流並用 StreamReader 讀取內容,若目標網頁採用 GB2312 編碼,直接使用預設建構函式會導致中文顯示亂碼。這是因為 StreamReader 預設使用 UTF-8 編碼,無法正確解析 GB2312 位元組序列。

錯誤代碼示例

reader = New StreamReader(Response.GetResponseStream())

解決方案

在建立 StreamReader 時明確指定編碼為 GB2312(或對應的代碼頁 936),即可正確讀取中文內容:

reader = New StreamReader(Response.GetResponseStream(), Encoding.GetEncoding("GB2312"))

完整修正範例

Imports System.Net
Imports System.IO
Imports System.Text

Public Class Form1
    Const ConnectURL = "https://www.example.com/login.asp"
    Const HomeURL = "https://www.example.com/"

    Private Function RegularPage(ByVal URL As String, ByVal CookieJar As CookieContainer) As String
        Dim Request As HttpWebRequest = HttpWebRequest.Create(URL)
        Request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
        Request.AllowAutoRedirect = False
        Request.CookieContainer = CookieJar

        Dim Response As HttpWebResponse = Request.GetResponse()
        ' 關鍵修正:指定 GB2312 編碼
        Dim reader As New StreamReader(Response.GetResponseStream(), Encoding.GetEncoding("GB2312"))
        Dim html As String = reader.ReadToEnd()
        Response.Close()
        Return html
    End Function

    ' 其餘登入邏輯保持不變...
End Class

補充說明

  • 若不確定網頁編碼,可先檢查 Response.CharacterSet 屬性,或解析 HTML 中的 <meta charset=...> 標籤動態決定編碼。
  • 將讀取到的字串寫入檔案時,建議使用 Encoding.Unicode 或 Encoding.UTF8 儲存,避免後續讀取再次出現編碼問題。
  • .NET Core / .NET 5+ 專案需註冊編碼提供者:Encoding.RegisterProvider(CodePagesEncodingProvider.Instance) 並引用 System.Text.Encoding.CodePages 套件才能使用 "GB2312" 名稱。

常見誤區

切勿嘗試將位元組陣列先以預設編碼讀出再轉碼,這會造成資料永久損壞。正確做法是在「位元組 → 字串」的解碼階段一次指定正確編碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved