Во время работы над обновлением некоторых старых проектов я работал с некоторыми старыми файлами и кодировками 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






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')
Если он недействителен в ожидаемой кодировке, отбросьте его, так как тогда вы понятия не имеете, что это такое на самом деле.
Это совсем другое стадо червей. Вероятно, $_GET['text'] отлично подходит для UTF-8, и вы просто неправильно обрабатываете настройки кодировки при вставке в базу данных. Используйте echo bin2hex($_GET['text']), чтобы увидеть байты, из которого состоит ваша строка, и проверить, представляют ли они правильную кодировку для ожидаемых символов.
Я пробовал это, и да, похоже, что строка все еще содержит utf8 - но затем вставка ее в базу данных заставляет все это снова исчезнуть? я понимаю, что это выходит за рамки этого вопроса, но, возможно, я могу немного изменить его, чтобы он соответствовал
Вероятно, вам нужно внимательно следить за stackoverflow.com/a/279279/476.
Это было именно то. Используя set_charset, я смог заставить его работать и в базе данных .. Спасибо!
Привет, спасибо за ответ. Извините, я не упомянул, что мне хорошо известно, что обнаружение может быть заказано так, чтобы оно начиналось с utf8 вместо ascii, но это не объясняет, почему на принимающей стороне мне нужно сделать utf8_decode, чтобы иметь возможность читать его как utf8 и вставьте его в базу данных правильно. $ _GET ['текст'] = utf8_decode ($ _ GET ['текст']);