utf8_decode仅返回编码字符串的一部分

时间:2010-11-25 14:25:24

标签: php encoding utf-8

我在utf-8中有一个文本,我想使用utf8_decode()来解码它 但是当我这样做时,我丢失了部分文本,utf8_decode()对字符串进行解码,直到找到字符–为止 有什么想法解决这个问题吗?

5 个答案:

答案 0 :(得分:2)

也许iconv可以帮到你

答案 1 :(得分:2)

†= E2 80 = 1110 0010 1000 0000

如果这确实是你的UTF-8文本中的内容,那么它可能不是UTF-8。它需要跟随另一个八位字节开始10才有效。

这是因为从1110开始的八位字节引入了一个三个八位位组序列,后面的八位字节从10开始,总共提供16个字节的“有效负载”以提供Unicode代码点。

编辑:您提供了下一个字符为0x93 = 1001 0011,这将是有效的。 UTF-8序列0xE28093 = 0010 00 0000 01 0011 = 0x2013,这是EN DASH。所以,它看起来似乎是合理的UTF-8!

答案 2 :(得分:1)

也许–不在ISO-8859-1中? utf8_decode只吃掉ISO-8859-1中也存在的utf8字符。

答案 3 :(得分:1)

你可能想要类似的东西:

$string = iconv("UTF-8", "ISO-8859-1//TRANSLIT", $string);

您可以在the documentation中详细了解iconv。根据您的使用情况,IGNORE可能比TRANSLIT更有用。

答案 4 :(得分:1)

您确定EdoDodo's code无效吗?

尝试强制浏览器将输出处理为iso-8859-1。要做到这一点,你需要一个带有字符串的utf8编码文件(你需要这个,因为文本编辑器可能使用不可见的UTF-8 BOM,并且浏览器可能会针对定义的ISO-8859-2切换到UTF-8 ),另一个用ansi编码的php代码(我使用Notepad++只是为了确保编码是正确的 - 它检测文件的编码并显示在右下角,你可以转换编码之间也是如此。

所以用utf-8编码创建一个名为 utf8.txt 的文件,其中只包含字符串:

–

使用以下内容创建ANSI编码的 index.php 文件:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
<head> 
 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> 
</head> 

<body>

<?php
$str = file_get_contents('utf8.txt');

echo "iconv(//IGNORE//TRANSLIT): " . iconv("UTF-8", "ISO-8859-1//IGNORE//TRANSLIT", $str) . "<br>\n";

对于网页,我强烈建议您始终使用UTF-8编码,即使它是英文的。