我在PHP方面遇到编码问题。
我有一个JavaScript / jQuery HTML5页面使用$ .post与我的PHP脚本交互。 但是,PHP面临着一个奇怪的问题,可能与编码有关。
写作时
htmlentities("í")
我希望PHP输出í
。但是,它会输出í
一开始,我认为我在编码方面犯了一些错误,但是
htmlentities("í")=="í"?"Good":"Fail";
正在输出“失败”,其中
htmlentities("í")=="í"?"Good":"Fail";
但htmlentities($search, null, "utf-8")
按预期工作。
我想让PHP与MySQL服务器通信,但它也有编码问题,即使我使用utf8_encode。我该怎么办?
编辑:在SQL命令上,编写
SELECT id,uid,type,value FROM users,profile
WHERE uid=id AND type='name' AND value='XXX';
其中XXX不包含任何字符,按预期工作,但如果有任何'í'字符则不会。
SET NAMES 'utf8';
SET CHARACTER SET 'utf8';
SELECT id,uid,type,value FROM users,profile
WHERE uid=id AND type='name' AND value='XXX';
不仅没有为cha字符失败,而且对于没有任何“特殊”字符的字符串也失败了。 从SET NAMES和SET CHARACTER SET中删除'字符似乎没有任何改变。
我使用PDO连接到MySQL数据库。
编辑2:我正在使用XAMPP for Linux的MySQL版本5.1.30。
编辑3:从PhpMyAdmin输出
运行SHOW VARIABLES LIKE '%character%'
character_set_client utf8
character_set_connection utf8
character_set_database latin1
character_set_filesystem binary
character_set_results utf8
character_set_server latin1
character_set_system utf8
character_sets_dir /opt/lampp/share/mysql/charsets/
从我的PHP脚本(带有print_r)输出相同的查询输出:
Array
(
[0] => Array
(
[Variable_name] => character_set_client
[0] => character_set_client
[Value] => latin1
[1] => latin1
)
[1] => Array
(
[Variable_name] => character_set_connection
[0] => character_set_connection
[Value] => latin1
[1] => latin1
)
[2] => Array
(
[Variable_name] => character_set_database
[0] => character_set_database
[Value] => latin1
[1] => latin1
)
[3] => Array
(
[Variable_name] => character_set_filesystem
[0] => character_set_filesystem
[Value] => binary
[1] => binary
)
[4] => Array
(
[Variable_name] => character_set_results
[0] => character_set_results
[Value] => latin1
[1] => latin1
)
[5] => Array
(
[Variable_name] => character_set_server
[0] => character_set_server
[Value] => latin1
[1] => latin1
)
[6] => Array
(
[Variable_name] => character_set_system
[0] => character_set_system
[Value] => utf8
[1] => utf8
)
[7] => Array
(
[Variable_name] => character_sets_dir
[0] => character_sets_dir
[Value] => /opt/lampp/share/mysql/charsets/
[1] => /opt/lampp/share/mysql/charsets/
)
)
运行
SET NAMES 'utf8';
SET CHARACTER SET 'utf8';
SHOW VARIABLES LIKE '%character%'
输出一个空数组。
答案 0 :(得分:18)
指定htmlentities的编码以匹配输入的编码非常重要,正如您在最后一个示例中所做的那样,但在前三个中省略了。
htmlentities($text,ENT_COMPAT,'utf-8');
关于与MySQL的通信,您需要确保连接排序规则和字符集与您传输的数据匹配。您可以在配置文件中设置它,也可以在运行时使用以下查询进行设置:
SET NAMES utf8;
SET CHARACTER SET utf8;
确保表,数据库和服务器字符集也匹配。有一个设置在运行时无法更改,这是服务器的字符集。您需要在配置文件中修改它:
[mysqld]
character-set-server = utf8
default-character-set = utf8
skip-character-set-client-handshake
详细了解MySQL in the manual中的字符集和排序规则。
答案 1 :(得分:7)
后期复兴。 但是为了进一步参考,这里有一些额外的提示:
SET xxx
设置标题:
<?php header("Content-type: text/html; charset=utf-8"); ?>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
答案 2 :(得分:1)
我刚遇到这个问题。我有一整个网站的西班牙语内容,包含您可以期待的所有特殊字符(áéíóúñ)和大写字母版本。
在我的情况下,它与服务器charset / collation不一致。其他所有设置为utf8,但服务器charset,其中有latin1。这导致在数据库中输入的所有utf8数据以其原始编码形式显示,如Lí将等于A与波浪号〜...
我正在使用mysqli,为了修复它,我使用了Anthony Accioly上面解释的方法(使用mysql_set_charset)。所述方法具有mysqli版本,这就是我使用的版本。
在那之后,我感到困惑。查看我的网站时,我仍然一团糟。当然,我不知道通过将latin1更改为utf8,我也会搞砸整个事物的字符编码/解码。所以我使用online string encoder/decoder的帮助来修复我的表数据。
我对所有内容数据进行了各种导出(您可以设置它们以获取更新查询,并且更新过程会更快)并通过前面提到的在线编码器/解码器运行sql输出,然后复制粘贴在phpmyadmin sql面板上修复了查询...从而修复了我的编码错误。现在一切都应该如此,我能够再次处理有损搜索:Maria,maria,maría,mariá将全部匹配maría,maria,Maria等。所有锐角字符都评估为他们的基本元音字符。大胜。