使用动态变量时 iconv 不工作

iconv not working when dynamic variable is used

我正在使用以下代码将西班牙语字符转换为普通英语字符:

function test_enc($text)
{
    setlocale(LC_ALL, 'en_US.utf8');
    return iconv('utf8', 'ascii//TRANSLIT', $text);
}
echo test_enc('TéstFirst'); returns TestFirst

它工作正常,但是当我从其他具有相同值的数组动态传递这个参数时,它没有返回任何类似的东西:

echo test_enc($data['firstname']);

我已经使用 var_dump 来查看不同之处,结果返回如下:

var_dump('TéstFirst');//returned string(10) "TéstFirst"
var_dump($data['travelername']);// returned string(9) "TéstFirst"

请让我知道我做错了什么。

根据您从 var_dump(bin2hex($data['firstname'])) 提供的输出 string(18) "54e973744669727374",该字符串不是有效的 UTF-8。因此,如果您尝试将它 utf8 转换为 iconv 中的任何其他内容,它将给您一个错误,告诉您它不是有效的 utf8 和 return false.

var_dump(iconv('utf8', 'ascii//TRANSLIT', hex2bin("54e973744669727374")));

这给你

PHP Notice:  iconv(): Detected an illegal character in input string in ... on line ...
bool(false)

我们可以尝试做的是首先尝试将此字符串转换为有效的 UTF-8,然后使用 iconv TRANSLIT。现在我们只是告诉 iconv 它已经是有效的 utf8,但显然不是。

var_dump(utf8_encode(hex2bin("54e973744669727374"))); //string(10) "TéstFirst"

//string(9) "TestFirst"
var_dump(iconv('utf8', 'ascii//TRANSLIT', utf8_encode(hex2bin("54e973744669727374"))));

最好查阅您正在使用的 API 的文档,并找出他们发送数据的字符编码,以便安全地将其转换为 utf8。