经典ASP - 如何将UTF-8字符串转换为UCS-2?

问题描述:

我有一个问题,我在UCS-2中存储一个UTF-8字符串在SQL Server中。当我将它拉出来显示在内容类型设置为UTF-8的页面上时,它工作正常。但是我有第三方的Javascript组件,当我将它传递给数据库的字符串时,它将它呈现为USC2。或者不是UTF8。经典ASP - 如何将UTF-8字符串转换为UCS-2?

在从数据库中读取字符串并将其传递给第三方组件(混淆)之后,ASP将此字符串转换为UTF-8吗?

希望这是有道理的。

Encoding.UTF8和Encoding.Unicode将提供足够的功能性。欲了解更多信息,请参阅Wikipedia

+5

-1这是传统的ASP,而不是ASP.NET。 – 2009-05-27 14:48:47

我怀疑你是经典形式后字符编码不匹配问题的犯规。

它是这样的: -

  • 你这是提供给使用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