2010-11-21 21 views
0

我做了如下的事情时:PHP的htmlspecialchars()函数的错误尝试使用UTF-8字符串

  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]

没有被看作是一个character.`

这是怎么回事,这里的事情出错了,我能做些什么什么有些多字节?

回答

2

虽然我不明白这里的“无效的多字节”错误来自,我敢肯定htmlspecialchars()not your culprit

For the purposes of this function, the charsets ISO-8859-1, ISO-8859-15, UTF-8, cp866, cp1251, cp1252, and KOI8-R are effectively equivalent, as the characters affected by htmlspecialchars() occupy the same positions in all of these charsets.

在我的理解,应该htmlspecialchars()做工精细的UTF-8字符串而不指定字符集。我敢打赌,无论是包含表单的HTML页面,还是您使用的数据库连接都不是UTF-8编码。对于后者,尝试发送一个

SET NAMES utf8; 

mySQL在插入之前。

+0

根据MySQL的一般查询日志,'utf8'实际发送到MySQL服务器组名称。尽管在这个过程中没有任何形式(当我更新记录时有一种形式),但它使用HTML元标记设置为UTF-8。 (但同样,在使用表单之前,该错误已经弹出。) – 2010-11-21 13:33:11

+0

@Pelle你能否确认它实际上是发送到服务器*的连接*?并且确认,你引用的错误实际上是由'htmlspecialchars()'引发的? – 2010-11-21 13:33:52

+0

想通了。所有的东西都是UTF-8,除了用于选择数据时的连接。在选择语句修复之前放置SET NAMES UTF8。 – 2010-11-21 14:05:26

相关问题