Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP][HTML]Kodowanie - krzaki
Forum PHP.pl > Forum > Przedszkole
Warmix
Cześć, niby sprawa prosta, no ale kurde nie mogę sobie poradzić.
Sprawa ma się tak. Postawiłem bazę danych na localhoscie -> kodowanie bazy danych - utf8_unicode_ci, kodowanie tabel - utf8_unicode_ci, kodowanie wszystkich znakowych pól - utf8_unicode_ci.

W pliku:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE html>
  3. <html xmlns="http://www.w3.org/1999/xhtml">
  4. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  5. </head>


I na localhoście wszystko działa poprawie. Za pomocą strony napisanej na localhoście uzupełniłem bazę danych. Są w bazie krzaki, na stronie wyświetla się poprawnie.

Teraz przerzucam całość na serwer. Bazę danych exportuję do pliku SQL z kodowaniem UTF8. Importuję do bazy na serwerze (już ustawione było kodowanie utf8_unicode_ci). Po wgraniu kodowanie wszystkich tabel i pól zostało takie samo, czyli utf8_unicode_ci.

Wgrywam pliki strony. Dodam, że Notepad++ wykazuje kodowanie dla każdego z plików UTF-8 (bez BOM) no i na stronie, zamiast pojawienia się jak na localhoście polskich znaków, wszędzie zamiast nich pojawiają się oryginalne wpisy z bazy, tzn krzaczki. Co robię nie tak? Dodam, że wolałbym nie musieć edytować rekordów w bazie, gdyż jest ich dużo.
b4rt3kk
W jaki sposób uzupełniłeś bazę na localhost?

Będziesz musiał zrobić poprawki na bazie, nie ma innej opcji, skoro są krzaczki. Nie powinno ich tam być.
Warmix
Cytat(b4rt3kk @ 21.08.2017, 20:20:54 ) *
W jaki sposób uzupełniłeś bazę na localhost?

Będziesz musiał zrobić poprawki na bazie, nie ma innej opcji, skoro są krzaczki. Nie powinno ich tam być.


Standardowo za pomocą mysqli przy pomocy strony w php z ustawieniami cały czas takimi, jak podałem wyżej. Naprawdę nie ma opcji, żeby bez edycji bazy danych to przerobić? (Ewentualnie istnieje strona, która przetworzy mi online takie kodowanie, żebym mógł sobie bota napisać, który mi to przerobi?)
b4rt3kk
Cytat(Warmix @ 21.08.2017, 20:24:58 ) *
Standardowo za pomocą mysqli przy pomocy strony w php z ustawieniami cały czas takimi, jak podałem wyżej. Naprawdę nie ma opcji, żeby bez edycji bazy danych to przerobić? (Ewentualnie istnieje strona, która przetworzy mi online takie kodowanie, żebym mógł sobie bota napisać, który mi to przerobi?)


Przykro mi, ale nie wiem co oznacza standardowo. Masz na myśli na przykład poprzez phpmyadmin, czy też napisałeś sobie jakiś skrypt? Jeśli skrypt, to czy wkleiłeś gotowe zapytania, czy też wczytałeś plik?

Nie znam takie strony.

Bota owszem, mógłbyś sobie napisać, ale musiałbyś przejrzeć wszystkie kolumny tekstowe wszystkich tabel i odpalić dla każdej odpowiednie zapytanie.
Warmix
Cytat(b4rt3kk @ 21.08.2017, 20:32:45 ) *
Przykro mi, ale nie wiem co oznacza standardowo.


Inout textowy, button, klik i już. Dziwi mnie to, że dosłownie wszędzie od początku było ustawione takie samo kodowanie - dlatego dziwią mnie takie cyrki. Może to jakiś problem z exportem/importem? Chociaż tak, jak mówię, treści, tzn chodzi mi o konkretne krzaki odpowiadają sobie zarówno po stronie serwera jak i localhosta, zatem raczej to nie problem z przeniesieniem. Czy serwery podczas komunikacji narzucają jakieś kodowanie swoje i przez to pojawiają się krzaki?
Bo dodam, że jeśli w pliku np. xhtml dodam polskie znaki to są one poprawie wyświetlane, chodzi tylko o te pobrane z bazy danych.
b4rt3kk
Cytat(Warmix @ 21.08.2017, 20:35:51 ) *
Inout textowy, button, klik i już. Dziwi mnie to, że dosłownie wszędzie od początku było ustawione takie samo kodowanie - dlatego dziwią mnie takie cyrki. Może to jakiś problem z exportem/importem? Chociaż tak, jak mówię, treści, tzn chodzi mi o konkretne krzaki odpowiadają sobie zarówno po stronie serwera jak i localhosta, zatem raczej to nie problem z przeniesieniem. Czy serwery podczas komunikacji narzucają jakieś kodowanie swoje i przez to pojawiają się krzaki?
Bo dodam, że jeśli w pliku np. xhtml dodam polskie znaki to są one poprawie wyświetlane, chodzi tylko o te pobrane z bazy danych.


Jakie locale jest ustawione na serwerze?

Jeśli inne niż polskie to to zmień przed importem:

  1. setlocale(LC_ALL, 'pl_PL');
