使用动态变量时iconv无法正常工作

时间:2016-08-31 10:43:33

标签: php iconv

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

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"

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

1 个答案:

答案 0 :(得分:1)

根据var_dump(bin2hex($data['firstname']))提供的string(18) "54e973744669727374"输出,此字符串无效UTF-8。因此,如果您尝试将 utf8转换为iconv中的任何其他内容,则会向您显示错误,告诉您它无效utf8并返回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。