webdice
1.01.2009, 17:21:06
Wiele osób ma problem z polskimi znakami w bazie danych, dlatego postanowiłem jakiś czas temu napisać artykuł na łamach wortalu. Mam nadzieje że będzie pomocny, a forum nie będzie zaśmiecane kolejnymi pytaniami dotyczącymi tego problemu.
Artykuł znajduje się
tutaj.
obelix94
2.01.2009, 23:40:17
Niestety taki ktoś jak ja nie umie szukać, przepraszam.
Legro
5.01.2009, 19:16:22
Artykuł? Przecież to sie nie nadaje na poradnik, a co dopiero na artykuł. Haha
thomson89
29.03.2009, 20:58:10
Jakby komuś nie szło:
Pozdrawiam!
Adiqus
2.06.2009, 12:37:35
a mnie to się podoba ... na pewno się kiedyś przyda
GregoryW
18.09.2009, 14:54:03
mam pytanie, jeśli wybieram zawsze utf8 polski i 'utf8_polish_ci', czy to ma jakieś znaczenie, niżeli wybierałbym 'utf8_unicode_ci'?
erix
18.09.2009, 15:17:42
Tak. Przy utf8_polish* polskie znaki diakrytyczne są uwzględniane przy sortowaniu. W przypadku pozostałych zestawów porównań - polskie litery są za literą Z w alfabecie (wxyząć).
thomson89
29.10.2009, 17:03:05
Jeżeli robisz zwykły blog to wystraczy unicode. Jak, sklep, czy coś z szukajką: polish.
aqun
17.11.2009, 22:37:24
Polski i hiszpański na tej samej stronie jednocześnie - czy to można zrobić?
Nie chodzi mi o przełączenie z jednej wersji językowej na inną, na ten temat znalazłem porady.
Problem jest taki:
w bazie MySQL chciałbym umieścić teksty polskie i hiszpańskie, a na stronie wyświetlać je tak żeby były widoczne
jednocześnie. Jeżeli to jest do zrobienia proszę o podanie jak poustawiać kodowanie w bazie i na stronie.
Będę też wdzięczny za uzasadnienie (jeżeli się nie da) to dlaczego, bo dociekliwy jestem i pewnie będę jakoś
na własną rękę zgłębiał temat, a po co tracić czas na wyważanie otwartych drzwi. Pozdro dla wszystkich.
mech
17.11.2009, 22:51:02
A dlaczego w różnych przeglądarkach różnie działają kodowania? Czy powinienem do każdej przeglądarki wstawiać osobne kodowanie? Jak by to rozwiązać?
thomson89
17.11.2009, 23:22:11
Może źle masz ustawione kodowanie, a każda przeglądarka ma inne kodowanie domyślne - stąd te różnice.
mech
18.11.2009, 08:41:44
To jak najlepiej to rozwiązać?
W jeden plik ładować kilka tablic czy mam tworzyć oddzielne pliki do każdej przeglądarki?
Meares
18.11.2009, 08:52:58
@aqun: Stwórz dwie kolumny - jedną dla polskich tekstów (utf8_polish_ci), a druga dla hiszpańskich (utf8_spanish_ci/utf8_spanish2_ci [nie mam pojęcia czym różni się spanish od spanish2]).
@mech: Nie jestem pewny, ale moim zdaniem wystarczy poprosić użytkowników, aby zmienili kodowanie w przeglądarkach na "Wybór automatyczny" (tak się to zwie w Operze). Jeśli zmienię sobie na jakieś inne, to jasne, że będzie źle wyświetlało polskie (i nie tylko) znaki.
aqun
18.11.2009, 23:41:06
Dzięki Meares, właśnie skończyłem, mam hiszpańskie i polskie znaki, dla porządku trzeba dodać że na stronie kodowanie trzeba ustawić na UTF-8. Miałem ISO 8859-2, więc wszystko trzeba było przekonwertować, no ale jest ok.
Pozdro dla wszystkich.
kupilemsobieksiazke
16.12.2009, 20:45:00
Mam pytanie... DOPIERO zaczynam i dzisiaj odebrałem z poczty "PHP i MySQL Tworzenie stron WWW Vademecum Profesjonalisty". Słuchajcie... to dopiero php. Zamiast instalować wszystkiego po kolei zainstalowałem xamppa. Trochę minęło zanim się w tym wszystkim połapałem.
Na IE wszystko działa ok - wyświetla się ąśćę... ale normalnie korzystam z Opery i tam zamiast ś dziwny kwadracik, a o dziwo np. ć wyświetla się dobrze. Nie znalazłem na forum rozwiązania takiego problemu.
Wkleiłem <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> do jednego pliku z płytki i wszystkie polskie znaki to kwadraty, a na IE dalej wszystko ok.
Z góry dzięki, jak ktoś mógłby mi pomóc
thomson89
16.12.2009, 23:16:29
Zainstaluj sobie notepad++ i kliknij konwertuj na utf-8. Lub poprzez gżegżółkę...
kupilemsobieksiazke
17.12.2009, 17:55:54
Działa

