2013-01-07 274 views
1

我想使用.Net的WebClient類下載網頁,提取標題(即<title></title>之間的內容)並將頁面保存到文件。將UTF8轉換爲ANSI?

問題是,頁面使用UTF-8編碼,並且System.IO.StreamWriter在使用帶有這些字符的文件名時引發異常。

我google了,並嘗試了幾種方法將UTF8轉換爲ANSI,無濟於事。有人有爲此工作的代碼嗎?

'Using WebClient asynchronous downloading 
Private Sub AlertStringDownloaded(ByVal sender As Object, 
            ByVal e As DownloadStringCompletedEventArgs) 
    If e.Cancelled = False AndAlso e.Error Is Nothing Then 
     Dim Response As String = CStr(e.Result) 

     'Doesn't work    
     Dim resbytes() As Byte = Encoding.UTF8.GetBytes(Response) 
     Response = Encoding.Default.GetString(Encoding.Convert(Encoding.UTF8, 
               Encoding.Default, resbytes)) 

     Dim title As Regex = New Regex("<title>(.+?) \(", 
             RegexOptions.Singleline) 
     Dim m As Match 
     m = title.Match(Response) 
     If m.Success Then 
      Dim MyTitle As String = m.Groups(1).Value 

      'Illegal characters in path. 
      Dim objWriter As New System.IO.StreamWriter("c:\" & MyTitle & ".txt") 
      objWriter.Write(Response) 
      objWriter.Close() 
     End If 
    End If 
End Sub 

編輯:感謝大家的幫助。事實證明,錯誤不是由於UTF8造成的,而是頁面標題部分隱藏的LF字符,這顯然是路徑中的非法字符。


編輯:這裏有一個簡單的方法來去除一些非法字符的文件名/路徑:

Dim MyTitle As String = m.Groups(1).Value 
Dim InvalidChars As String = New String(Path.GetInvalidFileNameChars()) + New String(Path.GetInvalidPathChars()) 
For Each c As Char In InvalidChars 
    MyTitle = MyTitle.Replace(c.ToString(), "") 
Next 

編輯:下面是如何告訴WebClient的期望UTF-8:

Dim webClient As New WebClient 
AddHandler webClient.DownloadStringCompleted, AddressOf AlertStringDownloaded 
webClient.Encoding = Encoding.UTF8 
webClient.DownloadStringAsync(New Uri("www.acme.com")) 
+0

有大量的ASCII字符不能在文件中使用尼姆......完全是什麼標題? – Esailija

+0

對不起,字符很好(雖然我寧願在文件名中使用ANSI字符而不是UTF8:「c:\Cinéma Paradiso.txt」不是用戶友好的)。我會找到如何去除隱藏的,引起錯誤的LF字符 – Gulbahar

回答

1

我不認爲這個問題與UTF-8有關。如果它出現在同一行上,我認爲你的正則表達式將包含</title>。字符<>在Windows文件名中無效。

如果這不是問題,請參閱MyTitle的示例輸入和輸出值。

+0

絕妙的一點。問題不是編碼。問題是非法字符。爲了改善你的答案,如果你認爲RegEx是一個問題,我建議舉一個更好的RegEx的例子來糾正這個問題。此外,即使RegEx正確,標題仍可能包含非法字符。應該使用'Path.GetInvalidPathChars'方法,獲取需要替換或刪除的字符列表。 –

+0

謝謝史蒂夫。你是對的,在實際標題之前有一個隱藏的LF字符: - /然而,我寧願將字符從UTF8轉換爲ANSI,以使它們用戶可讀。 – Gulbahar

+0

感謝Steven對「Path.GetInvalidPathChars」的提示。確實有一個隱藏的非法字符 – Gulbahar