【发布时间】:2014-12-22 07:55:03
【问题描述】:
我有一个用 Perl、Apache 和 Mysql 开发的遗留应用程序。
应用程序中的某些部分显示字符的 HTML 代码。该问题与键盘上的以下字符有关:
- 分号
- 逗号
- 引号
- 小于符号
- 大于符号
存储这些数据的表本身也存储了这样的数据。该表是 CHARSET=latin1。
应用程序正在使用
<meta charset="utf-8" />
在 HTML 渲染中。
我的问题是“如何解决这个问题”?
- 我应该对 DB 字符集进行一些更改吗? (我有多个 应用程序中出现此问题的位置和多个表 用于各个部分)
- 我应该对 PERL DB 连接进行一些更改吗? (这看起来是处理问题的最佳位置,因为这对于使用 DB 交互的任何模块都是常见的)模块,以便它将解码/编码特殊字符。
还有其他建议吗?
【问题讨论】:
-
数据如何存储在数据库中?是否有一些代码可以转换实际的用户输入,例如Ascii 撇号 (') 被转换为
&#39:? (没有真正的理由这样做,但遗留代码经常做一些奇怪的事情。)数据库中的数据是如何插入到 HTML 文档中的?如果您只是插入&#39:,它会显示为 Ascii 撇号,因此代码必须执行其他操作。 -
可能代码的HTML渲染部分不知道数据库中的文本已经被特殊字符转义了;所以它会在渲染 html 之前再转义一次。
-
IMO 这是一个数据库问题:latin-1 字符集支持当前编码的实体,因此应将它们改回适当的字符,以便可以直接在数据库中查看信息而无需将
&#39;转换为撇号等的任何心理体操。如果将数据库数据输出到某些实体确实需要编码的介质——例如到需要对<和>进行编码的网页——生成网页输出的代码应该进行这种转换。