Строка php urlencod utf-8 превращает ascii в mb_detect_encoding

Во время работы над обновлением некоторых старых проектов я работал с некоторыми старыми файлами и кодировками ANSI / ASCII. Я хочу, чтобы все работало под управлением utf-8, чтобы я мог поддерживать все типы языков.

У меня есть сервис, где я отправляю смс с помощью микросервиса. У меня есть конечная точка: /sms.php, где я принимаю некоторые параметры из _GET, и они затем используются в приложении. У меня есть несколько тестовых файлов, в которых я делаю несколько запросов, чтобы проверить, все ли в порядке. Моя проблема в том, что, хотя все файлы закодированы в кодировке utf8 (я проверял несколько раз)

Мой код выглядит так:

$text = "message with æøå to make it utf8";
$params = urlencode($text);
$url = "http://localhost/sms.php?text = ".$params;
echo mb_detect_encoding($text, "auto"); // this prints utf8
echo mb_detect_encoding($url, "auto"); // this prints ascii
$res = file_get_contents($url);

И это также то, что я вижу в своей принимающей конечной точке.

Сначала я подумал, что это как-то связано с file_get_contents, но, поскольку он был преобразован ПОСЛЕ urlencode, он подумал, что это может быть я. Но я не знаю, как решить эту проблему. Другая проблема, с которой я столкнулся, заключается в том, что многие мои клиенты используют этот старый код 2012 года (до того, как я начал использовать utf8 в качестве стандарта), поэтому я не могу изменить конечную точку, не заставляя их вносить изменения в свои текущие настройки.

В комментарии мне предложили попробовать проверить, является ли строка utf8, используя bin2hex:

bin2hex($_GET['text']); // 6d657373616765207769746820c3a6c3b8c3a520746f206d616b652069742075746638 which is inserted into the database: message with æøå to make it utf8
bin2hex(utf8_decode($_GET['text'])); // 6d657373616765207769746820e6f8e520746f206d616b652069742075746638 which is inserted into the database: message with æøå to make it utf8

Надеюсь, кто-то там может указать мне правильное направление. Например, я просмотрел несколько записей stackoverflow получить символы urlencoded utf8 на другой странице с помощью phpКакая правильная кодировка строк HTTP-запроса на получение?

но я не уверен, возможно ли то, что я ищу? я просто надеялся, что смогу переписать весь проект, чтобы он был готов к UTF8

Спасибо / Wel

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
101
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

mb_detect_encoding дает вам первую кодировку, в которой проверенная строка действительна. Если оставить его наедине с собой, он проверяет ASCII до UTF-8. Поскольку строка в кодировке URL состоит исключительно из подмножества символов ASCII, она действительна в кодировке ASCII, и mb_detect_encoding сообщит вам об этом. В то время как строка, содержащая символы, отличные от ASCII, не является допустимой ASCII, поэтому она продолжит тестирование других кодировок и в конечном итоге придет к UTF-8.

UTF-8 является расширенным набором ASCII, поэтому любая строка, которая является допустимой ASCII, также является допустимой UTF-8. Строка может быть действительна сразу в нескольких кодировках; mb_detect_encoding, сообщающий вам, что это действительный ASCII, означает ли нет, что это нет, также действительный UTF-8 или Latin-1, или множество других кодировок, если на то пошло. Так рождается Моджибаке.

В любом случае кодировки Обнаружение - это в значительной степени расплывчатая чепуха, и вам никогда не следует этого делать. Если вы ожидаете, что строка будет в UTF-8, просто проверьте, является ли она допустимой UTF-8 или нет:

mb_check_encoding($url, 'UTF-8')

Если он недействителен в ожидаемой кодировке, отбросьте его, так как тогда вы понятия не имеете, что это такое на самом деле.

Привет, спасибо за ответ. Извините, я не упомянул, что мне хорошо известно, что обнаружение может быть заказано так, чтобы оно начиналось с utf8 вместо ascii, но это не объясняет, почему на принимающей стороне мне нужно сделать utf8_decode, чтобы иметь возможность читать его как utf8 и вставьте его в базу данных правильно. $ _GET ['текст'] = utf8_decode ($ _ GET ['текст']);

Wel Rachid 20.07.2018 15:08

Это совсем другое стадо червей. Вероятно, $_GET['text'] отлично подходит для UTF-8, и вы просто неправильно обрабатываете настройки кодировки при вставке в базу данных. Используйте echo bin2hex($_GET['text']), чтобы увидеть байты, из которого состоит ваша строка, и проверить, представляют ли они правильную кодировку для ожидаемых символов.

deceze 20.07.2018 15:11

Я пробовал это, и да, похоже, что строка все еще содержит utf8 - но затем вставка ее в базу данных заставляет все это снова исчезнуть? я понимаю, что это выходит за рамки этого вопроса, но, возможно, я могу немного изменить его, чтобы он соответствовал

Wel Rachid 20.07.2018 15:41

Вероятно, вам нужно внимательно следить за stackoverflow.com/a/279279/476.

deceze 20.07.2018 15:43

Это было именно то. Используя set_charset, я смог заставить его работать и в базе данных .. Спасибо!

Wel Rachid 20.07.2018 17:51

Другие вопросы по теме