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

Bri*_*n G 10 utf-8 asp-classic

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

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

希望这是有道理的.

Ant*_*nes 40

我怀疑你是不是犯了经典形式的帖子字符编码不匹配问题.

它是这样的: -

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

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

解决方案是始终确保您的所有页面不仅在响应中发送CharSet ="UTF-8",而且在使用Response.Write之前和尝试读取任何Request.Form值之前也使用Response.CodePage = 65001.在<%@页眉中使用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
Run Code Online (Sandbox Code Playgroud)

这个函数(BTW是你实际问题的答案)采用一个损坏的字符串(一个具有字节表示字节的字符串)并转换为它应该具有的字符串.您需要将此转换应用于已成为该bug的受害者的DB中的每个字段.

  • 应该指出的是,使用`ConvertFromUTF8()`函数应该**仅用于纠正损坏的数据.开发人员仍应确保他们更正网站以使用正确的编码,并首先避免编码不匹配. (2认同)

cra*_*her -4

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