我使用iconv()
将CSV数据从 UTF-8 转换为 Windows-1252 。
$converted = iconv("UTF-8", "Windows-1252", $csvData);
在某些情况下,iconv()
安静地失败,返回false
。
我也尝试使用//TRANSLIT
,但`iconv()'也会返回 false 。
当我将//IGNORE
语句添加到目标字符集时,转换成功,但这意味着一个或多个字符丢失。
我可以坚持//IGNORE
,但我想找出导致问题的角色。
我该怎么做?
答案 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。下次我将用代码给出更详细的答案。我的错误