iconv() - 如何检测违规字符?

时间:2017-11-10 11:26:39

标签: php character-encoding iconv

我使用iconv()将CSV数据从 UTF-8 转换为 Windows-1252

$converted = iconv("UTF-8", "Windows-1252", $csvData);

在某些情况下,iconv()安静地失败,返回false

我也尝试使用//TRANSLIT,但`iconv()'也会返回 false

当我将//IGNORE语句添加到目标字符集时,转换成功,但这意味着一个或多个字符丢失。

我可以坚持//IGNORE,但我想找出导致问题的角色。

我该怎么做?

1 个答案:

答案 0 :(得分:1)

使用string作为char数组(请参阅问题注释)是不错的主意,因为php string type

  

在内部,PHP字符串是字节数组。因此,使用数组括号访问或修改字符串不是多字节安全的,只能使用单字节编码的字符串来完成,例如ISO-8859-1。

因此我们可以将mb_substr用于utf-8并使用符号而非字节

error_reporting('E_ALL & !E_NOTICE');
$yourString = "test bad ☺ string";
$convertString = '';
$badChars = [];

if (iconv("UTF-8", "Windows-1252", $yourString) === false) {       
    for($i = 0, $stringLength = mb_strlen($yourString); $i < $stringLength; $i++) {
        $char = mb_substr($yourString, $i, 1);
        $convertChar = iconv("UTF-8", "Windows-1252", $char);

        if ($convertChar === false) {
            $badChars[$i] = $char;
        } else {
            $convertString .= $convertChar;
        }   
    }
} else {
    $convertString = iconv("UTF-8", "Windows-1252", $yourString);
}

var_dump($badChars, $convertString);

结果array(1) { [9]=> string(3) "☺" } string(16) "test bad string"

P.S。下次我将用代码给出更详细的答案。我的错误