[英]Can't reproduce “iconv(): Detected an illegal character in input string”, but I keep getting on server
对于用户代理和图像 EXIF 数据,我的系统尝试使用iconv()
转换任何 UTF-8 字符。
但是,有时我会收到以下错误:
PHP 警告 [8]:iconv():在输入字符串中检测到非法字符
对于这样的例子:
iconv('UTF-8', 'ASCII//TRANSLIT', 'Mozilla/5.0 (iPhone; CPU OS 10_15_5 (Ergänzendes Update) like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.1.1 Mobile/14E304 Safari/605.1.15');
iconv('UTF-8', 'ASCII//TRANSLIT', 'Ïðîãðàììà öèôðîâîé îáðàáîòêè èçîáðàæåíèé êîìïàíèè ACD Systems');
结果变成一个空字符串。
但是,当我复制上述内容并手动运行(在同一台服务器上)时,它可以工作......我没有收到任何错误,并且字符被转换为“?”。
多年来,我一直在尝试许多不同的事情,例如不同的编码,使用“IGNORE”而不是“TRANSLIT”,使用mb_convert_encoding
等等......
但是,如果我无法捕获导致问题的真正输入,并且我不知道我能做些什么来“修复”这个问题,那么调试/修复这个真的很难。
我能做什么,以便为iconv()
提供任何输入,任何非 ASCII 字符都将被转换为问号,而不会失败?
非法 UTF 字符很容易通过错误产生。 一个例子:
$currencies='€$';
$str = "äöü|".substr($currencies,1,1)."|def";
$ascii = iconv('UTF-8', 'ASCII//TRANSLIT', $str);
//ascii = false + Notice: iconv(): Detected an illegal character in input string
UTF-8 很清楚必须使用 mb_substr(),而不是 substr()。
使用 iconv,可以将 IGNORE 添加到 TRANSLIT 以忽略非法字符。
$ascii = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $str);
//$ascii: string(11) ""a"o"u||def"
在字符串中找到这样的非法字符并不容易。 通常的调试输出会伪造这些字符或忽略它们。 对于这些问题,我使用了这个特殊的 class ,它还可以重现地显示带有非法 UTF-8 的字符串。
debug::writeUni($str);
//Output:\u{e4}\u{f6}\u{fc}|\x82|def
这个 output 可以通过复制和粘贴来接管。
$str2 = "\u{e4}\u{f6}\u{fc}|\x82|def";
var_dump($str === $str2); //bool(true)
早上好,我的问题仍然存在,因为有些字符无法被 iconv 识别。 我尝试了来自不同组的几个代码选项,但实际工作如下:
//Nota: Conversor de caracteres para UTF8
public function ConvertToUTF8($text)
{
$encoding = mb_detect_encoding($text.'x', mb_detect_order(), false);
if($encoding == "UTF-8")
{
//Converte letra a letra
$i = 0;
$conv = '';
do
{
$letra = substr($text,$i,1);
$conv .= iconv(mb_detect_encoding($letra, mb_detect_order(), true), "UTF-8//IGNORE", $letra);
$i ++;
} while ($i < strlen($text) );
$text = $conv;
}
else if ($encoding == 'ISO-8859-1')
{
$text = mb_convert_encoding($text, 'ISO-8859-1', 'UTF-8');
}
else if ($encoding == 'ASCII')
{
$text = mb_convert_encoding($text, "UTF-8");
}
$out = iconv(mb_detect_encoding($text.'x', mb_detect_order(), false), "UTF-8//TRANSLIT//IGNORE", $text);
return $out;
}//Fim Módulo
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.