Выводятся ???? вместо русcких букв в PHP

251
31 августа 2017, 20:55

Имеем базу данных MySQL с кодировкой utf8_general_ci

Так же, имеем PHP файл который берёт данные из базы (кодировка UTF-8)

<?php 
header('Content-type: text/xml; charset=UTF-8'); 
$connection = mysql_connect( 'localhost', '***', '***' ); 
mysql_query('SET NAMES utf-8'); 
mysql_set_charset("UTF-8", $connection); 
mysql_select_db( '***' ); 
$result = mysql_query('SELECT * FROM shell' );  
?> 
<shell> 
<?php 
while ($row = mysql_fetch_assoc($result)) { 
?> 
<message> 
    <id><?php echo( htmlentities( $row['id'] ) ) ?></id> 
    <desc><?php echo( htmlentities( $row['description'] ) ) ?></desc> 
    <date><?php echo( htmlentities( $row['date'] ) ) ?></date> 
    <time><?php echo( htmlentities( $row['time'] ) ) ?></time> 
</message> 
<?php 
} 
mysql_free_result($result); 
?> 
</shell>

И в итоге, получаю вывод через браузер

<shell> 
<message> 
<id>1</id> 
<desc>???? ???????????? ??????</desc> 
<date>123</date> 
<time>233</time> 
</message> 
<message> 
<id>2</id> 
<desc>34234-1</desc> 
<date>234234-2</date> 
<time>234234-3</time> 
</message> 
<message> 
<id>3</id> 
<desc>12332</desc> 
<date>32133</date> 
<time>12334</time> 
</message> 
</shell>

Подскажите пожалуйста, как мне поставить правильную кодировку, что бы вместо знаков вопроса (???? ???????????? ??????) отображались русские буквы (Курс Классический массаж). Копаюсь уже сутки - понять не могу.

И ещё, создал файл .htaccess с содержимым

AddDefaultCharset UTF-8

Answer 1

В самом редакторе поставьте utf-8 или ide не знаю что у вас, потом чистом виде библиотека mysql не поддерживается. Потом в кодировке дефис не прописывается + text/html лучше У вас как вариант можно использовать mysqli или pdo . Я использую pdo библиотеку сделайте такой код всё заработает DB

<?php
define('DB_HOST', 'localhost');
define('DB_NAME', 'test');
define('DB_USER', 'root');
define('DB_PASS', '');
define('DB_CHAR', 'utf8');
class DB
{
    protected static $instance = null;
    public function __construct() {}
    public function __clone() {}
    public static function instance()
    {
        if (self::$instance === null)
        {
            $opt  = array(
                PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
                PDO::ATTR_EMULATE_PREPARES   => TRUE,
            );
            $dsn = 'mysql:host='.DB_HOST.';dbname='.DB_NAME.';charset='.DB_CHAR;
            self::$instance = new PDO($dsn, DB_USER, DB_PASS, $opt);
        }
        return self::$instance;
    }
    public static function __callStatic($method, $args)
    {
        return call_user_func_array(array(self::instance(), $method), $args);
    }
    public static function run($sql, $args = [])
    {
        $stmt = self::instance()->prepare($sql);
        $stmt->execute($args);
        return $stmt;
    }
}
?>

Далее вытаскиваем данные

$result = DB::run("SELECT * FROM shell");
foreach ($result as $row){
    echo"
<shell>
<message>
    <id>".$row['id']."</id>
    <desc>".$row['description']."></desc>
    <date>".$row['date']."></date>
    <time>".$row['time']."></time>
</message>
</shell>";
}

если будут ошибки пишите я проверил в версии 7.0

Answer 2

Настоятельно не рекомендую использовать mysql.

Внимание
Данная функция объявлена устаревшей в PHP 5.3.0, и, вместе с расширением MySQL, удалена PHP 7.0.0. Вместо нее используйте активно развивающиеся расширения MySQLi или PDO_MySQL.

Рекомендую использовать mysqli.

function con() {
    static $mysqli;
    if (!$mysqli) {
        mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
        $mysqli = new mysqli('хост', 'пользователь', 'пароль', 'имя базы данных');
        $mysqli->set_charset('utf8');
    }
    return $mysqli;
}
$con = con();
$shell = $con->query("SELECT * FROM shell");
// ..........

Не нужно делать SET NAMES utf8 данная операция не работает с кодировкой соединения, нужно использовать метод set_charset. Вообще нужно сделать базу, таблицы в utf8, и поля базы в utf8_general_ci, а также файлы с кодами, нужно конвертнуть в UTF-8 (без BOM) и в .htaccess прописать AddDefaultCharset utf-8, ну и в index.php (единую точку входа, где подключаются файлики, также задать заголовки).

header('Content-type:text/html;charset=utf-8');
READ ALSO
Bitrix: Странное поведение умного фильтра

Bitrix: Странное поведение умного фильтра

Наблюдаю проблему в работе умного фильтрапример 1:

254
Работа с SendMessage - C++ WinAPI

Работа с SendMessage - C++ WinAPI

Как отобразить в sendmessage координаты курсора(рабочей области окна) и на каком пункте меню находится курсор в данный момент?

383
Реализация boost::any

Реализация boost::any

Необходимо сделать базовую реализацию boost::anyГлавное условие: чтобы можно было свободно хранить в контейнерах разные типы

316