Как изменить кодировку отчета об ошибке в PHP?

212
04 июля 2017, 23:46

При выполнении скрипта запроса

<?php
mysqli_connect('localhost', 'root', '');
?>

при выключенном сервере MySQL, получаю в браузере отчет об ошибке (warning):

mysqli_connect(): (HY000/2002): ��������� �� �����������, �.�. ������ ������� ������ ������ �� ���������.

Битый текст - это строка, которая является сообщением: "Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение." Использую локальный веб-сервер сборки XAMPP v.3.2.

Как получить эту строку корректно в отчете об ошибке?

Answer 1

Вывод ошибки MySQL будет зависеть от самой сборки, LANG на сервере (+еще некоторое количество всякой фигни) и того, как отображает у тебя text WEB-сервер

Я бы посоветовал начать отладку с установки в .htaccess параметра

AddDefaultCharset utf-8

В 90% случаев на этом все и заканчивается

Если не поможет, иди по шагам:

  1. На какой ОС все это работает и какая кодировка в этой ОС по умолчанию
  2. В какой кодировке живет сервер SQL
  3. В какой кодировке живет WEB-сервер

Кстати говоря, полученный текст можешь взять, скопировать в буфер и вставить вот сюда: https://www.artlebedev.ru/decoder/ - классная штука, позволяет быстро и просто понять, что происходит

Только копируй прям сразу где увидел, а не из поста выше, например. Символ - вполне себе печатный символ UTF-8, кодировать его куда-то еще не получится ) Так случается после вставки кракозябр куда-то, где контент в UTF-8.. они просто преобразуются в обычные UTF-8 символы.

UPD. Я провел эксперимент:

  1. Взял вашу исходную предполагаемую строчку mysqli_connect(): (HY000/2002): Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение.
  2. Записал ее в файл в кодировке UTF-8:

    $ env | grep LANG LANG=ru_RU.UTF-8

    $ echo "mysqli_connect(): (HY000/2002): Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение." > q686819.txt

  3. Полученный файл перегнал из UTF-8 в CP-1251 (она же windows-1251)

    $ iconv -f utf-8 -t windows-1251 ./q686819.txt

    mysqli_connect(): (HY000/2002): ����������� �� �����������, �.�. �������� ��������� ������ ������ �� �����������.

Консоль у меня отображает вывод в UTF-8, но выводимые символы имеют кодировку CP-1251

Отсюда можно сделать следующий полезный для вас вывод: исходный текст ваша сборка MySQL выводит в кодировке windows-1251 (скорее всего потому что собрана под Windows, а там в русской локализации по умолчанию именно windows-1251). А вопросики вы видите потому, что смотрите на символы через призму кодировку utf-8

Решение: либо поменять сборку MySQL на EN, без локализации на русском (возможно там в параметрах можно поменять LANG для ошибок или что-то вроде того - обычно такие пакеты делают мультиязычными, а язык выбирается из параметров ОС), либо ничего не менять и выводить в windows-1251 (как сейчас), но смотреть на это через призму той же кодировки windows-1251, например в .htaccess

AddDefaultCharset windows-1251

Попробуйте, тут нужны эксперименты именно с вашей сборкой и на Windows. К сожалению подробнее я вам не подскажу - пользуюсь Linux и обычными Apache httpd и mariadb из репозиториев. Но направление определенно верное

READ ALSO
Чем отличается define() от const?

Чем отличается define() от const?

Объясните пожалуйста чем отличается строка

186
Symfony affected_rows transaction

Symfony affected_rows transaction

I have entity Users, example

249