Преобразование UTF-8 в ASCII

Когда я преобразую образец строки, как это:

$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 (): обнаружен недопустимый символ во входной строке

0

Решение

% D8 не является кодировкой ascii. Ascii имеет 127 (или 255, если вы используете расширенный) символов (см. http://www.asciitable.com/)

Таким образом, специальные символы, такие как Ø, не имеют эквивалента. mb_convert_encoding обрабатывает это, заменяя их на?, тогда как iconv выдает ошибку.

Вывод, который вы ищете, больше похож на кодировку URL.
Попробуй это:

echo urlencode("اوقات-شرعی-جمعه-8-مرداد-ماه-به-اÙÙ‚-اردبیل");

3

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

На мой взгляд, проблема в этом случае состоит в том, что входная строка неверна, и преобразование между 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 к чему-то, что я не могу распознать).

0

По вопросам рекламы [email protected]