Využij akce až 80 % zdarma při nákupu e-learningu. Více informací.
Pouze tento týden sleva až 80 % na e-learning týkající se Pythonu
python week
Avatar
Radek Morris Sedláček:23.12.2020 20:12

Dobrý den,

Jsem tu zas tentokrát s problémem kódování. Už to tu je řešeno milionkrát i na internetu, přesto nevidím funkční řešení.

Na LOCALHOST mi vše funguje bez problémů vyvíjím na Windows 10 za pomoci Wampserver 3.2.3, s php 7.3.21, Mysql 8.0.21. Bez jakéhokoliv zásahu do ini souborů.

Kódování databáze je utf8mb4_unicode_ci, stejně mám i tabulku a sloupce. Pokud načtu data zobrazí se bez problémů včetně české diakritiky. Neřeším správné řazení dle české abecedy.

Problém nastává ve chvíli, kdy stránky načtu na free webhosting. Vyzkoušeno na třech možných ENDORA.CZ, CZECHIA.COM, INFINITYFREE.NET. Nenačte správně češtinu a nezobrazuje diakritiku.

viz toto:

„Kdybys mohl spat?it Zemi osv?tlenou z m�sta tmav�ho jako noc, vypadala by n�dhern?ji ne� M?s�c.“

Zkusil jsem: Budu řešit ENDORA freehosting, zde je Mysql (Verze serveru: 5.7.26-29 - Percona Server (GPL), Release 29, Revision 11ad961) kodování cp1252 West European (latin1), **databáze má nastaveno utf8mb4_unicode_ci, stejně tak i tabulka. **Data jsem na server nahrával různými způsoby (ruční zápis přes phpMyAdmin, importem SQL souboru, i ručním zadáním SQL příkazu, naleznete níže), včetně změn kódování do UTF8_general_ci tak i do UTF8_czech_ci.

Web píšu ve Visual studio code, kde je u všech nastaveno souborů UTF8, a navíc jsem soubory i přeuložil do UTF8 abych si byl jistý.

Html mám v UTF8

<meta charset="utf-8">

V každém souboru PHP mám toto

<?php

    mb_internal_encoding("UTF-8");

SQL soubor pro import uloženy v UTF8

--

-- Struktura tabulky `citaty`

--

DROP TABLE IF EXISTS `citaty`;

CREATE TABLE IF NOT EXISTS `citaty` (

    `citat_id` int NOT NULL AUTO_INCREMENT,

    `citat_autor` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'Autor citátů',

    `citat` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'Text citátů',

    PRIMARY KEY (`citat_id`),

    UNIQUE KEY `citat` (`citat`(250))

) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Tabulka citátů';

--

-- Data pro tabulku `citaty`

--

INSERT INTO `citaty` (`citat_id`, `citat_autor`, `citat`) VALUES

    (0, 'Arthur Charles Clarke', 'Komunikační technologie jsou nezbytné, ale ne dostačující k tomu, aby spolu lidé vycházeli.'),

    (1, 'Galileo Galilei', 'Nikdy jsem nepotkal nikoho tak hloupého, abych se od&nbsp;něj něčemu nepřiučil.'),

    (2, 'Galileo Galilei', 'Dvě pravdy si nikdy nemohou odporovat.'),

    (3, 'Galileo Galilei', 'A přece se točí!');

HTML soubor index.php

<?php

    mb_internal_encoding("UTF-8");
    include 'includes/autoloader.inc.php';
    include 'includes/citat.php';

?>

<!doctype html>
<html lang="cs" dir="ltr">
    <head>

        <!-- Meta tags charset -->
        <meta charset="utf-8">
        <title></title>
    </head>
    <body>

        <p>&bdquo;<?= html_entity_decode($row['citat']) ?>&ldquo;</p>
        <p class="right-cite"><cite><strong>&mdash;&nbsp;<?= html_entity_decode($row['citat_autor']); ?></strong></cite></p>

    </body>
</html>

Database.inc.php

<?php
    mb_internal_encoding("UTF-8");

    /**
    * Nastavení připojení k databázi
    **/

    define("DB_HOST", "");
    define("DB_USER", "grizzly");
    define("DB_PASS", "");
    define("DB_NAME", "grizzly");
    define("DB_CHARSET", "utf8mb4");

Database.clas­s.php

