在使用 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 儲存,避免後續讀取再次出現編碼問題。Encoding.RegisterProvider(CodePagesEncodingProvider.Instance) 並引用 System.Text.Encoding.CodePages 套件才能使用 "GB2312" 名稱。切勿嘗試將位元組陣列先以預設編碼讀出再轉碼,這會造成資料永久損壞。正確做法是在「位元組 → 字串」的解碼階段一次指定正確編碼。