2009-05-27 93 views
10

我有一個問題,我在UCS-2中存儲一個UTF-8字符串在SQL Server中。當我將它拉出來顯示在內容類型設置爲UTF-8的頁面上時,它工作正常。但是我有第三方的Javascript組件,當我將它傳遞給數據庫的字符串時,它將它呈現爲USC2。或者不是UTF8。經典ASP - 如何將UTF-8字符串轉換爲UCS-2?

在從數據庫中讀取字符串並將其傳遞給第三方組件(混淆)之後,ASP將此字符串轉換爲UTF-8嗎?

希望這是有道理的。

回答

-4

Encoding.UTF8和Encoding.Unicode將提供足夠的功能性。欲瞭解更多信息,請參閱Wikipedia

+5

-1這是傳統的ASP,而不是ASP.NET。 – 2009-05-27 14:48:47

40

我懷疑你是經典形式後字符編碼不匹配問題的犯規。

它是這樣的: -

  • 你這是提供給使用UTF-8編碼的客戶端的形式。
  • 因此,瀏覽器將使用UTF-8編碼輸入到表單中的文本值發佈。
  • 接收柱的操作頁面具有其Response.Codepage設置爲一個典型的OEM代碼頁如1252
  • 張貼的UTF-8字符串中的每一個字節是由服務器處理的作爲一個單獨的字符,而不是解碼套UTF的-8編碼的字節到正確的Unicode字符。
  • 該字符串存儲在數據庫中,現在已損壞的字符。
  • 頁面希望向客戶端呈現包含損壞字符的DB字段的內容。
  • 頁面設置它的字符集爲UTF-8,但其Response.CodePage保持在OEM代碼頁如1252
  • 回覆於用於發送的字段的內容到客戶端,中的Unicode字符變換回字節設置爲字節在ealier後收到。
  • 客戶端認爲它獲取UTF-8,因此它將從服務器接收到的字符解碼爲UTF-8,就像它們最初一樣,因此它們正確顯示在屏幕上。
  • 一切正常,好像一切正​​常,而這些人物只是簡單地通過ASP來回跳動。一頁中的錯誤在另一頁中有一個匹配的錯誤(可能是相同的頁面),這使得一切看起來都很好。

如果您直接使用SQL Server工具檢查字段內容,那麼您可能會在其中看到損壞的字符串。既然你想用這個字符串與另一個期望一個直接unicode字符串的組件,這是你發現這個錯誤的地方。

解決方案是始終確保您的所有頁面不僅在響應中發送CharSet =「UTF-8」,還在使用Response.Write之前和嘗試讀取任何Request.Form值之前使用Response.CodePage = 65001。在<%@頁面標題中使用Codepage指令。

現在您只需修復已損壞的字符串就可以了。

使用ADODB。流: -

Function ConvertFromUTF8(sIn) 

    Dim oIn: Set oIn = CreateObject("ADODB.Stream") 

    oIn.Open 
    oIn.CharSet = "WIndows-1252" 
    oIn.WriteText sIn 
    oIn.Position = 0 
    oIn.CharSet = "UTF-8" 
    ConvertFromUTF8 = oIn.ReadText 
    oIn.Close 

End Function 

此函數(BTW是回答你的問題實際)發生損壞的字符串(一個具有字節表示的字節),並轉換爲字符串它應該是。您需要將此轉換應用於數據庫中已經成爲該bug的受害者的每個字段。

+0

三年後...真棒回答!我知道我「陷入了經典的形式後字符編碼不匹配問題」,但我不知道它在哪裏發生。如果我能強制這是被接受的答案,我會的。 – Brendan 2012-06-12 15:37:20