Php HTML净化器选择性地吃特殊字符

Php HTML净化器选择性地吃特殊字符,php,javascript,htmlpurifier,Php,Javascript,Htmlpurifier,对符合UTF-8的数据库使用PHP。下面是输入的方式 用户类型输入到文本区域 使用javascript escape()编码的textarea 通过HTTP post传递 使用PHP rawurldecode()解码 使用默认设置通过HTMLPurifier 为MySQL转义并存储在数据库中 它以通常的方式出现,我在页面加载时运行unescape()。这是为了允许人们,比如说,直接从word文档复制和粘贴,并显示智能引号 但HTMLPurifier似乎在处理非UTF-8特殊字符,这些字符转义()

对符合UTF-8的数据库使用PHP。下面是输入的方式

  • 用户类型输入到文本区域
  • 使用javascript escape()编码的textarea
  • 通过HTTP post传递
  • 使用PHP rawurldecode()解码
  • 使用默认设置通过HTMLPurifier
  • 为MySQL转义并存储在数据库中
  • 它以通常的方式出现,我在页面加载时运行unescape()。这是为了允许人们,比如说,直接从word文档复制和粘贴,并显示智能引号

    但HTMLPurifier似乎在处理非UTF-8特殊字符,这些字符转义()到一个简单的%表达式,如Ö,转义到%D6,而smartquotes转义到%u2024或其他什么,并以这种方式进入数据库。它同时删除特殊字符和紧跟其后的字符

    在这个过程中我需要改变一些东西。也许我需要改变很多事情

    我该怎么做才能不让特殊角色被击倒

  • 使用javascript escape()编码的textarea
  • 通过HTTP post传递
  • 我假设您使用
    XmlHttpRequest
    ?如果没有,请确保包含表单的页面被用作utf-8

  • 使用PHP rawurldecode()解码
  • 如果您通过
    $\u POST
    访问该值,则不应对其进行解码,因为已经进行了解码。这样做会弄乱数据

  • 为MySQL转义并存储在数据库中
  • 确保你没有打开。确保数据库将表存储为utf-8(编码和排序规则必须都是utf-8)。确保php和MySql之间的连接是utf-8(如果不使用PDO,请使用
    设置名称utf8


    最后,再次输出字符串时,请确保该页面作为utf-8使用。

    系统可以很好地处理智能引号,因此我不怀疑我的utf印章。encodeURIComponent通过HTMLPurifier获得,非常好,谢谢。但我在$\u POST中看到了%20。但奇怪的是,decodeURIComponent在我试图在生成的页面上运行它时抱怨URI无效,尽管unescape工作得很好。有什么想法吗?聪明的报价并不能保证utf-8能正常工作。如果iso-8859-1包含智能报价,一些客户会将其解释为cp-1252。你需要仔细检查整个管道。在添加JS之前,请尝试使用普通html表单。尝试使用汉字进行测试,因为它们在cp-1252和iso-8859-1中都不存在。