将UTF-8字符串从经典ASP转换为SQL数据库

8

我遇到了一个关于正确转换法语字符的问题。基本上,我有一个表单将数据发送到SQL数据库。然后,在另一个页面上,从该数据库检索数据并向用户显示。但是,因为在另一页表单中输入的是法语,所以数据(字符串)会显示为带有奇怪的损坏字符。我通过使用以下函数来克服此问题,该函数将字符串转换为正确的字符集。然而,显然更好的解决方案是先进行转换,然后再将其发送到数据库。现在这里是用于将从数据库检索的字符串转换为适当字符集的代码:

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

我从这里得到了这个函数:Classic ASP - 如何将UTF-8字符串转换为UCS-2? 现在我的问题是,我需要使用什么函数来在将字符串发送到数据库之前将其转换,以便在检索它们时可以直接使用?
尝试了Paul的方法:
所以有第一页和第二页。第一页包含一个表单,当提交表单时会将字符串发送到数据库,然后在第二页中检索。我尝试了Paul的解决方案,删除了ConvertFromUTF8函数,并将其恢复为之前的状态(它返回了奇怪的蒙古字符)。之后,在第一页和第二页页面顶部添加了以下行。
<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>

我在这两个页面上也有以下内容:
Response.CodePage = 65001 
Response.CharSet = "UTF-8" 

但是它没有起作用 :(

编辑:它起作用了!非常感谢大家的帮助!我所需要做的就是在第3页(我甚至没有提到)中添加"CodePage = 65001",这是写入数据库部分发生的地方。


你真的需要进行转换吗?如今的标准程序是仅在输入表单中使用 utf-8 编码,在输出页面中使用 utf-8。这个网站上有很多关于这个问题的问答,还有一篇非常有用的博客文章,请参考这里:http://www.hanselman.com/blog/InternationalizationAndClassicASP.aspx。 - John
@John 实际上,<meta> 标签和 Content-Type 响应头中的 Charset 声明是多余的。当没有其他信息时,浏览器默认使用 UTF-8。但是,设置 Session.CodePage = 65001 也是必要的。 - Tomalak
如果你真的想走这条奇怪的路,那么就使用你的函数将发布的字符串转换并保存到数据库中。 - ulluoink
你的表单需要在第一时间处理UTF-8而不是Windows-1252,一旦你这样做了,你的字符将从输入到数据库再到输出保持一致。使用@Paul的建议(https://dev59.com/n3zaa4cB1Zd3GeqPSqfR#21873977)。请注意:1.你的asp页面需要保存为`UTF-8`而不仅仅是有声明。2.你需要在页面顶部指定`<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>。3.使用Response.CodePage = 65001Response.Charset = "UTF-8"告诉服务器以UTF-8返回字符串,并告诉浏览器使用UTF-8`编码。 - user692942
@user1744228 这取决于你使用的是记事本Visual Studio等工具。对于Visual Studio来说,它有一个隐藏的菜单选项,你需要去找到并启用它,这个选项叫做“高级保存选项”。 - user692942
显示剩余3条评论
2个回答

12

保罗的回答没有错,但这不是唯一需要考虑的部分:

您需要按照以下每个步骤,以确保获得一致的结果。

重要提示:这些步骤必须在您网站应用程序中的每个页面上执行,否则您将会出现问题(由Paul的评论强调)。

  1. 每个页面都需要使用UTF-8编码进行保存,请仔细检查,因为有些IDE默认使用Windows-1252编码(也经常被错误地称为“ANSI”)。

  2. 每个页面都需要添加以下行作为页面的第一行,在include文件中加入此行和其他一些值可以使此过程更加简单,从而可以在每个页面中包含它们。

    Include File - page_encoding.asp
<%@Language="VBScript" CodePage = 65001 %>
<% 
  Response.CharSet = "UTF-8"
  Response.CodePage = 65001
%>

在 ASP 页面的顶部使用(最好放在网站根目录下的 config 文件夹中)

<!-- #include virtual="/config/page_encoding.asp" -->

Response.Charset = "UTF-8" 是设置 HTTP content-type 头部中的 ;charset 的等效方式。

Response.CodePage = 65001 表示 ASP 处理所有动态字符串时都使用 UTF-8

  • 在页面中包含的文件也必须使用 UTF-8 编码(请仔细检查这些文件)。

  • 按照这些步骤操作,你的页面就能正常工作了。目前的问题是有些页面被解释为 Windows-1252,而其他页面则被视为 UTF-8,导致编码不匹配。


    非常感谢!我所需要做的就是在第三页(我甚至没有提到)的顶部添加“CodePage = 65001”,这是写入数据库部分发生的地方。 - user1744228
    1
    @user1744228,作为你的新人,我可以建议你快速阅读一下当有人回答我的问题时我该做什么?,如何投票/接受答案由你决定。希望这对你有所帮助。请注意保持流程,仅添加“CodePage = 65001”最终会导致更多问题,请按照我的步骤操作,您不会错的。 - user692942
    1
    @Lankymart,由于您的答案比我的更完整:我可以建议您强调Web应用程序中的每个页面,忘记一个页面,您就会遇到问题。 - Paul
    @Paul +1 因为说到底你的建议是明智的。 - user692942

    6

    通常情况下 - 这个词有很长的延伸 - 你不需要手动进行转换,甚至更不鼓励这样做。在你的 asp 页面顶部写入以下代码:

    <%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
    

    这段代码告诉ASP使用UTF-8发送和接收数据(从服务器的角度看),并指示解释器使用2字节字符串。因此,当写入或读取数据库时,所有转换都会自动处理,因此如果您的数据库使用1字节char或2字节nchar,也会被照顾到。实际上,就是这样。您可以通过测试以下字符集来测试是否一切正常:

    áäÇçéčëíďńóöçÖöÚü

    该字符集包含一些“欧洲”字符以及一些“Unicode”字符……如果使用代码页1252,则始终无法识别那些Unicode字符,因此它是一个不错的测试字符集。


    1
    不需要在浏览器中加入<meta>标签来识别编码。实际上,你根本不应该加入它。meta标签是一种粗糙的方式来覆盖“Content-Type:”响应头(它被称为“http-equiv”的原因)。加入meta标签只会打开一个更多的潜在冲突信息的位置(“Content-Type:”头与meta标签与浏览器自动字符集检测之间)。只需省略meta标签并通过“Content-Type:”控制所有内容即可。 - Tomalak
    @Tomalak,你说得太对了,我已经编辑了答案以反映你的评论。 - Paul
    我尝试了Paul的方法,但是没有成功。我尝试了各种各样的东西,比如元标签、response.codepage、response.charset等等。但是它们都不起作用。唯一有效的方法就是使用一个函数来转换字符串。所以我只需要那个在发送字符串到数据库之前可以使用的函数。 - user1744228
    @user1744228,您真的需要更新原始问题并向我们展示您如何尝试Paul的建议。如果您不熟悉编码方式,编码可能会成为一场噩梦,很容易出错。但是,当服务器可以为您执行此操作时,强制将数据通过ConvertFromUTF8()函数传递是极其低效的。 - user692942
    1
    示例集仅包括ISO-8859-1字符,不包括任何需要“Unicode”的内容。我使用以下内容,其中包含ISO-8859-1、Windows-1252的额外内容以及两个需要Unicode的内容:ISO äàáâãåæçÿ WIN € ‘–’ “—” Ÿ UTF Łł END - stevek_mcc
    @stevek_mcc,你说得对,我在某个地方错过了错误的复制粘贴,所以我已经将字符调整为预期的字符。 - Paul

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