无法重现“iconv():在输入字符串中检测到非法字符”,但我一直在服务器上

问题描述

对于用户代理和图像 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','Ïðîãðàììà öèôðîâîé îáðàáîòêè èçîáðàæåíèé êîìïàíèè 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"

在字符串中找到这样的非法字符并不容易。通常的调试输出会伪造这些字符或忽略它们。 对于此类问题,我使用此 special class 也可以重复显示非法 UTF-8 的字符串。

debug::writeUni($str);
//Output:\u{e4}\u{f6}\u{fc}|\x82|def

可以通过复制和粘贴来接管此输出。

$str2 = "\u{e4}\u{f6}\u{fc}|\x82|def";
var_dump($str === $str2); //bool(true)
,

早上好, 我的问题仍然存在,因为有些字符无法被 iconv 识别。我尝试了来自不同组的几个代码选项,但实际有效的是以下内容:

//注意: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,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',false),"UTF-8//TRANSLIT//IGNORE",$text);

    return $out;
}//Fim Módulo

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...