A jakby wrzucać na serwer hostingowy (nie jakiś localhost), to też trzeba tak konwertować?
Z góry dzięki. Już pomogłeś.
thomson89
17.12.2009, 17:59:14
Zależy jaki. Mam obecnie serwer na prohost. Kodowanie miałem po prostu ustawione na utf-8, ale po wrzuceniu na tenże serwer musiałem KONWERTOWAĆ każdy plik do utf-8 bez bom. Inaczej plik wariował. Np. htaccess, zamiast plików podanych w <file plik> zamieniał wszystkie pliki na te parsowane przez php. Także były różne głupoty tam
kupilemsobieksiazke
17.12.2009, 19:01:08
Więc tak naprawdę nie ma na to sposobu? ;/
thomson89
17.12.2009, 19:23:00
Cytat(kupilemsobieksiazke @ 17.12.2009, 19:01:08 )

Więc tak naprawdę nie ma na to sposobu? ;/
Sposób jest, lecz nie ma reguły. Najlepiej jest konwertować wszystko na utf-8 bez bom i powinno wszędzie śmigać.
kupilemsobieksiazke
19.12.2009, 00:02:03
Znowu źle ;/ Jak w IE dobrze, to OPERA się sypie... Albo na odwrót. Mam problem z zapisem do pliku tekstowego (nawet nie tyle, że źle odczytuje)... Ma problem z odczytaniem czegoś takiego "\n" i na pewno jest to dobrze, bo to przykład z książki. Podejrzewam, że to wszystko ściśle powiązane... A uczę się od środy.
thomson89
19.12.2009, 10:37:51
nl2brHej, a zadeklarowałeś na początku strony w head, że to utf-8? Jak cos zapisujesz do pliku, to plik najpierw przekonwertuj na utf-8 a potem cos zapisuj.
kupilemsobieksiazke
20.12.2009, 17:49:02
No hej
<meta http-equiv="Content-type" content="text/html; charset=iso-8859-2">
takie coś dodaję.
Mam taki problem. Koduję wszystko w UTF-8 bez iso cośtamcoś 2. I zapisuję do pliku w notatniku ciąg znaków ąęśćńźżół z "\n" na końcu, polskie znaki ok, ale na końcu jest kwadracik, a miało być złamanie linii. Natomiast zapisując to wszystko do Excela, złamanie linii działa (niższy wiersz),a polskie znaki wyglądają tak: ąęśćńźżół
Wszędzie koduję na UTF-8 za pomocą notepad++ (w plikach .html i .php). Jak kombinowałem i przekonwertowałem plik excela na ascii to wyszło ok, ale tak to się sypie...
thomson89
20.12.2009, 21:00:36
Cytat(kupilemsobieksiazke @ 20.12.2009, 17:49:02 )

