Php 使用动态变量时iconv不工作

Php 使用动态变量时iconv不工作,php,iconv,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($d

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

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\u 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)
最好是查阅您正在使用的API的文档,找出他们发送数据的字符编码,以安全地将其转换为utf8。

在您的工具中,PHP脚本文件是否也设置为
utf8
(如Netbeans、PHPStorm)?不,我的文件中没有设置类似的字符编码。您使用什么?PHPStorm?而不是我的文件中的
这是一个如何处理php脚本的常规设置(请记住,在结束标记后,您也可以将HTML纯文本粘贴到phpscript中?>)不,我正在使用geany。我添加了标题('Content-type:text/plain;charset=utf-8');在使用标题(“Content-type:text/html;charset=utf-8”)之后,我以数组形式从API获取数据,而不是从db获取数据;响应是:字符串(10)“TéstFirst”表示var_dump('TéstFirst');和字符串(9)“T�用于var_dump的stFirst($data['firstname']);在test_enc($data['firstname'])中仍然没有结果<代码>“T�stFirst“显然是无效的UTF-8。您的数据很可能在PHP和浏览器之间的某个地方被破坏。最好的方法是使用
var_dump(bin2hex($data['firstname'))
并共享它,因为它将序列化字符串,以便通过HTTP.response安全地传输var_dump(bin2hex($data['firstname'));是字符串(18)“54e973744669727374”哦,那不是UTF-8。无论API向您发送什么数据,都不会向您发送有效的UTF-8。请注意,
iconv
当您以UTF-8的形式运行该字符串时,会给您一个错误:
iconv():在输入字符串中检测到非法字符
是否有办法将数据转换为有效的UTF-8,因为我们无法在API中更改数据格式?
var_dump(utf8_encode(hex2bin("54e973744669727374"))); //string(10) "TéstFirst"

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