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

10

我遇到一个问题,就是我在SQL Server中存储了一个UTF-8字符串作为UCS-2。当我将其取出并以content-type设置为UTF-8的方式显示在页面上时,它可以正常工作。但是我有一个第三方JavaScript组件,当我向其传递来自数据库的字符串时,它会将其呈现为USC2,而不是UTF8。

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

希望这样说有意义。

2个回答

42
我的怀疑是,您应该遇到了典型的表单提交字符编码不匹配问题。
具体原因如下:
- 您有一个表单,使用UTF-8编码向客户端呈现。 - 结果,浏览器使用UTF-8编码发布文本值输入到表单中。 - 接收帖子的操作页面其响应代码页设置为典型的OEM代码页,例如1252。 - 发布的每个UTF-8字符串的每个字节被服务器视为单个字符,而不是将一组UTF-8编码字节解码为正确的Unicode字符。 - 字符串存储在带有损坏字符的DB中。 - 页面希望向客户端呈现包含损坏字符的DB字段的内容。 - 该页面将其CharSet设置为UTF-8,但其Response.CodePage仍保持为OEM代码页,例如1252。 - 使用Response.Write将字段内容发送到客户端,Unicode字符被转换回以前以字节接收的字节集。 - 客户端认为自己得到了UTF-8,因此它将从服务器接收的字符解码为UTF-8,就像它们最初那样,因此它们在屏幕上正确显示。 - 在通过ASP反弹这些字符时,情况看起来都很好,一切进展顺利。一个页面中的错误与另一个页面中的匹配错误(可能是同一页)使一切看起来都很好。 - 如果直接使用SQL Server工具检查字段内容,则可能会看到损坏的字符串。现在,如果您想要将此字符串用于另一个期望简单Unicode字符串的组件中,那么这就是您发现此bug的地方。
解决方案是始终确保所有页面不仅在响应中发送CharSet="UTF-8",而且在使用Response.Write之前和尝试读取任何Request.Form值之前使用Response.CodePage = 65001。在<%@ page header中使用Codepage指令。
现在您需要修复DB中已有的损坏字符串。
使用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

这个函数(顺带一提,它是你实际问题的答案)接受一个已损坏的字符串(即具有字节表示的字节),并将其转换为应该是的字符串。您需要对DB中每个受到该错误影响的字段应用此转换。


三年后...太棒了!我知道我“陷入了经典的表单提交字符编码不匹配问题”,但我不知道它发生在哪里。如果我能强制这个成为被接受的答案,我会这么做。 - Brendan
非常感谢,这对我的情况是完美的解决方案。 - Pablo Martinez
2
应该指出,ConvertFromUTF8() 函数的使用应该仅限于纠正损坏的数据。开发人员仍应确保纠正站点以使用正确的编码,并避免首次出现编码不匹配。 - user692942

-4

使用 Encoding.UTF8 和 Encoding.Unicode 将提供足够的功能。有关更多信息,请参见维基百科


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接