encoding — декодирует строку в символы кириллицы в переполнении стека

У меня есть строка, как это:

Титаник!

И хочу расшифровать его в кириллицу. Я уже пытаюсь расшифровать mb_convert_encoding, но не получить правильный результат.

$string = 'Óâàæàåìûé êëèåíò!';
$stringEncode = mb_detect_encoding($string);

$result = mb_convert_encoding($string, "CP1251", $stringEncode);

echo $result //????????? ??????!

//Case with auto detect encoding return the same result
$result = mb_convert_encoding($string, "CP1251");

echo $result //????????? ??????!

Я пытаюсь использовать разные кодировки символов, но всегда получаю неправильный результат.

Правильный результат должен быть:

Уважаемый клиент!

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

Спасибо за любую помощь!

UPD:

выход bin2hex:
c393c3a2c3a0c3a6c3a0c3a5c3acc3bbc3a920c3aac3abc3a8c3a5c3adc3b22120c387c3a0c3a2c3b2c3b0c3a020c3adc3a5c3aec3a1c3b5c3aec3a4c3a8c3acc3ae20c3a2c3adc3a5c3b1c3b2c3a820c3acc3a8c3adc3a8c3acc3a0c3abc3bcc3adc3bbc3a920c3afc3abc3a0c3b2c3a5c3a620c3afc3ae20c3a7c3a0c3a9c3acc3b320c3a220c3b0c3a0c3a7c3acc3a5c3b0c3a52036343120c3b0c3b3c3a1c3abc3a5c3a92e20c384c3abc3bf20c3aec3afc3abc3a0c3b2c3bb20c3a2c3aec3b1c3afc3aec3abc3bcc3a7c3b3c3a9c3b2c3a5c3b1c3bc20c3abc3a8c3b7c3adc3bbc3ac20c3aac3a0c3a1c3a8c3adc3a5c3b2c3aec3ac20707572652e636f6d2e7275

«Откуда эта строка взялась изначально?» — изначально я получаю ответ от Api в формате json, затем я использую utf8_encode (если я не использую эту функцию, json_decode возвращает null) и, наконец, json_decode возвращает мне массив данных:

[
'status'         => '1',
'last_date'      => '15.05.2018 10:00:17',
'last_timestamp' => '1526353217',
'send_date'      => '15.05.2018 10:00:05',
'send_timestamp' => '1526353205',
'phone'          => '79270212817',
'cost'           => '6.24',
'sender_id'      => 'PURE',
'status_name'    => 'Äîñòàâëåíî',
'message'        => 'Óâàæàåìûé êëèåíò!'

];

-1

Решение

В соответствии с deceze совет, я получаю кодировку для моего исходного ответа Api (windows-1251). Чем я переписываю свой код ‘prepare to json_decode’ и получаю правильный результат.

//Replace this:
$contents = utf8_encode($response);
//To this:
$contents = mb_convert_encoding($response, 'utf-8', 'windows-1251');

$result   = json_decode($contents);

Обратите внимание! Тот utf8_encode перерабатывать ISO-8859-1 в UTF-8, и если мы передаем данные с другой кодировкой (в моем случае это окна-1251) в эту функцию мы получим неожиданный результат. Большое спасибо @mulquin и @deceze, чтобы помочь мне разобраться в этой проблеме.

PS: всегда проверяйте кодировку исходных данных, не повторяйте моих ошибок 🙂

1

Другие решения

Я думаю, вы можете быть правы в своем предположении, что PHP не может обрабатывать некоторые символы в этой строке. Я сделал следующее устранение неполадок и не смог найти проблему. Похоже на то mb_check_encoding возвращает, что преобразование должен возможно, но по какой-то причине это не работает …

Вам может потребоваться выполнить ручное преобразование: PHP конвертировать Windows-1251 в UTF 8

<?php

$utf8_string = 'Óâàæàåìûé êëèåíò!';
$cp1251_string = 'Уважаемый клиент!';

$utf8_detect = mb_detect_encoding($utf8_string, 'UTF-8');
$cp1251_detect = mb_detect_encoding($cp1251_string, 'CP1251');

$utf8_to_cp1251_check = mb_check_encoding($utf8_string, $cp1251_detect);
$cp1251_to_utf8_check = mb_check_encoding($cp1251_string, $utf8_detect);

$utf8_to_cp1251 = mb_convert_encoding($utf8_string, $cp1251_detect);
$cp1251_to_utf8 = mb_convert_encoding($cp1251_string, $utf8_detect);

$utf8_to_cp1251_icon = iconv( "UTF-8","CP1251//TRANSLIT", $utf8_string);

var_dump($utf8_string);
var_dump($cp1251_string);

echo PHP_EOL;

var_dump($utf8_detect);
var_dump($cp1251_detect);

echo PHP_EOL;

var_dump($utf8_to_cp1251_check);
var_dump($cp1251_to_utf8_check);

echo PHP_EOL;

var_dump($utf8_to_cp1251);
var_dump($cp1251_to_utf8);

echo PHP_EOL;

var_dump($utf8_to_cp1251_icon);

Выход

string(32) "Óâàæàåìûé êëèåíò!"string(32) "Уважаемый клиент!"
string(5) "UTF-8"string(12) "Windows-1251"
bool(true)
bool(true)

string(17) "????????? ??????!"string(32) "Уважаемый клиент!"
string(18) "???ae????? ??????!"
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector