Как перевести %20%... в utf8 на русском?

84
04 марта 2022, 08:00

Ссылка на php скрипт. Скрипт нормально получает параметры version и name, но text не получается, он становится таким:

{B03131}1{FFFFFF} �������� ��������� {B03131}[2]{FFFFFF} ������ ��������� {B03131}[3]{FFFFFF} ����� � �������������� {B03131}[4]{FFFFFF} ������ �� ������� {B03131}[5]{FFFFFF} ��������� и т.д.

За � скрывается текст на русском, но текст на английском так же будет присутствовать в строке. Скрипт должен заносить 3 параметра в базу данных (mysql), но из-за этих вопросиков получается ошибка mysql 1366. Как сделать не понимаю.
Пробовал сделать так:

$text = mb_convert_encoding($_REQUEST['text'], 'utf8', mb_detect_encoding($_REQUEST['text']));

Но вместо � теперь ?

php скрипт:

<html>
<body>
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
$text = urldecode($_GET['text']);
$version = $_GET['version'];
$name = $_GET['name'];
if ($text == "" or $version == "" or $name == ""){echo "Не введены все 
параметры"; exit();}
$mysqli = new mysqli('localhost', 'mylogin', 'mypass', 'BD_name');
if (!$mysqli){exit();}
$str_sql_query = "INSERT INTO DropText (Name_Who, Version, Text) VALUES 
('".$name."','".$version."','".$text."')";
echo $str_sql_query;
if (!$mysqli->query($str_sql_query)){echo $mysqli->errno;}else{echo "Всё 
прошло удачно";}
$mysqli->close();
?>
</body>
</html>
Answer 1

Вам поможет mb_convert_encoding() с CP1251 на UTF-8. Вы правильно подошли к вопросу, но mb_detect_encoding() в вашем случае будет возвращать неверную кодировку ASCII.

Если у вас много таких переменных в проекте - обратите внимание на https://github.com/neitanod/forceutf8.

Если же случай единичный, то вот рабочее решение.

header('Content-Type: text/html; charset=UTF-8');
$string = "%7BB03131%7D%5B1%5D%7BFFFFFF%7D%20%C4%E5%E9%F1%F2%E2%E8%FF%20%EF%E5%F0%F1%EE%ED%E0%E6%E0%0A%7BB03131%7D%5B2%5D%7BFFFFFF%7D%20%CD%E0%E2%FB%EA%E8%20%EF%E5%F0%F1%EE%ED%E0%E6%E0%0A%7BB03131%7D%5B3%5D%7BFFFFFF%7D%20%D1%E2%FF%E7%FC%20%F1%20%E0%E4%EC%E8%ED%E8%F1%F2%F0%E0%F6%E8%E5%E9%0A%7BB03131%7D%5B4%5D%7BFFFFFF%7D%20%CF%EE%EC%EE%F9%FC%20%EF%EE%20%F1%E5%F0%E2%E5%F0%F3%0A%7BB03131%7D%5B5%5D%7BFFFFFF%7D%20%CD%E0%F1%F2%F0%EE%E9%EA%E8%20%EF%E5%F0%F1%EE%ED%E0%E6%E0%0A%7BB03131%7D%5B6%5D%7BFFFFFF%7D%20%C4%EE%ED%E0%F2%0A%7BB03131%7D%5B7%5D%7BFFFFFF%7D%20%D2%E5%EB%E5%F4%EE%ED%0A%7BB03131%7D%5B8%5D%7BFFFFFF%7D%20%CE%F2%EA%F0%FB%F2%FC%20%F0%F3%EB%E5%F2%EA%F3%0A%7BB03131%7D%5B9%5D%7BFFFFFF%7D%20%C8%F1%F2%EE%F0%E8%FF%20%ED%E8%EA%EE%E2%0A%7BB03131%7D%5B10%5D%7BFFFFFF%7D%20%C8%F1%F2%EE%F0%E8%FF%20%ED%E0%EA%E0%E7%E0%ED%E8%E9%0A%7BB03131%7D%5B11%5D%7BFFFFFF%7D%20%CF%F0%E5%EC%E8%F3%EC%20%E8%E3%F0%EE%EA%E8%20%EE%ED%EB%E0%E9%ED%0A%7BB03131%7D%5B12%5D%7BFFFFFF%7D%20%CF%F0%EE%EC%EE%2D%EA%EE%E4%3A%20%7BD2772C%7D%23Maras%7BFFFFFF%7D%0A%7BB03131%7D%5B13%5D%7BFFFFFF%7D%20%D1%E8%F1%F2%E5%EC%E0%20%EF%F0%EE%EC%EE%2D%EA%EE%E4%EE%E2";
echo mb_convert_encoding(urldecode ($string), 'UTF-8','CP1251');

Демонстрация: https://adudnik.ru/string_convert.php

Ваша строка закодирована в CP1251 из-за этого проблемы при выводе данных в HTML формат;

У меня ваш пример отрабатывает в изначальном виде без проблем:

$string = "%7BB03131%7D%5B1%5D%7BFFFFFF%7D%20%C4%E5%E9%F1%F2%E2%E8%FF%20%EF%E5%F0%F1%EE%ED%E0%E6%E0%0A%7BB03131%7D%5B2%5D%7BFFFFFF%7D%20%CD%E0%E2%FB%EA%E8%20%EF%E5%F0%F1%EE%ED%E0%E6%E0%0A%7BB03131%7D%5B3%5D%7BFFFFFF%7D%20%D1%E2%FF%E7%FC%20%F1%20%E0%E4%EC%E8%ED%E8%F1%F2%F0%E0%F6%E8%E5%E9%0A%7BB03131%7D%5B4%5D%7BFFFFFF%7D%20%CF%EE%EC%EE%F9%FC%20%EF%EE%20%F1%E5%F0%E2%E5%F0%F3%0A%7BB03131%7D%5B5%5D%7BFFFFFF%7D%20%CD%E0%F1%F2%F0%EE%E9%EA%E8%20%EF%E5%F0%F1%EE%ED%E0%E6%E0%0A%7BB03131%7D%5B6%5D%7BFFFFFF%7D%20%C4%EE%ED%E0%F2%0A%7BB03131%7D%5B7%5D%7BFFFFFF%7D%20%D2%E5%EB%E5%F4%EE%ED%0A%7BB03131%7D%5B8%5D%7BFFFFFF%7D%20%CE%F2%EA%F0%FB%F2%FC%20%F0%F3%EB%E5%F2%EA%F3%0A%7BB03131%7D%5B9%5D%7BFFFFFF%7D%20%C8%F1%F2%EE%F0%E8%FF%20%ED%E8%EA%EE%E2%0A%7BB03131%7D%5B10%5D%7BFFFFFF%7D%20%C8%F1%F2%EE%F0%E8%FF%20%ED%E0%EA%E0%E7%E0%ED%E8%E9%0A%7BB03131%7D%5B11%5D%7BFFFFFF%7D%20%CF%F0%E5%EC%E8%F3%EC%20%E8%E3%F0%EE%EA%E8%20%EE%ED%EB%E0%E9%ED%0A%7BB03131%7D%5B12%5D%7BFFFFFF%7D%20%CF%F0%EE%EC%EE%2D%EA%EE%E4%3A%20%7BD2772C%7D%23Maras%7BFFFFFF%7D%0A%7BB03131%7D%5B13%5D%7BFFFFFF%7D%20%D1%E8%F1%F2%E5%EC%E0%20%EF%F0%EE%EC%EE%2D%EA%EE%E4%EE%E2";
var_dump(urldecode ($string));

Возвращает:

string(498) "{B03131}[1]{FFFFFF} Действия персонажа {B03131}[2]{FFFFFF} Навыки персонажа {B03131}[3]{FFFFFF} Связь с администрацией {B03131}[4]{FFFFFF} Помощь по серверу {B03131}[5]{FFFFFF} Настройки персонажа {B03131}[6]{FFFFFF} Донат {B03131}[7]{FFFFFF} Телефон {B03131}[8]{FFFFFF} Открыть рулетку {B03131}[9]{FFFFFF} История ников {B03131}[10]{FFFFFF} История наказаний {B03131}[11]{FFFFFF} Премиум игроки онлайн {B03131}[12]{FFFFFF} Промо-код: {D2772C}#Maras{FFFFFF} {B03131}[13]{FFFFFF} Система промо-кодов"

Проблемы начинаются если задать в файле:

 header('Content-Type: text/html; charset=utf-8');

Т.е. сделать страницу HTML с utf-8. Из-за html сущностей ваша CP1251 строка превращается в крякозябры UTF-8.

Если ваш файл - просто обработчик и не требует вывода себя пользователю как html страницы, то проблему можно решить добавлением в шапку:

header('Content-Type: text; charset=utf-8');

Но лучше задать header('Content-Type: text/html; charset=utf-8'); и использовать

mb_convert_encoding(urldecode ($string), 'UTF-8','CP1251')

Самый правильный вариант - изначально кодировать GET параметры в UTF-8 и отказаться от CP1251.

READ ALSO
Ошибка - TypeError: list indices must be integers or slices, not str

Ошибка - TypeError: list indices must be integers or slices, not str

Может кто подсказать как исправить?

101
GregorianCalendar и ArrayList

GregorianCalendar и ArrayList

Как правильно добавить элементы GregorianCalendar в ListЕсть код где читаю строки по разделителю числа добавляю в один лист, а дату необходимо сохранить...

69
Обновление справочника сотрудников EJB

Обновление справочника сотрудников EJB

Только начинаю разбираться с EJB поэтому может это ламерский вопросДопустим есть справочник сотрудников

75