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

时间:2009-05-27 14:43:33

标签: utf-8 asp-classic

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

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

希望这是有道理的。

2 个答案:

答案 0 :(得分:40)

我怀疑你是否会对经典形式的帖子字符编码不匹配问题犯规。

它是这样的: -

  • 您有一个使用UTF-8编码呈现给客户的表单。
  • 因此,浏览器会使用UTF-8编码发布输入到表单中的文本值。
  • 接收帖子的操作页面将其Response.Codepage设置为典型的OEM代码页,例如1252.
  • 发布的UTF-8字符串的每个字节都被服务器视为单个字符,而不是将UTF-8编码字节集解码为正确的unicode字符。
  • 该字符串存储在数据库中,其中包含现已损坏的字符。
  • 页面希望向客户端显示包含损坏字符的数据库字段的内容。
  • 页面将CharSet设置为UTF-8,但其Response.CodePage仍保留在OEM代码页(例如1252)。
  • Response.Write用于将字段内容发送到客户端,将unicode字符转换回字节集,如在ealier帖子中收到的字节集。
  • 客户认为它获得了UTF-8,因此它将从服务器收到的字符解码为UTF-8,就像它们最初正确显示在屏幕上一样。
  • 一切都很好,好像一切都好,而这些角色只是通过ASP来回反弹。一个页面中的错误在另一个页面中有一个匹配的错误(可能是同一页面),这使得一切看起来都很好。

如果直接使用SQL Server工具检查字段内容,您可能会在那里看到损坏的字符串。现在你想要将这个字符串与另一个期望直接unicode字符串的组件一起使用,这就是你发现这个bug的地方。

解决方案是始终确保您的所有页面不仅在响应中发送CharSet =“UTF-8”,而且在使用Response.Write之前和尝试读取任何Request.Form值之前也使用Response.CodePage = 65001。在<%@ page header。

中使用Codepage指令

现在您只需修复数据库中已损坏的字符串。

使用ADODB.Stream: -

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的受害者的DB中的每个字段。

答案 1 :(得分:-4)

Encoding.UTF8和Encoding.Unicode将提供足够的功能。有关详细信息,请参阅Wikipedia