2

我有问题,我不明白是什么原因造成的。我在一个遗留网站上工作,用 Classic ASP 编写(天哪,为什么是我),有时显然是随机时间,没有任何解释,来自 ADODB.Recordset 的值被打印双编码。

对于双重编码,我的意思是“ UTF-8 多字节字符串的 ASCII 表示的 UTF-8 编码”,因此“ é ”看起来像“ é ”(具有完全相同的编码)。

让我抓狂的是,这似乎是随机发生的,50% 的时间编码正确,另外 50% 的编码不正确。

让我指出它在不同时间发生在同一页面上,因此在几次页面加载后,您可以正确显示它们,然后损坏,然后再次正确等等。

这件事发生在 7 年前这个网站的早期,但是很多水已经从桥下流过,只有一个最初在这个网站上工作的人仍然在公司工作。他不记得他们做了什么来解决这个问题,他让我只说“数据库连接编码已保存到会话中”,这也许可以解释为什么Session.CodePage = 65001页面周围有这么多。

我什至试图utf8通过查询强制字符集,但显然它不起作用。

使用的驱动程序是 olde MySQL ODBC 3.51 Driver

在此先感谢您提供任何建议或解决方案(不幸的是,摆脱 Classic ASP 不是一种选择)。

[更新]

这是一个情节转折,如果我输出这样的内容,它的中断次数会更少:

Session.CodePage = 1252
Response.Write(Property)
Session.CodePage = 65001

实际上,我几乎在网站的任何地方都发现了这段代码,好像数据库驱动程序根本不关心连接的字符集。

4

2 回答 2

1

我进行了一些测试,感谢@webaware 的建议,我说服自己将ODBC 驱动程序更新到5.1版,经过一些调整后网站似乎稳定了,这就是我使用的代码:

Response.AddHeader "Content-Type", "text/html; charset=UTF-8"
Session.CodePage = 65001
Dim ConnString:ConnString = "driver={MySQL ODBC 5.1 Driver};server=localhost;port=3306;database=database;uid=uid;pwd=pwd"

其他组合似乎破坏了输出编码,现在它开箱即用。

我希望这对未来有所帮助。

于 2013-01-21T18:48:38.487 回答
0

找到这种行为的原因可能真的很棘手。但是,让我指出一些有关经典 ASP 的事实,这些事实可能会对您有所帮助...

会话编码

Session.Codepage 影响会话的整个持续时间,这意味着所有后续请求都将使用指定的代码页。尽管通过再次指定另一个代码页,但这并不能阻止单个 asp 文件使用另一种编码。因此,请查看您的应用程序以查找通过Session.CodepageResponse.Codepage指定编码的页面。

浏览器编码:

这里的事情变得非常混乱。当表单数据发布到服务器时,表单 url 编码标准中没有规定声明使用的代码页。可以告诉浏览器使用什么编码,它们会默认使用包含表单的 html 页面的字符集,但是没有机制可以将该选择传达给服务器。

ASP 认为已发布表单字段的代码页与即将发送的响应的代码页相同。花点时间来吸收它.... 这意味着 Response.CodePage 值非常直观地对 Request.Form 返回的字符串产生影响。出于这个原因,尽早设置正确的代码页很重要,进行一些表单处理,然后在稍后发送响应之前设置代码页可能会导致意外结果。

asp文件中的字符串文字

当脚本引擎解析文件时,文件中的内容块(脚本代码块之外的东西)被转换为 Response.Write 的特殊形式(包括字符串文字)。它的特殊之处在于,在脚本执行将到达这些特殊写入时,处理器只需将文件中找到的字节逐字复制到输出流中,同样不会尝试转换任何编码。

阅读此问题的答案以获取更多信息。 内部字符串编码,经典 ASP

于 2013-01-11T14:58:24.160 回答