<meta http-equiv="Content-type" content="text/html; charset=iso-8859-2">
(...)
Wszędzie koduję na UTF-8...
Z naciskiem na
iso-8859-2 i
UTF-8 
Daj tak:
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
kupilemsobieksiazke
21.12.2009, 10:56:02
Właśnie tak miałem we wszystkich plikach php i html. Przy zapisie do notatnika (.txt) zamiast prawidłowej interpretacji "\n" kwadracik, a jak chcę tu wkleić ten kwadracik, to mi się robi nowa linia...
O właśnie tak. Tu go nie widać. Znalazłem tylko jedno rozwiązanie na prawidłowy odczyt z tego pliku (.txt) mianowicie:
while (!feof($wp))
{
$znak = fgetc($wp);
echo ($znak=="\n" ? "<br />": $znak);
}
Wtedy to interpretuje dziwny kwadracik jako łamanie linii...
Natomiast przy odczycie pliku z excela wszystko jest ok, a w samym excelu łamie linie poprawnie (robi kolejne wiersze), ale polskie znaki... Trzeba cały czas konwertować na ascii i wtedy jako tako, ale przy zapisie znowu zapisują się szlaczki.
Z kolei wczoraj robiłem banalny profil logowania, na podstawie tych wszytkich informacji i serwer (110mb.com), który obsługuje php5 i mysql, nie interpretuje "\n" oraz "\t", zamiast tego po zapisie wyświetla się "n" oraz "t".
webdice
21.12.2009, 11:06:05
Ułomny notatnik ignoruje sam znak nowej linii. Nie mniej jednak on tam jest. Jeśli chcesz aby w notatniku tekst był poprawnie wyświetlany musisz zrobić tak:
Kod
pierwsza linia\r\ndruga linia
kupilemsobieksiazke
21.12.2009, 11:30:06
Dzięki

Jeden problem rozwiązany. Teraz tylko... co z dziwnymi znakami w excelu i łamaniem lini na serwerze, gdzie wszystkie backslashe są zastępowane niczym.
To mój notatnik jest zły? Czy to autorzy książki nie zadbali o przenośność kodu?
thomson89
21.12.2009, 15:25:25
Excel jest zupełnie inaczej kodowany. Poszukaj coś w stylu "otwieranie plików doc php".
A jak dajesz, to \n? W ciągu " czy ' (choć nie jestem pewien czy to jakaś różnica jest).
kupilemsobieksiazke
21.12.2009, 16:21:20
Jest różnica. Taki znak tylko w ciągu "" podwójnych nawiasów. Do wywoływania używam zawsze echo. Okok poszukam.
kuxma
22.12.2009, 01:54:21
Witam. Jestem tu nowy i mam problem z polskimi znakami. Oto co zrobiłem
w pliku php na stronie umieściłem:
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
na serwerze w tabeli zmieniłem kodowanie znaków na utf8_polish_ci
w pliku coon.php
<?
define('DB_HOST','xxxxxxxx.pll'); define('DB_USER','lużytkownik'); //wpisz nazwęużytkownika bazy
danych
define('DB_PASS','hasło'); //wpisz hasło dla tego użytkownika define('DB_DB','xxxxx_xxxx_pl');
?>
a to kod php w kórym chce mieć polskie znaki
<?
require('coon.php');
if($login and $wpis) {
$zapytanie="INSERT INTO ksiega (login,wpis) VALUES('$login','$wpis')";
echo('Dodano wpis '.$login.' '); }
?>
<h1 align="center"><font size="5" color="#FF0000">Dodaj wpis</font></h1>
<form action="ksiega.php" method="post">
<strong>Login:</strong><br><input name="login" type="text" value="" /><br>
<strong>Twój wpis:</strong><br><input name="wpis" type="text" value="" size="73" /><br>
<input type="submit" value="Dodaj" />
</form>
<br><br>
<?php
require('coon.php');
$query="SELECT * FROM ksiega";
echo "<b><center>Wasze wpisy</center></b><br><br>";
$i=0;
while ($i < $num) {
echo "<b>Login: $login <br> Wpis: $wpis </b><hr><br>";
$i++;
}
?>
Pomocy już nie wiem co mam robić
webdice
22.12.2009, 09:32:12
kuxma
22.12.2009, 10:52:37
To taż nic nie daje. W phpMyAdmin próbowałem zmienić rekord na polskie znaki ą ś ć ę . Ale po tej zmienie nadal pojawiają się znaki ? ? ? ?. A tabela i baza danych jest w systemie kodowania utf8_polish_ci. Może coś w serwerze ustawić??
webdice
22.12.2009, 11:07:13
Mówisz utf_polish_ci, a w kodzie masz:
Zdecyduj się na jedno. Poza tym jakie masz kodowanie pliku?
kuxma
22.12.2009, 11:28:44
przed chwilą zmieniłem wszystko na utf8_unicode_ci. A z tym kodowaniem pliku to trochę nie rozumiem jestem początkujący
webdice
22.12.2009, 11:51:20
Cytat(kuxma @ 22.12.2009, 11:28:44 )

