Php 字符编码问题UTF-8和ISO-8859-1

Php 字符编码问题UTF-8和ISO-8859-1,php,utf-8,iconv,Php,Utf 8,Iconv,我有一个web应用程序,在正确显示日文/中文字符时遇到问题。当我将这些字符硬编码到HTML文档中时,我可以正确地显示它们 字符,例如: アイヌの工芸 : ペンシルバニア大学考古学人類学博物館ヒラーコレクション 但当我从这个专有数据库中取出它们时,它就变成了垃圾: ã¢ã¤ãã®å·¥è¸ : ãã³ã·ã«ããã¢å¤§å­¦èå¤å­¦äººé¡å­¦åç©é¤¨ãã©ã¼ã³ã¬ã¯ã·ã§ã³ 现在我有了用utf-8编码的html文档 <meta http-equiv="cont

我有一个web应用程序,在正确显示日文/中文字符时遇到问题。当我将这些字符硬编码到HTML文档中时,我可以正确地显示它们

字符,例如:

アイヌの工芸 : ペンシルバニア大学考古学人類学博物館ヒラーコレクション
但当我从这个专有数据库中取出它们时,它就变成了垃圾:

ã¢ã¤ãã®å·¥è¸ : ãã³ã·ã«ããã¢å¤§å­¦èå¤å­¦äººé¡å­¦åç©é¤¨ãã©ã¼ã³ã¬ã¯ã·ã§ã³
现在我有了用utf-8编码的html文档

<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
看起来垃圾字符串是UTF-8,当我将字符串转换为ISO-8859-1时,它会正确显示字符。这对我来说毫无意义

所以我对我的问题有一个答案,但我不知道为什么它会起作用。我认为用UTF-8编码应该可以解决这种问题。我正在使用Verdana,但尝试了几种其他字体,但没有成功。奇怪的是,我可以毫无问题地将字符硬编码到html页面中,它们显示得很好。但是,当从数据库中获取相同的数据时,它会显示为垃圾邮件,而无需将编码更改为ISO-8859-1

有人有什么见解吗?除了对从数据库中获取的每一条数据都这样做之外,还有没有一种方法可以在单独的页面级别上进行更改?我还尝试将编码更改为

<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"/>


而且数据库中的字符仍然无法正确显示。

答案是数据库中的数据错误。可能发生的情况是,您对已经在UTF-8中的数据进行了ISO-8859-1->UTF-8转换。因此,进行UTF-8->ISO-8859-1转换将返回原始UTF-8数据

确保您没有对UTF-8数据调用
utf8\u encode
(它执行ISO-8859-1->UTF-8转换)


由于每个UTF-8字符串也是一个有效的ISO-8859-1字符串(不完全是,但它通常是扩展的,所以情况就是这样),所以在UTF-8数据上进行ISO-8859-1->UTF-8转换时没有错误。

只是猜测,但当数据库是utf8,html文档是utf8时,最有可能的问题是数据库连接,至少在我使用MySQL的经验中是这样

例如对于MySQL(旧/常规版本),打开数据库后需要设置字符集:

mysql_set_charset('utf8');
对于PDO/MySQL,它将类似于:

$db->exec('SET CHARACTER SET utf8');

这可能是因为PHP不以本机方式处理UTF-8:

字符串是一系列字符,其中一个字符与另一个字符相同 字节。这意味着PHP只支持256个字符集,因此 不提供本机Unicode支持

资料来源:

因此,当从数据库接收UTF-8编码数据时,您需要:

  • 将数据转换为单字节编码字符串以获得本机支持(使用或),但您可能会丢失字符(在您的情况下会丢失很多…)

  • 或者使用PHP提供的一系列函数来处理数据


我希望它是MySQL,因为我已经看到了这个解决方案。但愿它对我有用。谢谢你的回复+1@mmundiff太糟糕了。。。不管怎样,最好提及您使用的是哪种类型的数据库,或者它完全是家庭编写的?
$db->exec('SET CHARACTER SET utf8');