Когда я преобразую образец строки, как это:
$str = "اوقات-شرعی-جمعه-8-مرداد-ماه-به-اÙÙ‚-اردبیل"echo mb_convert_encoding($str, "ASCII");
от UTF-8 до ASCII результат должен быть таким:
% D8% A8% D8% B2% D8% B1% Д.А.% D8% AF-% АА% D8% B1% DB% 8C% D9% 86-% D9% 88% D8% B1% D8% B2% D8% B4 % DA% A9% D8% A7% D8% B1% D8% A7% D9% 86-% D8% АА% D8% А7% D8% B1% DB% 8C% D8% AE-% D8% A7% D9% 84 % D9% 85% D9% BE% DB% 8C% DA% A9% D8% АА% D8% B5% D8% A7% D9% 88% DB% 8C% D8% В1
Но это так:
?????????????????????-????????????????-??????????????????-8 — ????????????????????? — ?????????????? — ????????? -? ???????????? — ?????????????????????????
Я действительно запутался Кто-нибудь знает проблему?
ОБНОВЛЕНИЕ: Я также попробовал iconv:
echo iconv("UTF-8", "ASCII", $str), PHP_EOL;
Но это говорит:
Примечание: iconv (): обнаружен недопустимый символ во входной строке
% D8 не является кодировкой ascii. Ascii имеет 127 (или 255, если вы используете расширенный) символов (см. http://www.asciitable.com/)
Таким образом, специальные символы, такие как Ø, не имеют эквивалента. mb_convert_encoding
обрабатывает это, заменяя их на?, тогда как iconv
выдает ошибку.
Вывод, который вы ищете, больше похож на кодировку URL.
Попробуй это:
echo urlencode("اوقات-شرعی-جمعه-8-مرداد-ماه-به-اÙÙ‚-اردبیل");
На мой взгляд, проблема в этом случае состоит в том, что входная строка неверна, и преобразование между ASCII и UTF-8 не требуется.
Начнем с этого
$out = '%D8%A8%D8%B2%D8%B1%DA%AF-%D8%AA%D8%B1%DB%8C%D9%86-%D9%88%D8%B1%D8%B2%D8%B4%DA%A9%D8%A7%D8%B1%D8%A7%D9%86-%D8%AA%D8%A7%D8%B1%DB%8C%D8%AE-%D8%A7%D9%84%D9%85%D9%BE%DB%8C%DA%A9%D8%AA%D8%B5%D8%A7%D9%88%DB%8C%D8%B1';
Когда мы пытаемся получить кодирование этой строки с
echo mb_detect_encoding($out);
тогда мы можем видеть, что это ASCII конечно. Но, как мы видим, эта строка, очевидно, выглядит как результат urlencode
функция. Давайте попробуем использовать urldecode
функция, чтобы проверить, какова кодировка этого значения
$decoded = urldecode($out);
echo mb_detect_encoding($decoded);
На выходе мы видим, что $decoded
это UTF-8, поэтому пытается запустить этот код из вопроса
$str = "اوقات-شرعی-جمعه-8-مرداد-ماه-به-اÙÙ‚-اردبیل"echo mb_convert_encoding($str, "ASCII");
не имеет смысла, потому что не может быть кодировки ASCII.
Мне также было бы любопытно, что такое кодировка $str
от вопроса, поэтому я подготовил что-то вроде этого, чтобы найти, могу ли я получить $str
значение от $decoded
значение
foreach (mb_list_encodings() as $chr) {
$test = mb_convert_encoding($decoded, $chr, 'UTF-8');
}
Я был удивлен, что я не нашел никакой кодировки, которая может дать мне что-то похожее на $str
значение. Я пытаюсь сделать больше и проверить преобразование, как в этом коде
foreach (mb_list_encodings() as $chr) {
foreach (mb_list_encodings() as $chr2) {
$test = mb_convert_encoding($decoded, $chr, $chr2);
}
}
и я наконец нашел, что некоторые значения похожи, но не равны. Я сделал то же самое с оригинальным $str
но также безуспешно (я не получил вывод запроса из вопроса).
foreach (mb_list_encodings() as $chr) {
foreach (mb_list_encodings() as $chr2) {
//try with and without urlencode
$test = urlencode(mb_convert_encoding($str, $chr, $chr2));
}
}
Конечно, когда мы делаем это
$newOutput = urlencode($decoded);
тогда мы получаем $out
значение.
Вывод заключается в том, что преобразование между ASCII и UTF-8, очевидно, в этом случае не является необходимым, и входная строка может быть неправильной (возможно, из-за некоторого ненужного обращения из UTF-8 к чему-то, что я не могу распознать).