2009-08-13 72 views
2

我已经改写了一个网站,现在它是XHTML有效等,并使用UTF8。一切都很好,但如果数据库中的任何地方都是欧洲字符,它只会显示为问号。€char显示为?在UTF8输出

什么是解决这个问题的正确方法? 由于输出是由Typo3完成的我不能改变很多。

+0

这只会发生在€符号或与其他字符如ω(小欧米茄,utf8:0xCF 0x89)呢? – VolkerK 2009-08-13 09:24:28

回答

5

尝试之前执行这些查询是获取数据的查询:

SET NAMES utf8 
SET CHARACTER SET utf8 
+1

如果您使用php/mysql扩展名(mysql_connect,mysql_query,...)和PHP 5> = 5.2.3,最好使用mysql_set_charset(),否则mysql_real_escape_string()不会“知道”编码的更改。请参阅http://php.net/mysql_set_charset – VolkerK 2009-08-13 09:16:31

4

这可能是由于错误的数据库连接编码

查找SET名的SQL语句

$db_link = mysql_connect($host,$user,$passwd); 
    mysql_query("SET CHARACTER SET 'utf8';", $db_link); 
    mysql_query("SET NAMES 'utf8';", $db_link); 
0

如果你确定你有正确的字符数据(0x20AC),它也可以是客户端的字体-侧。如果您使用的字体不处理该特定字符,则只会看到一些默认问号。

但是,为什么不使用转义码€,它给你:€

干杯,

0

你可以尝试像

$value = iconv('ISO-8859-1', 'UTF-8//TRANSLIT', $value); 

的 “ISO-8859-1” 的一部分可能会因您的MySQL表字符编码而有所不同。

2

不要发出这两个声明!

不要发出

SET NAMES utf8 
SET CHARACTER SET utf8 

了一个又一个。它可能会造成麻烦。在SET NAMES utf8之后,我已经对SET CHARACTER SET utf8有过不好的经验。

我建议只发出SET NAMES ...

MySQL的文档具有解释为什么:http://dev.mysql.com/doc/refman/5.0/en/charset-connection.html

简而言之:SET NAMES ...设置连接的字符集,以相同的客户端ANS导致字符集。而SET CHARACTER NAME...设置不同连接的字符集和整理。

请阅读文档,并决定哪一个更好的情况。或者更好地做一个测试。

2

对于包含€符号的数据库列,您使用什么charset(encoding,collat​​ion,...)?

问题可能是因为在不使用UTF-8字符编码时,€符号是某种难度的野兽,因此存储在此列中的数据不会混淆。问题在于,当使用ISO-8859-15时,€符号被编码为\xA4,而在使用Windows-1252(Windows机器上常见的西欧 - 欧洲字符集)时被编码为\x80。 如果列中的数据编码不正确,MySQL将无法正确将其转码为UTF-8 - 即使您使用SET NAMES utf8