表单和HTML Purifier / MySQL的编码问题

时间:2010-04-28 12:46:49

标签: php mysql unicode encoding

让我疯了......

带表单的页面通过以下方式编码为Unicode(UTF-8):

<meta http-equiv="content-type" content="text/html; charset=utf-8">

数据库中的

条目列为text utf8_unicode_ci

从Word文档中复制文本,其中“在其中:“1922.”是insta-fail,最终在数据库中以â��1922.â��结尾(在表单中键入新数据,包括{{1}工作得很好......它是从Word中剪切和粘贴的......)

幕后的PHP步骤是:

  • 从POST中获取值
  • 运行HTML Purifier默认设置
  • 贯穿mysql_real_escape_string
  • 将查询插入dbase

帮助?

2 个答案:

答案 0 :(得分:1)

调用mysql_set_charset让数据库知道您将发送UTF-8编码的字符串。

  

在表单中输入新数据,包括“工作正常......

"是正常的ASCII引用。 不是,它们是智能引号,是非ASCII字符。他们是否来自Word是不重要的;所有非ASCII字符都将被视为相同。

  
      
  • 从POST中获取值
  •   
  • 运行HTML Purifier默认设置
  •   

这是一个坏主意。 HTML Purifier应该在HTML字符串上运行,并且您打算以HTML格式输出,对于需要让用户提交HTML的相对罕见的情况。

运行所有输入文本完全是错误的。通常你应该允许任何旧文本,然后当你在HTML中输出该文本时,你应该通过它调用htmlspecialchars()

否则,您正在破坏用户输入<&的能力,就像我在这篇文章中一样,当您输出已处理或未输入时,您仍然存在跨站点脚本的风险 - 资源数据。

答案 1 :(得分:1)

“1922.”和“1922”。是两个不同的字符串 单词的引号不是双引号“!=”

您描述的列是text utf8_unicode_ciutf8_unicode_ci是排序规则,请确保该列上的字符集设置为utf8

然后我会确保使用SET NAMES utf8 COLLATE utf8_unicode_ci...

为每个连接设置正确的编码

如果你已经完成了并且仍然没有正确保存,请确保你的php已启用mbstrings并尝试使用mb_函数。

您可能有很多根本原因,但我认为charset列和SET NAMES ...应解决此问题。