2016-08-31 4 views
2

Я использую следующий код для преобразования испанских символов в обычные английских символы: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" 

Пожалуйста, дайте мне знать, что я делаю неправильно.

+0

Файл PHP Script также установлен в 'utf8' в вашем Инструменте (например, Netbeans, PHPStorm)? – JustOnUnderMillions

+0

no Я не задал ничего подобного в своем файле. – user1578460

+0

Что вы используете? PhpStorm? И не 'в моем файле' его общий параметр как pasre php-script (помните, что вы также можете вставлять HTML-текст в phpscript после закрытия тега?) – JustOnUnderMillions

ответ

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, а затем использовать iconvTRANSLIT. Прямо сейчас мы просто говорим 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.

+0

Я получаю данные от API в форме массива не из db, после использования заголовка («Content-type: text/html; charset = utf-8»); Ответ: string (10) «TéstFirst» для var_dump ('TéstFirst'); и строка (9) «T stFirst» для var_dump ($ data ['firstname']); и все еще нет результата в test_enc ($ data ['firstname']); – user1578460

+0

'' T stFirst "' is __clearly__ недействителен UTF-8. Вероятно, ваши данные повреждаются где-то между вашим PHP и вашим браузером. Лучше всего использовать var_dump (bin2hex ($ data ['firstname'])) 'и делиться этим, поскольку он будет сериализовать строку для безопасной передачи по HTTP. – Sherif

+0

ответ var_dump (bin2hex ($ data ['firstname'])); строка (18) «54e973744669727374» – user1578460