<?php

    mb_internal_encoding("UTF-8");
    include './includes/database.inc.php';

    class Database {

        private $host = DB_HOST;
        private $user = DB_USER;
        private $pass = DB_PASS;
        private $dbname = DB_NAME;
        private $dbcharset = DB_CHARSET;

        private $dbh;
        private $stmt;

        public function __construct() {
            // Set DSN
            $dsn = "mysql:host=" . $this->host . ";dbname=" . $this->dbname . ";dbcharset=" . $this->dbcharset;

            // Set options
            $options = array(
            PDO::ATTR_PERSISTENT => true,
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION);

            // Create a new PDO instanace
            try {
                $this->dbh = new PDO($dsn, $this->user, $this->pass, $options);
            }

            // Catch any errors
            catch (PDOException $e) {
                echo "Connection failed: ".$e->getMessage();
            }
        }

        // The prepare function allows you to bind values into your SQL statements.
        public function query($query){
            $this->stmt = $this->dbh->prepare($query);
        }

        // Execute
        public function execute(){
            return $this->stmt->execute();
        }

        // Result Set
        public function resultset(){
            $this->execute();
            return $this->stmt->fetchAll(PDO::FETCH_ASSOC);
        }

        // Single
        public function single(){
            $this->execute();
            return $this->stmt->fetch(PDO::FETCH_ASSOC);
        }
    }

autoloader.in­c.php

<?php
    mb_internal_encoding("UTF-8");

    spl_autoload_register(function($className) {
        $file = dirname(__DIR__) . '\\classes\\' . $className . '.class.php';
        $file = str_replace('\\', DIRECTORY_SEPARATOR, $file);
        if (file_exists($file)) {
                include $file;
        }
    });

citat.php

<?php
     mb_internal_encoding("UTF-8");

    // Instantiate database.
    $database = new Database();
    $database->query("SELECT citat, citat_autor FROM citaty ORDER BY Rand() LIMIT 1");
    $row = $database->single();

Chci docílit: Správného kódování už nevím kde co nastavit aby správně běžel výpis v češtině.

Děkuji za pomoc.

Nejsem programátor.

Editováno 23.12.2020 20:14
Odpovědět
23.12.2020 20:12
Při dotazování se povzneste nad pocit, že můžete působit dojmem nejhloupějšího člověka v místnosti. [Jack Welch]
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:24.12.2020 10:45

Kodovani se nastavuje prikazy:
sql: SET NAMES https://dev.mysql.com/…t-names.html | https://dev.mysql.com/…nection.html

SET NAMES 'utf8mb4' COLLATE 'bogus';

php: header https://www.php.net/header

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

Zkus si najit, co delaji ty prikazy, o kterych si myslis, ze delaji, co chces, aby delali :)

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

- toto muze prohlizec uplne ignorovat a i aplikace tretich stran, pro ne je zasadni, jake kodovani posle server a to se obvykle meni pomoci header, pokud chces mit jistotu (jinak spolehas na to, co ma nastavene server a tam ti to admin prepne na latin1 a ty to pak mas vsude spatne, ale usetril jsi 1 radek php kodu :) )

mb_internal_encoding("UTF-8");

https://www.php.net/…nal_encoding

Editováno 24.12.2020 10:46
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět
24.12.2020 10:45
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Radek Morris Sedláček:24.12.2020 17:29

Mnohokrát děkuji za pomoc stačilo do douboru database.inc.php nastavit

PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci"

Tím se celý problém s kódováním vyřešil.
Přesto jsem do Indexu-php raději ještě vložil i toto.

<?php
header('Content-Type: text/html; charset=UTF-8');

mb_internal_encoding('UTF-8');
mb_http_output('UTF-8');
mb_http_input('UTF-8');  // zde mi to ale třeba na freehostingu od CZECHIA.COM nezobrazí stránku chyby jsem nevypisoval.
mb_regex_encoding('UTF-8');

Nově upravený soubor database.inc.php vypadí nyní takto

<?php

include './includes/database.inc.php';

class Database {

    private $host = DB_HOST;
    private $user = DB_USER;
    private $pass = DB_PASS;
    private $dbname = DB_NAME;
    private $dbcharset = DB_CHARSET;

    private $dbh;
    private $stmt;

    public function __construct() {
        // Set DSN
        $dsn = "mysql:host=" . $this->host . ";dbname=" . $this->dbname . ";dbcharset=" . $this->dbcharset;

        // Set options
        $options = array(
        PDO::ATTR_PERSISTENT => true,
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci");

        // Create a new PDO instanace
        ...
        ...
        ...
        ...
        ...
}

a zde je výpis index.php

<?php
    header('Content-Type: text/html; charset=UTF-8');

    mb_internal_encoding('UTF-8');

    include 'includes/autoloader.inc.php';
    include 'includes/citat.php';
?>

<!doctype html>
<html lang="cs" dir="ltr">
    <head>

        <!-- Meta tags charset -->
        <meta charset="utf-8">
        ...
        ...
        ...
        ...
        ...
</html>

Snad to někomu pomůže při řešení stejného problému.
Ještě jednou děkuji Peter Mlich

Nahoru Odpovědět
24.12.2020 17:29
Při dotazování se povzneste nad pocit, že můžete působit dojmem nejhloupějšího člověka v místnosti. [Jack Welch]
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.