【问题标题】:PHP htmlspecialchars() function error when trying to use UTF-8 string尝试使用 UTF-8 字符串时 PHP htmlspecialchars() 函数错误
【发布时间】:2010-11-21 12:54:52
【问题描述】:

我做了以下事情:

  1. 我有一个包含数据的电子表格。其中一行包含一个 ü 字符。
  2. 我将其保存为 OpenOffice.org 中的 CSV 文件。当它要求我输入字符编码时,我选择 UTF-8。
  3. 我使用 Navicat 创建 MySQL 数据库表,InnoDB 使用 UTF-8 utf8_general 编码并导入 CSV。
  4. 我尝试使用 PHP 函数 htmlspecialchars($string, ENT_COMPAT, 'UTF-8'),其中 $string 是包含特殊 ü 字符的字符串。

它给了我一个错误:参数中的多字节序列无效。当我将'UTF-8' 更改为'ISO8859-1' 时,不会引发错误,但会显示不正确的字符。 (“未知字符”字符,看起来像<?>

如果我使用 HTML 表单更新数据库中的字符串,错误消失并且字符显示正确,但是,当我在 Navicat 中查看记录时,它看起来是两个字符:

[1/4][A with some thing on top of it]

一些不被视为一个字符的多字节。`

发生了什么,哪里出了问题,我能做些什么?

【问题讨论】:

    标签: php mysql character-encoding htmlspecialchars navicat


    【解决方案1】:

    虽然我不明白“无效多字节”错误来自哪里,但我很确定htmlspecialchars()not your culprit

    就该函数而言,字符集 ISO-8859-1、ISO-8859-15、UTF-8、cp866、cp1251、cp1252 和 KOI8-R 实际上是等效的,因为受 htmlspecialchars() 影响的字符在所有这些字符集中占据相同的位置。

    据我了解,htmlspecialchars() 对于 UTF-8 字符串应该可以正常工作,而无需指定字符集。我敢打赌,包含表单的 HTML 页面或您使用的数据库连接不是 UTF-8 编码的。对于后者,请尝试发送

    SET NAMES utf8;
    

    在执行插入之前到 mySQL。

    【讨论】:

    • 根据mysql通用查询日志,SET NAMES utf8实际上是发送到MySQL服务器的。虽然在这个过程中没有表单(当我更新记录时有一个),但它使用 HTML 元标记设置为 UTF-8。 (但同样,在使用表单之前,错误已经出现。)
    • @Pelle 你能确认它实际上是发送到服务器用于那个连接吗?并确认,您引用的错误实际上是由htmlspecialchars()?
    • 想通了。所有东西都是 UTF-8,除了:用于选择数据时的连接。将 SET NAMES UTF8 放在 select 语句之前修复它。
    • 注意,每次连接只需要 SET NAMES 一次,就在连接之后。
    猜你喜欢
    • 1970-01-01
    • 2017-11-15
    • 2011-09-05
    • 2016-05-31
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    • 2017-06-18
    • 1970-01-01
    相关资源
    最近更新 更多