Как заменить коды UTF-8 в строке PHP реальными символами?

Я выполняю команду оболочки openssl из PHP и получаю следующую строку в качестве сегмента выходной строки: 'Divisi\xC3\xB3n TeleComunicaciones'. Насколько я понимаю, испанские символы заменены их буквальными кодами UTF-8. Мне нужно заменить коды их эквивалентами испанских символов. Результирующая строка должна выглядеть следующим образом: «División TeleComunicaciones»?

Я пробовал много функций преобразования строк PHP, но ни одна из них не удалась. Я тоже заметил одну вещь. Когда я определяю переменную как

$var = "Divisi\xC3\xB3n TeleComunicaciones" правильно воспроизводится ('División TeleComunicaciones')

Но если я беру значение из вывода команды оболочки openssl, оно всегда печатается как 'Divisi\xC3\xB3n TeleComunicaciones'.

Кто-нибудь может посоветовать, есть ли в PHP какие-либо встроенные средства для этой цели?


person Igor Somov    schedule 05.03.2015    source источник
comment
Хорошо, сэр, позвольте спросить, видели ли вы это?   -  person Naruto    schedule 05.03.2015
comment
Я обновил определение вопроса. Это мой 1-й вопрос здесь. Пожалуйста, будьте терпимы и помогите мне привести его в соответствие с практиками stackoverflow. у меня мало опыта в этом   -  person Igor Somov    schedule 05.03.2015
comment
К сожалению, openssl req -in csr.txt -noout -subject -utf8 возвращает тот же результат с кодами eascape   -  person Igor Somov    schedule 06.03.2015


Ответы (1)


Поскольку это строка с экранированием одного байта, вы можете преобразовать их с помощью регулярного выражения:

echo preg_replace("#(\\\x[0-9A-F]{2})#e", "chr(hexdec('\\1'))", $var);
person Naruto    schedule 06.03.2015
comment
Большое спасибо, это работает для этого случая и большинства других, включая даже китайский иероглиф! Но не работает для кириллической строки: \x04\x12\x04›\x047\x04=\x045\x04A\x045\x04=\x04A\x04:. Это должно быть Вознесенск, но я получаю: ›7=5A5=A:. Вы хоть представляете, почему кириллица здесь исключение? - person Igor Somov; 06.03.2015
comment
Не могли бы вы сказать мне, что такое кодировка из выходных данных? - person Naruto; 06.03.2015
comment
На самом деле значение хранится в поле файла CSR, который я декодирую с помощью openssl. Когда я загружаю тот же файл в онлайн-декодер comodo, он правильно распознает значение Вознесенск в этом поле, но openssl выводит мне \x04\x12\x04›\x047\x04=\x045\x04A\x045\x04=\x04A\x04:. - person Igor Somov; 06.03.2015