PHP / MySQL中的特殊字符
我在数据库中有包含特殊字符的单词(大部分是西class牙文,像黛德)。 在数据库中,所有内容都被保存并正确显示在PHPmyAdmin中,但是当我获取数据(使用PHP)并在浏览器中显示时,会出现一个奇怪的字符,如“?” 与一个正方形…我需要一个普通的修补程序,所以我不需要每次都逃避每个字符,而且我也能够从PHP表单插入特殊的西class牙字符到数据库中…
HTML是正确的:
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
所有表和数据库都设置为utf8_spanish
我得到的人物:
有什么build议么???
谢谢!!!
我只想提供一些关于vartec提出的解决scheme的更多细节(取决于你的MySQL安装)是你的问题的最正确的解决scheme。 首先,MySQL中的字符集/编码问题是一个相当复杂的主题,在MySQL手册第9.1章“字符集支持”中有广泛的介绍。 特别是你的情况9.1.4。 “连接字符集和sorting”将是最相关的。
为了简短起见,MySQL必须知道哪个字符集/编码客户端应用程序(从您的PHP脚本的数据库persoective开始)所期待的,因为它将从server-上定义的内部字符集/编码转换所有string数据,数据库,表或列级别转换成连接字符集/编码。 你在客户端使用UTF-8,所以必须告诉MySQL你使用的是UTF-8。 这是通过MySQL命令SET NAMES 'utf8'
来完成的,它必须作为打开连接的第一个查询来发送。 根据您的安装以及您在PHP脚本中使用的MySQL客户端库,可以在每个连接上自动完成。
如果使用PDO,只需要设置一个configuration参数即可
$db = new PDO($dsn, $user, $password); $db->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES 'utf8'");
使用mysqli改变客户端字符集/编码更加简单:
$mysqli = new mysqli("localhost", "user", "password", "db"); $mysqli->set_charset("utf8");
我希望这将有助于使整个事情更容易理解。
连接后立即发出SET NAMES 'utf8'
:
$mysqli = new mysqli("localhost", "user", "password", "database"); $mysqli->query("SET NAMES 'utf8'");
让MySQL自动翻译它
$conn = mysql_connect('host', 'user', 'password'); mysql_set_charset('utf8',$conn);
http://es.php.net/manual/en/function.mysql-set-charset.php
编辑:从你的评论我收集,这实际上编码拉丁文所以
mysql_set_charset('latin1_spanish_ci',$conn);
将HTML charset更改为ISO-8859-1修复了问题! 愚蠢
我从某个地方find了这个地方,从那以后一直用它作为整体而不用考虑太多。
mysql_query("SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'");
圣洁的废话..这让我疯狂。 我正在尝试做同样的事情。 我添加了一个utf-8编码的HTML标头。mysqli_set_charset()在几个小时后救了我,但我很高兴我现在正在工作
另一个尝试编码特殊字符和重音的函数是htmlentities()
打开你的HTML中的Unicode编码。
在处理特殊字符时,我总是注意以下几点:
- 数据库,表和字段字符集都设置为utf8_general_ *或utf8_unicode_ *
- 我确定我的编辑器用正确的字符集保存PHP文件
- 我将php.ini中的default_charset设置为UTF-8 或
- 我发送一个Content-Type:text / html; charset = UTF-8标题
- META标签中的字符集是UTF-8(这由Content-Type HTTP标头覆盖)
- 连接到MySQL时,我发出以下查询:
- SET NAMES utf8
- SET CHARACTER SET utf8
- SET COLLATION_CONNECTION =“utf8_general_ci”/“utf8_general_ci”
你确定你的数据库中有UTF8数据吗?
你可以简单地做:
$link = mysql_connect("host", "user", "password"); mysql_select_db("database", $link); mysql_query("SET NAMES 'utf8';", $link);
我的解决scheme是:做所有上述提供,但也正在使用记事本++和文件必须像这样保存:去编码在manu选项卡,并保存文件 – >编码在utf8