2012-07-31 56 views
0

问题:A○字符编码,在PHP,Zend公司MySQL-应用

当我检索MySQL表值到我的PHP Zend框架的应用程序,人物A型和O是从数据库到我的浏览器一样返回这个 。

任何想法可能出现问题?我曾尝试设置一些属性为UTF-8,但仍然发生这种情况......我想我仍然错过了一些东西。

你可以给我一些解决方案,我可以摆脱这一点肯定吗?我需要设置等方面有哪些CONFIGS

谢谢:)

+0

你可以发布你的'Zend_DB'工厂代码吗?你确定这不是逃避问题吗?您是否设置了Chareset HTTP标头? – 2012-07-31 14:57:01

+0

该数据被从哪个表中整理出来?确保您查看表而不是数据库,因为表可以轻松地使用与数据库不同的排序规则。 – 2012-07-31 14:58:04

+0

我的应用程序目前刚刚开始,我的数据库代码非常小,只处理连接的设置,但我会发布我使用的代码(PS我是一个初学者,所以对我很感兴趣; D ) – jjepsuomi 2012-07-31 15:02:44

回答

1

当错误编码的字符被读取到浏览器中,他们拿出的还是?有一个编码不一致的地方:

  • 在浏览器
  • 在数据库表中的排序规则
  • 在HTML字符集

这些字符会以Unicode工作UTF-8,所以你应该请验证您的数据库表归类为utf8_bin或类似,因为如果要以UTF-8瑞典语存储所有内容,可以使用utf8_swedish_ci

在您的浏览器中,确保您的内容编码设置为自动检测。

要创建MySQL中的UTF-8/utf8_bin表,这里是一个例子:

CREATE TABLE `sample` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; 

变更现有的表来使用UTF-8,使用下面的命令:

ALTER TABLE table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin; 

This post有否一个很好的解释使用CONVERT TO CHRACTER SET utf8

CHARSETCOLLATE必须同时进行设置,否则,你会自动获得COLLATE=utf8_general_ci

对于HTML,字符集可以使用设置:

<meta charset="UTF-8"> 
+0

谢谢大家的答案,我会看看哪一个帮助并发布结果;) – jjepsuomi 2012-07-31 15:06:11

+0

一个常见的问题是表字符集和排序规则在cp1252(latin1)和latin1_general_ci – Brendan 2012-07-31 15:09:40

1

我woudl建议你看看到您的“网站编码”在浏览器中设置。

如果网站不提供编码和你的MySQL/PHP是处理它“正确”这可能发生(例如它设置为“西方1252”,但需要UTF8/Unicode)的

在Firefox中,你可以看到编码通过查看 - >编码(或类似)

1

你只需要正确设置你的编码为UTF-8。下面是一个最小的有效的解决方案的基本步骤:

  1. 确保您DB connection uses UTF-8
  2. 确保您的HTTP内容类型设置为UTF-8(例如:header('Content-type: text/html; charset=utf-8');(也可以指定编码for your document
  3. 将您的文件保存为UTF-8在Windows中,文件保存为CP-1251,这意味着特殊的重音字符不会被视为UTF-8编码的字节(从而抛弃正在输出到浏览器的内容。你必须在保存你的文件时明确地设置你的编码。在Linux/Mac中,这不是一个问题,因为默认情况下使用UTF-8。
  4. 确保您的php.ini不会覆盖编码。如果你有外国的.htaccess文件,请检查他们是否也是如此。

如果你正确地处理UTF-8,你将不需要0​​/utf8_decodehtmlentities等,并能够正确地输出重音字符未经特殊treatement。

注意:某些地区不被UTF-8来处理,特别是Thaï

1

关于Zend_Db_Adapter_Pdo_Mysql确保你的构造使用UTF-8,像这样:

$your_pdo = Zend_Db::factory('Pdo_Mysql', array(
       'host'  => DATABASE_HOST, 
       'username' => DATABASE_USERNAME, 
       'password' => DATABASE_PASSWORD, 
       'dbname' => DATABASE_DBNAME, 
       'options' => array('charset' => 'utf8') 
     ));  

而且在HTML使用数据之前逃避它:

return htmlspecialchars($string, ENT_QUOTES, 'UTF-8'); 

检查为Content-Type,文件编码等提供所有其他答案。