我从MySQL数据库中提取数据的奇怪字符

时间:2010-09-01 11:27:29

标签: php mysql character-encoding

好吧,我有一个MySQL数据库,编码为u​​tf8_unicode_ci,它就像当前应用程序的魅力一样运行(用Code Igniter编写)

现在,我正在开发一个新的PHP应用程序,当我尝试恢复数据时,几个字符是不可读的 - 使用phpMyAdmin在数据库中显示正常的字符,但是当我尝试将其放在网页中时,它变得像“ROLA 60”。

这些字符是西班牙字母,例如ñ,á,Ó...或ascii代码,如€,Ø......

问题出在哪里?我将页面设置为 meta http-equiv =“Content-Type”content =“text / html; charset = UTF-8”,我已经尝试过mysql_set_charset()函数,但仍然什么都没有。

有这种问题的经验吗?

5 个答案:

答案 0 :(得分:3)

我在数据库驱动的应用程序中注意到了这个确切的问题,我花了很长时间才解决它!

问题出现是因为应用程序中至少有三个位置需要定义字符集,并且它们必须都是相同的字符集(并且该字符集必须能够处理您正在处理的字符)。 / p>

当浏览器不理解传递的字符时,会出现问号符号及其变化。

确保您的角色集在以下位置匹配:

  1. HTML主管部分。
  2. 数据库排序规则本身 - 可以在创建新表时更改phpMyAdmin,也可以更改现有表的模式。
  3. 最容易被忽略的字符集设置:php.ini文件的“default_charset”值(可以通过PHP脚本或httpd.conf文件设置)。
  4. 从您的帖子判断,您的PHP配置可能设置为使用不同的default_charset。这意味着你的数据库将存储好的字符,并将字符发送到你的脚本,但PHP脚本本身不知道如何处理字符,因此输出到浏览器作为恼人的问号符号

    尝试将php.ini值更改为相同的字符集,您可能会惊讶地看到字符显示正常!如果您无权访问php.ini,则可以使用以下函数更改该值:

    ini_set("default_charset", "UTF-8");
    

    希望这有帮助。

答案 1 :(得分:2)

如果mysql_set_charset()不起作用,请尝试执行

mysql_query('SET NAMES utf8');

建立连接后。

答案 2 :(得分:2)

任何类型的问题都只需要一次经验:了解你在做什么和调试。由于像stackoverflow这样的网站,现在非常难得。

有3个级别涉及编码:

  • 数据库级别
  • 服务器端脚本级别。
  • html页面级别。

每个都应分别检查。

检查HTML级别很简单。只需在浏览器中单击“查看”菜单,然后“编码”并查看标记的那个。如果它是正确的,你就没事了。如果没有 - 发送错误的 HTTP标头,您必须正确

对于服务器端来说,没什么可做的。只是告诉mysql你想要哪种编码。它可以通过两种方式完成:

  • mysql_set_charset() - 首选
  • SET NAMES查询

请注意在mysql中名为utf8的UTF-8编码。

数据库级别似乎是O.K.在你的情况下。

答案 3 :(得分:0)

mysql_query('SET NAMES utf8');在通过Chrome浏览时有效,但不适用于FF或IE

答案 4 :(得分:0)

尝试以下方法可能会解决您的问题:

<?php
$text = "This is the Euro symbol '€'.";

echo 'Original : ', $text, PHP_EOL;
echo 'TRANSLIT : ', iconv("UTF-8", "ISO-8859-1//TRANSLIT", $text), PHP_EOL;
echo 'IGNORE   : ', iconv("UTF-8", "ISO-8859-1//IGNORE", $text), PHP_EOL;
echo 'Plain    : ', iconv("UTF-8", "ISO-8859-1", $text), PHP_EOL;

?>

http://php.net/manual/en/function.iconv.php