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

时间:2011-12-16 16:37:31

标签: php utf-8 iconv

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

字符如:

アイヌの工芸 : ペンシルバニア大学考古学人類学博物館ヒラーコレクション

但是当我把它们从这个专有数据库中拿出来时,它就像垃圾一样:

ã¢ã¤ãã®å·¥è¸ : ãã³ã·ã«ããã¢å¤§å­¦èå¤å­¦äººé¡å­¦åç©é¤¨ãã©ã¼ã³ã¬ã¯ã·ã§ã³

现在我有用utf-8编码的html文档

<meta http-equiv="content-type" content="text/html; charset=utf-8"/>

实际的html文件本身保存为“Encoded in utf-8”而不是ISO-8859-1或Western Latin等。

所以奇怪的是,当我使用iconv获取垃圾字符串并将其从utf-8转换为ISO-8859-1时,它会正确显示。

iconv("UTF-8", "ISO-8859-1//TRANSLIT", $junk_string)

似乎垃圾字符串是UTF-8,当我将字符串转换为ISO-8859-1时,它会正确显示字符。这对我来说根本没有意义。

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

这里有人有任何见解吗?而不是对从数据库中获取的每一条数据执行此操作,我是否可以在单个页面级别更改此操作?我还尝试将编码更改为

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

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

3 个答案:

答案 0 :(得分:3)

只是一个猜测,但是当数据库是utf8且html文档是utf8时,问题很可能是数据库连接,至少根据我的MySQL经验。

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

mysql_set_charset('utf8');

对于PDO / MySQL,它将类似于:

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

答案 1 :(得分:2)

答案是你在数据库中有错误的数据。可能发生的是你做了转换ISO-8859-1 - &gt;对于已经采用UTF-8的数据的UTF-8。因此,做转换UTF-8 - > ISO-8859-1为您提供原始的UTF-8数据。

确保您没有在UTF-8数据上调用utf8_encode(进行ISO-8859-1 - &gt; UTF-8转换)!

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

答案 2 :(得分:0)

这可能是因为PHP本身不处理UTF-8:

  

字符串是一系列字符,其中一个字符与a相同   字节。这意味着PHP仅支持256个字符集,因此   不提供原生Unicode支持

来源:http://php.net/manual/en/language.types.string.php

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

  • 将数据转码为单字节编码字符串,用于本机支持(utf8_decodeiconv),但是你可能会丢失字符(在你的情况下很多......)

  • 或者使用PHP提供的一系列功能处理您的数据以处理Multibyte string