Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Kodowanie UTF-8 po raz N-ty
Forum PHP.pl > Forum > PHP
Tomplus
Mam przypadki:


Kodowanie pliku: UTF-8/w.o.BOM
Baza danych - aktualnie: [utf_general_ci] zażółć gęślą jaźń
Wynik na stronie [HTML - UTF-8] zażółć gęślą jaźń połączenie BEZ set names oraz charset
Jeżeli użyje set names= 'utf8' dla parametrów oraz charset='utf8' dla połączenia mam: zażółć gęślą jaźń
a po wykonaniu $withCharset->query("UPDATE user SET `name`= 'zażółć gęślą jaźń' WHERE `id` = 1"); mam ma stronie i bazie takiego potworka: za?????‚ć gę?›lą ja???„

Dopiszę trochę kodu, oto fragment klasy:
  1. if ($this->code == true) {
  2. $charset = ";charset={$dbCode}";
  3. $names = array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES {$dbCode}");
  4. } else $names = array();
  5.  
  6. try
  7. {
  8. $this->pdo = new PDO("mysql:host={$dbHost};dbname={$dbName}{$charset}", $dbUser, $dbPass, $names);
  9. $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  10. $this->pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
  11. }

Odwołanie:
  1. $withoutCharset = new DB(false); //bez UTF8 - tutaj wyświetla się prawidłowo kod z bazy
  2. $withCharset = new DB(true); //z UTF8 - wyświetla się źle i zapisuje się nieprawidłowo - bez ogonków





Czego nie widzę? Dlaczego strona o kodowaniu UTF-8 (html, plik) oraz kodowaniu połączeniu zapisuje krzaki, zamiast polskich znaków tj. PHPMyAdmin?

Pomoże ktoś?

Szukając na Googlach, wszystkie odpowiedzi są takie, jakie stosuje.

Nie wiem jak stringa który wykrywany jest jako UTF-8, wyświetlany poprawnie bez charsetów, zapisać/przekonwertować aby ta poprawna wartość była zapisana do bazy danych i z kodowaniem charset=utf8 wyświetlała się poprawnie.

?
memory
a jakie kodowanie mają kolumny ?
Tomplus
Tabela oraz wszystkie kolumny które mają litery z różnych języków to: utf8_general_ci.

Ja ciągle sam szukam odpowiedzi na tą moją zagadkę.
Crozin
1. utf8_xxx_[ci|cs|bin] to system porównywania znaków, nie kodowanie samo w sobie (utf8). Tutaj inf. jak sprawdzić: http://stackoverflow.com/a/4805510/252591
2. Sprawdź czy w bazie danych masz poprawne dane (binarnie). Porównaj sobie co zwraca Ci SELECT col_name, HEX(col_name) FROM tbl_name z np. http://www.endmemo.com/unicode/unicodeconverter.php
3. Plik jest zapisany jako UTF-8, ale czy stronę serwujesz z w takim też kodowaniu? Nagłówek Content-Type: text/html;charset=utf-8.
4. W DSN-ie PDO powinieneś użyć charset=utf8 (chyba, że masz PHP < 5.3.coś-tam). SET NAMES jest wtedy zbędne.
Tomplus
ad 3.
Jak napisałem:
- charset w php.ini -> UTF-8
- pliki PHP -> utf-8/wo BOM
- SQL -> tabela i kolumny: utf8_general_ci
- połączenie SQL -> SET NAMES utf8 oraz charset=utf8 (dla formalności)
- jeszcze dodaje inne kodowania np. iconv_internal na utf-8 ale bez zmian.

ad 4.
Mam nowszy serwer PHP (czyli 5.5), ale dla formalności używam obydwóch opcji (gdybym używam klasy na starszym PHP)

ad 2.
Porównanie: Coś jest źle w takim razie:

Endmemo wykazało (dla zażółć gęślą jaźń w PHPMyadmin, na stronie jest ok):
7A 61 C5 BC C3 B3 C5 82 C4 87 20 67 C4 99 C5 9B 6C C4 85 20 6A 61 C5 BA C5 84

A zrzut z bazy (gdzie w PHP My Admin i na stronie z kodowaniem połączenia SQL UTF-8 wykazuje: zażółć gęślą jaźń):
7A 61 C4 B9 C5 BA C4 82 C5 82 C4 B9 C2 82 C3 84 C2 87 20 67 C3 84 C2 99 C4 B9 C2 9B 6C C3 84 C2 85 20 6A 61 C4 B9 C5 9F C4 B9 C2 84

Rozwiązania mi to nie przyniosło, bo nadal nie wiem dlaczego
$withCharset->query("UPDATE table2") zapisuje z kodowaniem błędnym, ale $withCharset->query("SELECT table2") pokazuje kodowanie poprawne, jeżeli korekta była dokonana w PMA. (operuje na skopiowanej tabeli)

to samo z $withoutCharset->query("UPDATE table1") zapisuje OK, wyświwetla się także OK, ale w PMA mam za to krzaki, a przy połączeniu () $withCharset->query("SELECT table1") mam jeszcze inne krzaki.


ad 1.
Tak czy siak mam utf8 dla bazy.

?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.