(...). A z tym kodowaniem pliku to trochę nie rozumiem jestem początkujący
Co nie zmienia faktu że w używaniu mózgu początkujący nie jesteś. Na forum była masa tematów na ten temat, w sieci jeszcze więcej.
kuxma
22.12.2009, 13:12:51
Wiem co było źle Metoda porównywania napisów W TABELI była ustawiona na latin1_swedish_ci. Przepraszam za kłopot
dyziekwik
31.03.2010, 21:48:22
witam, nie jestem ekspertem, ale chciałbym się podzielić spostrzeżeniem. ustawiałem wszystko na utf8 tak jak mówiliście i dupa, wziąłem więc pajączka (bo w tym zwykłem pisywać) i tam ustawiłem kodowanie na utf8 i odczyt dokumentu w tym samym kodowaniu. jeśli w kodzie strony mamy krzaki to trzeba je wtedy zamienić na polskie litery i zapisać w utf8. Mi teraz chodzi.
webdice
31.03.2010, 22:11:49
Niczego nowego nie odkryłeś, mówisz o kodowaniu pliku, a o tym było już kilkanaście tematów na forum.
Daniel Meger
1.05.2010, 15:55:52
Jeżeli używasz UTF-8, zapisujesz w UTF-8, dodajesz odpowiednie nagłówki HTML dla UTF-8, a serwer i tak to czyta 'po swojemu' - dopisz na każdej stronie php nagłówek, że plik jest zakodowany w UTF-8:
<?php
header('Content-type: text/html; charset=utf-8'); ?>
Musisz to oczywiście dopisać przed wysłaniem nagłówków, a więc przed jakimkolwiek znakiem, tzn. przed <?php nie może być ani spacji ani entera, ani żadnego innego znaku.
Do tego jak baza jest w UTF-8, to wszystko będzie już działać poprawnie.
Wiem, że mogę się tutaj narazić na pewną krytykę i wiem, że to OT, ale moim zdaniem warto (właśnie w kontekście charsetów) z pajączków, zajączków i innych takich wynalazków przesiąść się na porządny IDE (polecam darmowy NetBeans).
darophp
10.08.2010, 08:25:20
Tak, ja bym to uniemożliwił.
monami
10.08.2010, 08:32:52
Cytat
Tak, ja bym to uniemożliwił.
Jeżeli to odpowiedz na post o polskich znakach w loginie i hasle przy rejestracji to dziekuje.
Usunelam post zaraz po dodaniu bo cos na temat znalazlam na innej stronie, nie zauwazylam odpowiedzi.
pag-r
24.08.2010, 18:18:29
Nie chce tworzyć nowego tematu,a zapewne ktoś miał do czynienia z takim problemem. Mianowicie mam bazę zapisaną w latin2. Żeby wyświetlić dane konwertuje je do utf-8 (iconv()), ponieważ moduł do przetwarzania tych danych jest w utf-8. Ale kiedy cokolwiek zmienię w polach edycji czy to input czy textarea i prześle te dane POST'em, są już nie do odczytania. Pojawiają się symbole nieprawidłowego kodowania typu zamiast litery ł pojawia się A z kółkiem. W każdym razie kodowanie się psuje. W jaki sposób sprawić by te dane były kodowane w jakiś ze standardowo przyjętych, żeby móc z nimi cokolwiek sensownego zrobić?
k_rogalski
30.11.2010, 22:03:32
Modyfikuje skryp z generatora formularza. Chce by w nazwisku dostepne byly polskie znaki. Pierwszy problem to wyslwietlanie polskich zankow po wyslaniu formularz. Formularz akceptuje i przesyla je do mysql natomiast zupenie nie akceptuje "o z kreska" ani w formie "o z kreska" a ni w formie utf. W przypadku wpisania "o z kreska" do formularza wyskakuje info, ze znak niedozwolony.
Druga sprawa to iz w bazie, polskie znaki zapisane sa unicodem, a nie forma graficzna(a z ogonkiem itp). Metoda porownania to latin2_general_ci.Prosze o info jak to zmienic. Ponizej skrypt. Probowalem mysql_query('SET NAMES latin2_general_ci'); i mysql_query('SET NAMES utf8'); ale nie wiem czy w dobrym miejscu wstawiam...
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
</head>
<?php
include("global.inc.php");
$errors=0;
$error="Formularz zostal niepoprawnie wypelniony. Sporboj ponownie. Ponzej znajduja sie popelnione bledy<ul>";
pt_register('POST','Email');
pt_register('POST','haslo');
pt_register('POST','nazwisko');
if($Email=="" || $haslo=="" ){
$errors=1;
$error.="<li>Zadne pole nie moze poozstawac bez danych. Prosze wrocic i rozpoczac od nowa.";
}
if(!eregi("^[a-z0-9]+([_\\.-][a-z0-9]+)*" ."@"."([a-z0-9]+([\.-][a-z0-9]+)*)+"."\\.[a-z]{2,}"."$",$Email)){
$error.="<li>Niepoprawna forma email";
$errors=1;
}
if(strlen ($haslo) <3 || strlen ($haslo)> 16)
{
$errors=1;
$error.="<li>Haslo musi miec conajmniej 10 znakow. Nie wiecej niz 16.";
}
if(!eregi("^[a-zA-Z;ÓóĄąĆćĘꣳŃńŚśŹźŻż]*$",$nazwisko)){
$error.="<li>Niepoprawne znaki";
$errors=1;
}
if($errors==1) echo $error;
else{
$where_form_is="http".($HTTP_SERVER_VARS["HTTPS"]=="on"?"s":"")."://".$SERVER_NAME.strrev(strstr(strrev($PHP_SELF),"/"));
$message="Ponizsze dane zostaly zapisane na serwerze Dk service
Email: ".$Email."
haslo: ".$haslo."
nazwisko: ".$nazwisko."
Jesli chcesz zmodyfikowac dane www.google.pl";
$message = stripslashes($message);
mail("testi@o2.pl","Form Submitted at your website",$message,"From: phpFormGenerator");
mail("$Email","Form Submitted at your website",$message,"From: phpFormGenerator");
$link = mysql_connect("localhost","xxxx","xxxxxx");
mysql_select_db("guingamp_cv",$link);
mysql_query('SET NAMES utf8);
mysql_query('SET NAMES latin2_general_ci');
$query = mysql_query("SELECT * FROM firma WHERE email = '$Email'||'$nazwisko'");
if( mysql_num_rows($query) != 0)
echo 'Apikacja zostala juz wczesniej zlozona.<a href="http://www.dkservice.eu/phpformgenerator/use/firma/form1.html"><input type="button" value="cofnij" /></a>
';
else {
$query="insert into firma (Email,haslo,nazwisko) values ('".$Email."',sha1(md5('".$haslo."')),'".$nazwisko."')";
mysql_query($query);
$make=fopen("admin/data.dat","a");
$to_put="";
$to_put .= $Email."|".$haslo."|".$nazwisko."
";
fwrite($make,$to_put);
?>
<h2>Dziekujemy za wypelnienie aplikacji</h2>
<table width=50%>
<tr><td>Email: </td><td> <?php echo $Email; ?> </td></tr>
<tr><td>haslo: </td><td> <?php echo $haslo; ?> </td></tr>
<tr><td>nazwisko: </td><td> <?php echo $nazwisko; ?> </td></tr>
</table>
<?php
}}
?>
ixpack
3.12.2010, 18:05:41
mysql_query('SET NAMES latin2_general_ci');
A czemu ustawiasz najpierw utf a później latin? Jak kodujesz dane w bazie? Ustaw kolumnę z nazwiskami na utf. I jak dodajesz nazwisko to ustaw dane jako utf, tak samo chyba jak nazwisko wyciągasz.
Jeżeli masz: dokument w utf8, dodajesz do bazy dane z tego dokumentu, ale przedtem ustawiasz names utf8 i jeżeli kolumna do której dodajesz dane utf8 jest w systemie kodowania utf8 I system porównania jest utf8 to musi działać.
Tak samo z wyciąganiem danych.
Mam zadeklarowane nagółwki header, meta w utf-8 ,pliki skonwertowane do utf8 bez bom. Cały serwer zainstalowany od nowa:
Apache 2.2
PHP 5.2.15 V6
MySQL 5.1.52 na win XP.Baza była utworzona za pomocą skryptu
Kod
$link=mysql_connect('localhost','root','');
$charset = mysql_client_encoding($link);
if ( $charset != 'utf8' ) {
mysql_set_charset('utf8',$link);
}
$sql="CREATE DATABASE IF NOT EXISTS rejestr ";
mysql_query($sql) or die(mysql_error());
mysql_select_db('rejestr',$link);
$sql="CREATE TABLE IF NOT EXISTS rejstr(
id int(4) NOT NULL auto_increment,
nick varchar(30) NOT NULL ,
haslox varchar(32) NOT NULL ,
mails varchar(70) NOT NULL ,
PRIMARY KEY klucz1 (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci; ";
mysql_query($sql) or die(mysql_error());
więc nie ma możliwości żeby była kodowana inaczej jak w UTF-8 i nie wiem dlaczego koduje mi w latin1 po wysłaniu formularza,a w bazie są krzaki.
Czy ktoś mógłby ,polecić mi jakiś naprawde ,dobry program serwerowy z Apache ,PHP i MySQL?Już kilka razy reinstalowałem swój serwer i w rezultacie otrzymuje inne kodowanie niż zadeklarowane.Ręce opadają.
Ale na kolumny to już kodowania nie ustawiłeś.
Popatrzyłem w MySQL Workbench i kolumny utworzyły się w UTF8 polish_ci więc wszystko wydaje się być wporządku.
rulespl
14.01.2011, 12:38:16
Witam
Nie wiem dlaczego ale cały czas pokazują mi się krzaczki zamiast polskich znaków. Używam kodowania UTF-8;
Oto jak wygląda sytuacja:
-Pliki są kodowane w UTF-8 bez DOM (zwykłe utf-8 też sprawdzałem) - ustawiłem poprzez notepad ++
-Kodowanie na stronie:
<meta http-equiv="Content-type" content="text/html; charset=UTF-8" />
-przy połączenu z bazą mam:
-baza tabela i kolumny mają poustawiane kodowanie utf8_unicode_ci
Dodatkowo po wpisaniu
SHOW VARIABLES LIKE 'character\_set\_%';
Pokazuje mi:
character_set_client utf8
character_set_connection utf8
character_set_database utf8
character_set_filesystem binary
character_set_results utf8
character_set_server latin1
character_set_system utf8
Z tego widzę, że character_set_server ma ustawione latin1, czy to powoduję problem? Jeśli tak, czy da się to jakoś obejść bez zmiany ustawień całego serwera?
Jeszcze jedno. Przy dodawaniu wartości z poziomu php nie wstawia polskich znaków. To chyba jest problem z kodowaniem serwera, ale jak to zmienić, żeby inne bazy na serwerze nie wykrzaczyły się przy okazji?
webdice
14.01.2011, 13:20:11
Poczytaj o AddDefaultCharset w Apache.
P.S. Bez BOM, nie DOM.
rulespl
14.01.2011, 13:32:55
No ta miałem na myśli oczywiście BOM
Ustawiłem w .htaccess
AddDefaultCharset UTF-8
Nic nie dało, jeszcze dodam, że w pliku na górze mam także:
header('Content-type: text/html; charset=utf-8');
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.