Warmix
Cytat(b4rt3kk @ 21.08.2017, 21:16:57 ) *
Jakie locale jest ustawione na serwerze?

Jeśli inne niż polskie to to zmień przed importem:

  1. setlocale(LC_ALL, 'pl_PL');


Nie bardzo rozumiem, jaki to ma wpływ na kodowanie znaków i przyznam, że nie bardzo rozumiem, jak w tym kontekście mam to użyć. Wrzucić do pliku PHP, odpalić go, potem wejśc w phpmyadmina i zaimportować bazę z pliku sql i powinno hulać? -- to nie hula.
b4rt3kk
Cytat(Warmix @ 21.08.2017, 22:40:23 ) *
Nie bardzo rozumiem, jaki to ma wpływ na kodowanie znaków i przyznam, że nie bardzo rozumiem, jak w tym kontekście mam to użyć. Wrzucić do pliku PHP, odpalić go, potem wejśc w phpmyadmina i zaimportować bazę z pliku sql i powinno hulać? -- to nie hula.


Nie, przy tworzeniu bazy na localhost. Wywal to co masz obecnie lokalnie i utwórz ponownie. Zakładam, że masz wszelkie potrzebne komendy. Ewentualnie prześlij ten skrypt na docelowy serwer i tam utwórz bazę bezpośrednio.
viking
Zdefiniuj kodowanie dla połączenia z bazą.
Warmix
Cytat(viking @ 22.08.2017, 02:29:06 ) *
Zdefiniuj kodowanie dla połączenia z bazą.


Rozumiem, że ustawić jako UTF-8?
viking
Dobrze rozumiesz.
http://php.net/manual/pl/mysqli.set-charset.php
Warmix
Cytat(viking @ 22.08.2017, 07:40:06 ) *


Akurat tutaj skorzystałem z PDO. Zrobiłem to tak:

  1. class db_connect {
  2. private $pdo;
  3. private static $instance;
  4.  
  5. public function __construct(){
  6. try{
  7. global $host, $user, $pass, $database_name;
  8. $this->pdo = new PDO('mysql:host='.$host.';dbname='.$database_name.'', $user, $pass);
  9. $this->pdo->exec("set names utf8");
  10. }catch(PDOException $e){
  11. exit('Połączenie nie mogło zostać utworzone: ' . $e->getMessage());
  12. }
  13.  
  14. }
  15.  
  16. public function getQuery($query){
  17. return $stmt = $this->pdo->query($query);
  18. }
  19.  
  20. }


albo drugim sposobem, którego znalazłem:

  1. class db_connect {
  2. private $pdo;
  3. private static $instance;
  4.  
  5. public function __construct(){
  6. try{
  7. global $host, $user, $pass, $database_name;
  8. $this->pdo = new PDO('mysql:host='.$host.';dbname='.$database_name.'', $user, $pass, array(
  9. PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"
  10. ));
  11. }catch(PDOException $e){
  12. exit('Połączenie nie mogło zostać utworzone: ' . $e->getMessage());
  13. }
  14.  
  15. }
  16.  
  17. public function getQuery($query){
  18. return $stmt = $this->pdo->query($query);
  19. }
  20.  
  21. }



Niestety, bez zmian. Wciąż ładuje krzaki z bazy, zamiast przerobić je na polskie znaki sad.gif

ref
Jakaś idea co mogę jeszcze zrobić?
nospor
Z tego co zrozumialem, to ty teraz ustawiles to polaczenie dla bazy na serwerze, gdzie niestety masz juz smietnik.

polaczenie w utf8 masz ustawic na localhost, skasowac baze na localhost, na nowo ja wypelnic danymi, zrobic export na serwer i wowczas na serwerze tez utf8 w polaczeniu i moze bedzie smigac smile.gif
Warmix
Cytat(nospor @ 22.08.2017, 18:39:59 ) *
Z tego co zrozumialem, to ty teraz ustawiles to polaczenie dla bazy na serwerze, gdzie niestety masz juz smietnik.

polaczenie w utf8 masz ustawic na localhost, skasowac baze na localhost, na nowo ja wypelnic danymi, zrobic export na serwer i wowczas na serwerze tez utf8 w polaczeniu i moze bedzie smigac smile.gif


Kurde sad.gif Jak pisałem, wolałbym uniknąć wypełniania bazy jeszcze raz, gdyż jest to około 5000 tysięcy rekordów ręcznie wpisywanego tekstu sad.gif
nospor, istnieje jakaś szansa, żeby to obejść? Cokolwiek będzie na pewno szybsze, niż ręczne wypełnianie tego ponownie. Czy jeśli bym zrobił funkcję, która wczyta mi te stringi, wyszuka w nich znaki Unicode, potem nadpisze je na polskie (czy znów unicode?) już z łączeniem z bazą z charsetem UTF-8 to zadziała to? Albo jakaś zmiana kodowania tych kolumn? Cokolwiek.
Skoro na localhoście poprawnie mi interpretuje te znaki, to zrobiłbym może tak: utworzę nową baze, nowe połączenie z charsetem UTF8, pobiorę w pętli kolejno wszystkie pola i wrzucę je do nowej tabeli, zadziała takie coś?


____

Okej, zrobiłem tak jak napisałem wyżej i problem zażegnałem. Dzięki za naprowadzenie.
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.