【问题标题】:Convert UTF-8 String Classic ASP to SQL Database将 UTF-8 字符串经典 ASP 转换为 SQL 数据库
【发布时间】:2014-03-18 22:35:55
【问题描述】:

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

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 - How to convert a UTF-8 string to UCS-2?

现在我的问题是,我使用什么函数来预先转换字符串,然后将它们发送到数据库,这样当我检索它们时它们就可以使用了?

试过保罗的方法:

所以有第 1 页和第 2 页。第 1 页包含一个表单,提交时,该表单将字符串发送到数据库,然后在第 2 页中检索该数据库。我尝试了 Paul 的解决方案,方法是删除函数 ConvertFromUTF8 并将其保留为那是以前(它返回了奇怪的芒果字符)。之后,我在第 1 页和第 2 页的顶部添加了以下行。

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

我在这两个页面上也有以下内容:

Response.CodePage = 65001 
Response.CharSet = "UTF-8" 

但它没有工作:(

编辑:它有效!非常感谢大家的帮助! 我需要做的就是在第 3 页的顶部添加“CodePage = 65001”(我什至没有谈到),其中正在写入数据库部分。

【问题讨论】:

  • 您真的需要进行转换吗?这些天的标准程序是对输入表单使用 utf-8 编码,对输出页面使用 utf-8。这个网站上有很多关于这个问题的问题,这里有一篇非常有用的博客文章。 hanselman.com/blog/InternationalizationAndClassicASP.aspx
  • @John 实际上&lt;meta&gt; 标记和Content-Type 响应标头中的Charset 声明是多余的。当没有提供其他信息时,浏览器默认为 UTF-8。但是,也需要设置Session.CodePage = 65001
  • 如果你真的想走这种奇怪的方式,那么只需使用你的函数来转换发布的字符串,然后将它们保存在你的数据库中
  • 您的表单首先需要处理UTF-8 而不是Windows-1252,一旦您这样做,您的字符将在输入到数据库和再次输出时保持一致。使用@Paul suggestion请记住: 1. 您的 asp 页面需要保存为UTF-8 而不仅仅是声明。 2. 您需要在页面顶部指定&lt;%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%&gt; 3. 使用Response.CodePage = 65001Response.Charset = "UTF-8" 告诉服务器返回字符串为UTF-8 并告诉浏览器使用UTF-8 编码.
  • @Lankymart 我尝试了上述方法,但没有成功(问题编辑:请参阅“尝试保罗的方法)。如何确保 asp 页面保存为 UTF-8?

标签: sql utf-8 asp-classic character-encoding


【解决方案1】:

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

您需要完成每个步骤以确保获得一致的结果;

重要提示:这些步骤必须在您的网络应用程序的每个页面上执行,否则您会遇到问题(Paul 的评论强调了这一点)。

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

  2. 每个页面都需要添加以下行作为页面中的第一行,为了使这更容易,我将其与其他一些值一起放在一个包含文件中,以便我可以随时将它们包含在每个页面中。

    包含文件 - page_encoding.asp
    <%@Language="VBScript" CodePage = 65001 %>
    <% 
      Response.CharSet = "UTF-8"
      Response.CodePage = 65001
    %>
    

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

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

    Response.Charset = "UTF-8" 相当于在 HTTP content-type 标头中设置 ;charsetResponse.CodePage = 65001tell 的 ASP 将所有动态字符串处理为 UTF-8

  3. 页面中包含的文件也必须使用UTF-8 编码保存(还要仔细检查这些)。

按照这些步骤操作,您的页面将正常工作,您目前的问题是某些页面被解释为Windows-1252,而其他页面被视为UTF-8,您最终会遇到编码不匹配的问题。

【讨论】:

  • 非常感谢!我需要做的就是在第 3 页的顶部添加“CodePage = 65001”(我什至没有谈到),其中正在写入数据库部分。
  • @user1744228 我可以建议您作为新人快速阅读What should I do when someone answers my question?,您如何投票/接受答案取决于您。希望对您有所帮助。小心维护过程只是添加CodePage = 65001最终会导致更多问题,按照我的步骤,你不会出错。
  • @Lankymart 由于您的回答比我的回答更完整:我建议您强调网络应用程序中的每一页和每一页,忘记一页,您就有问题了。
  • @Paul +1,因为您的建议是合理的。
【解决方案2】:

通常 - 这个词有一个非常长的延伸 - 你不需要立即转换,更不鼓励它。在你写的asp页面的顶部:

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

告诉 ASP 发送和接收(从服务器的角度来看)UTF-8。此外,它指示解释器使用 2 字节字符串。因此,当写入数据库或从数据库读取时,一切都会自动进行,因此如果您的数据库使用 1 字节 char 或 2 字节 nchar 转换,则需要处理。实际上就是这样。您可以通过使用此套件进行测试来测试是否一切顺利:

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

该集合包含一些“欧洲”字符以及一些“Unicode”字符...如果您使用代码页 1252,这些 Unicode 将始终失败,因此这是一个很好的测试集。

【讨论】:

  • 不,浏览器不需要&lt;meta&gt;标签来识别编码。事实上,你根本不应该把它放进去。元标记是覆盖Content-Type: 响应标头的粗略方法(它被称为http-equiv 是有原因的)。放入元标记只会为潜在的冲突信息(Content-Type: 标头与元标记与浏览器自动字符集检测)打开更多位置。只需去掉元标记并通过Content-Type: 控制一切。
  • @Tomalak,你说的太对了,我已经编辑了答案以反映你的评论。
  • 我尝试了 Paul 的方法,但没有成功。我尝试过各种东西,比如元标记、response.codepage、response.charset 等等。但它们都不起作用。唯一有效的是使用函数来转换字符串。所以我只需要在将字符串发送到数据库之前可以使用的函数
  • @user1744228 您确实需要更新您的原始问题并向我们展示您如何尝试 Paul 的建议,如果您不熟悉它的工作原理,编码可能是一场噩梦,而且很容易出错.但是,当服务器可以为您执行此操作时,强制通过 ConvertFromUTF8() 函数传递您的数据效率非常低。
  • 示例集仅包括 ISO-8859-1 字符,不包括任何需要“Unicode”的字符。我使用以下内容,它具有 ISO-8859-1、Windows-1252 的附加功能以及两个需要 Unicode:ISO äàáâãåæçÿ WIN € ‘–’ “-” Ÿ UTF Łł END
猜你喜欢
  • 2010-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-20
  • 2016-03-24
相关资源
最近更新 更多