我有一个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"/>
数据库中的字符仍然无法正确显示。
答案 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_decode或iconv),但是你可能会丢失字符(在你的情况下很多......)
或者使用PHP提供的一系列功能处理您的数据以处理Multibyte string