2017-06-30 17:49:00

Декодируем \x## последовательности в строке

Про работу PHP Linux

Получая данные из unix консоли, в результате exec() и других вызовов, не латинские символы обычно экранируются с помощью \x##, где ## - это шестнадцатеричный код символа, но совсем не UTF8.

Например при получении текста сертификата средствами OpenSSL вместо русских будет что-то вроде этого:

C=RU, L=\xD0\x9C\xD0\xBE\xD1\x81\xD0\xBA\xD0\xB2\xD0\xB0,

Для того чтоб перевести это к читаемому виду в в консоли надо сделать:

<ваша команда> | sed 's@+@ @g;s@%@\\x@g' | xargs -0 printf '%b'

А для PHP вот такой код (на всякий случай, перед x стоит 4 обратных слеша):

preg_replace_callback('/\\\\x([0-9A-F]{2})/', function($a){ return pack('H*', $a[1]); }, $your_string);

В результате получаем русский текст:

C=RU, L=Москва,