StreamReader.ReadToEnd()使用什么字符编码?

CJ7*_*CJ7 3 .net vb.net encoding utf-8 streamreader

  • 使用什么字符编码StreamReader.ReadToEnd()
  • 使用(b)代替下面(a)的原因是什么?
  • 如果使用(a)代替(b),是否存在字符编码问题的风险?
  • 还有另一种方法比(a)和(b)更好吗?

(一个)

Dim strWebResponse As String
Dim Request As HttpWebRequest = WebRequest.Create(Url)
Using Response As WebResponse = smsRequest.GetResponse()
    Using reader As StreamReader = New StreamReader(Response.GetResponseStream())
        strWebResponse = reader.ReadToEnd()
    End Using
End Using
Run Code Online (Sandbox Code Playgroud)

(b)中

Dim encoding As New UTF8Encoding()
Dim strWebResponse As String
Dim Request As HttpWebRequest = WebRequest.Create(Url)
Using Response As WebResponse = Request.GetResponse()
    Dim responseBuffer(Response.ContentLength - 1) As Byte
    Response.GetResponseStream().Read(responseBuffer, 0, Response.ContentLength - 1)
    strWebResponse = encoding.GetString(responseBuffer)
End Using
Run Code Online (Sandbox Code Playgroud)

Jim*_*hel 11

所使用的标准编码StreamReaderEncoding.Default,将从机器根据您的Windows版本,并且已经设置的语言环境而异机. Encoding.UTF8.

我无法记住默认值是什么,所以我更喜欢使用StreamReader允许我指定编码的构造函数.例如:

Using reader As StreamReader = New StreamReader(Response.GetResponseStream(), Encoding.UTF8)
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅构造函数文档.

如果在示例a中使用该构造函数,则结果将与示例b中的结果相同.

你应该使用UTF-8吗?这取决于您下载的页面.如果您下载的页面是使用UTF-8编码的,那么是的,您应该使用UTF-8.如果HTTP标头中没有定义字符集,则UTF-8应该是默认值.但是您需要检查Content-Type标头以确定页面是否使用其他编码.例如,Content-Type标题可能是:

 application/xml; charset=ISO-8859-2
Run Code Online (Sandbox Code Playgroud)

您必须检查它的ContentType属性HttpWebResponse,检查是否有charset字段,并根据该属性正确设置编码.

或者,只需使用UTF-8并希望获得最佳效果.

  • 没有!默认编码是**不是**Encoding.Default而是UTF-8,正如[构造函数文档](http://msdn.microsoft.com/en-us/library/yhfzs7at.aspx)中所指定的那样: ).我同意这是令人困惑的,微软将该编码命名为Default,而它实际上并不是.Net中的默认编码.据推测,理由是它是旧的非Unicode本机Windows程序的默认设置. (2认同)
  • @CJ7:请参阅http://msdn.microsoft.com/en-us/library/yhfzs7at.aspx。“这个构造函数将编码初始化为 UTF8Encoding...” (2认同)