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

标签 utf-8 asp-classic

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

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

希望这是有道理的。

最佳答案

我的怀疑是您遇到了经典的表单后字符编码不匹配问题。

它是这样的:-

  • 您有一个使用 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 字符被转换回在早期帖子中接收到的字节集。
  • 客户端认为它得到了 UTF-8,因此它将从服务器接收到的字符解码为 UTF-8,就像它们最初一样,因此它们正确地出现在屏幕上。
  • 一切都很好,好像一切都很好,而这些字符只是通过 ASP 来回弹跳。一个页面中的错误在另一页(可能是同一页面)中有一个匹配的错误,这使得一切看起来都很好。

  • 如果您直接使用 SQL 服务器工具检查字段内容,您可能会在那里看到损坏的字符串。现在您想将此字符串与另一个需要直接 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
    

    这个函数(顺便说一句是你实际问题的答案)接受一个损坏的字符串(一个具有字节表示的字节)并转换为它应该是的字符串。您需要将此转换应用于已成为该错误受害者的数据库中的每个字段。

    关于utf-8 - 经典 ASP - 如何将 UTF-8 字符串转换为 UCS-2?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/916118/

    相关文章:

    c#-4.0 - COM Interop 中动态代码的内存泄漏

    卸载前的 jQuery

    c++ - 使用 C++(无 winapi)将 UTF-8 字符转换为最接近的等效 ASCII 字符

    python - 为什么这种到 utf8 的转换不起作用?

    mysql - 特殊字符和简单的选择查询

    .net - 从经典的 ASP 到 .net c# 或 vb?

    asp-classic - 没有多线程的 ASP 经典 GET 请求

    mysql - 使用Sqoop导入Mysql UTF8数据的问题

    java - 随机访问文件和 UTF 8 行

    jquery - ASP 试图从 DB 转换出来并将 2 个值相乘