Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> php - kodowanie utf 8
szymek116
post 13.07.2006, 21:49:28
Post #1





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 13.07.2006

Ostrzeżenie: (0%)
-----


Witam

mam mały problem jestem zmuszony do wykorzystywania na jednej stronie znaków diakrytycznych wielu języków, problem w tym że w php mam z tym mały problem w poniższym kodzie

  1. <?php session_start(); ?>
  2. <meta name="test - blabla" http-equiv="content-type" content="text/html; charset=utf-8"/>
  3.  
  4. <?php
  5.  
  6.  
  7. $a="gęś";
  8. print "$a<br>"; // tutaj drukuje ok
  9. for ( $i = 0 ; $i < strlen ($a) ; $i++ )
  10. {
  11. print "{$a[$i]}<br>"; // a tutaj w miejsach znaków diakrytycznych wstawia dziwne znaczki
  12. }
  13. ?>


a wynik jest taki:
gęś
g





od razu pwoiem ze strona kdoowa dla pliku jest ok i przeglądarka też dobrą rozpoznaje.

z góry dzięki za jakieś podpowiedzi co z tym zrobić
Go to the top of the page
+Quote Post
NuLL
post 13.07.2006, 21:54:42
Post #2





Grupa: Zarejestrowani
Postów: 2 262
Pomógł: 21
Dołączył: 3.05.2004
Skąd: Sopot, Krakow, W-wa

Ostrzeżenie: (0%)
-----


A z jakim kodowaniem zapisales plik php questionmark.gif Powinienes w edytorze zapisac z plik z kodowaniem UTF-8 smile.gif

Ten post edytował NuLL 13.07.2006, 21:55:16


--------------------
Javascript, Coffeescript, Node.js, Mongo, CouchDb, chmury, workery & inne bajery - zycie jest zbyt krotkie aby miec nudna prace :)
Go to the top of the page
+Quote Post
Ludvik
post 13.07.2006, 21:56:48
Post #3





Grupa: Przyjaciele php.pl
Postów: 698
Pomógł: 3
Dołączył: 28.03.2004
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


No cóż, jak widać, php ma problem z unicode i to wiadomo nie od dzisiaj. W taki sposób pobierasz po 8 bitów, a polskie znaki diakrytyczne są kodowane 16, co widać na przykładzie. Nic z tym w ten sposób nie zrobisz. Pokombinuj z iconv, które pozwala na wycinanie pojedynczych znaków z tekstu kodowanego na różne sposoby.


--------------------
Go to the top of the page
+Quote Post
szymek116
post 13.07.2006, 21:57:12
Post #4





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 13.07.2006

Ostrzeżenie: (0%)
-----


Cytat
od razu pwoiem ze strona kdoowa dla pliku jest ok


miałem na myśli że strona kdoowa dla pliku jest utf-8 smile.gif

Cytat
No cóż, jak widać, php ma problem z unicode i to wiadomo nie od dzisiaj. W taki sposób pobierasz po 8 bitów, a polskie znaki diakrytyczne są kodowane 16, co widać na przykładzie. Nic z tym w ten sposób nie zrobisz. Pokombinuj z iconv, które pozwala na wycinanie pojedynczych znaków z tekstu kodowanego na różne sposoby.


to mie teraz zmartwiłeś sad.gif na mojej stronce dość sporo razy pobieram dane z i do bazy i generalnie przeróbka z użyciem iconv będzie mie troche kosztowała czasu sad.gif

Ten post edytował szymek116 13.07.2006, 22:01:39
Go to the top of the page
+Quote Post
Ludvik
post 13.07.2006, 22:09:01
Post #5





Grupa: Przyjaciele php.pl
Postów: 698
Pomógł: 3
Dołączył: 28.03.2004
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


To teraz Cię zmartwię jeszcze bardziej, bo z tego co mi wiadomo, wsparcie Unicode jest planowane w PHP6... Gdybyś kodował UTF-16, to by nie było problemu, bo każdy znak jest zapisywany zawsze w postaci dwóch bajtów. Mógłbyś pobierać to mniej więcej tak:
  1. <?php
  2. for ( $i = 0 ; $i < strlen ($a) / 2 ; $i++ ) {
  3. print substr($a, $i*2, 2) . "<br>"; // a tutaj w miejsach znaków diakrytycznych wstawia dziwne znaczki
  4. }
  5. ?>


--------------------
Go to the top of the page
+Quote Post
szymek116
post 13.07.2006, 22:20:49
Post #6





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 13.07.2006

Ostrzeżenie: (0%)
-----


no dobra wstawiłem twój kod ale po przekonwertowaniu pliku na utf-16 wygląda na to że przęglądarka (firefox 1.5.0.3) tak jak by nie widziała treści strony tzn w źródle nic nie ma, co z tym może być ?

a i jeszcze trzy pytania:
1. utf-16 to jest 8 plus rozszerzenie o znaki chińskie ?
2. kiedy jest planowane php 6 ?
3. czy mysql obsługuje utf-16 ?
Go to the top of the page
+Quote Post
dooshek
post 13.07.2006, 22:27:27
Post #7





Grupa: Zarejestrowani
Postów: 70
Pomógł: 0
Dołączył: 22.10.2003
Skąd: Trójmiasto

Ostrzeżenie: (0%)
-----


  1. <?php
  2.  
  3. mb_internal_encoding("UTF-8");
  4.  
  5. $a="gęś";
  6.  
  7. for ( $i = 0 ; $i < mb_strlen ($a) ; $i++ )
  8. {
  9.  $char = mb_substr($a, $i, 1) 
  10.  print "{$char}<br>"; 
  11. }
  12.  
  13. ?>


Powinno zadziałać. IMHO nie używaj iconv'a - iconv nie radzi sobie ze znakami (np. Wordowymi cudzysłowami) i przy konwersji z UTF na ISO obcina tekst w miejscu gdzie taki niestandardowy znak występuje... Lepiej już użyć SET NAMES latin2 przed wyciagnieciem czegokolwiek z bazy - MySQL przynajmniej w takim przypadku wstawia znak zapytania ale caly tekst sie pokazuje (nie jest obcinany).

Ogólna rada, żebyś lepiej takie czynności jak przycinanie tekstu itp. wykonywał za pomoca SQLa i pobierał juz z niego gotowe dane - tak jest proscie a MySQL np. bardzo dobrze sobie radzi z UTFem.

Nie używaj UTF-16! W tej chwili wsparcie dla tego kodowania jest slabe!

Ten post edytował dooshek 13.07.2006, 22:28:48


--------------------
"Use the force - read the source"
Go to the top of the page
+Quote Post
szymek116
post 13.07.2006, 22:36:09
Post #8





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 13.07.2006

Ostrzeżenie: (0%)
-----


wiesz co jak cie kiedyś spotkam masz u mie browara smile.gif WIELKIE DZIĘKI
Go to the top of the page
+Quote Post
Ludvik
post 13.07.2006, 22:36:11
Post #9





Grupa: Przyjaciele php.pl
Postów: 698
Pomógł: 3
Dołączył: 28.03.2004
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Ad 1. UTF-16 działa zupełnie inaczej. Koduje znaki zawsze przy pomocy 2 bajtów. UTF-8 używa zmiennej ilości, chyba od 1-6 bajtów, więc ma większy zakres znaków. Znaków chińskich chyba nie obsługuje. Ostatecznie jest UTF-32, które zwiększa rozmiar czterokrotnie... Mimo wszystko bym się skłaniał ku iconv. Konwersji za dużo nie będzie, za to niektóre operacje na stringach wykonujesz przy pomocy innych funkcji i tyle.
Ad 2. Nie orientuję się. Jedyne co mogę powiedzieć, to że poczekamy jeszcze trochę zanim wypuszczą stabilną wersję. Oczywiście od razu na serwerach się nie pojawi...
Ad 3. Nie piszą o UTF-16, ale wspomnieli o UCS-2, który jest podobny. Nie wiem czy identyczny.

Co do firefoxa, to nie mam pojęcia...


--------------------
Go to the top of the page
+Quote Post
br-design.pl
post 19.07.2006, 10:53:13
Post #10





Grupa: Zarejestrowani
Postów: 44
Pomógł: 1
Dołączył: 30.05.2006
Skąd: Gdańsk

Ostrzeżenie: (0%)
-----


U mnie zasadniczo UTF-8 sprawuję się doskonale, nie mam problemu. Być może problem leży po stronei edytora?


--------------------
tworzenie stron Gdańsk
Go to the top of the page
+Quote Post
everth
post 19.03.2011, 16:20:39
Post #11





Grupa: Zarejestrowani
Postów: 782
Pomógł: 153
Dołączył: 21.07.2010

Ostrzeżenie: (0%)
-----


Może od razu UTF-64. Zanim zaczniesz dalej szerzyć swoje mądrości zastanów się, poczytaj i jeszcze raz napisz ten post. UTF8 jest używane szeroko w świecie, UTF16 spotyka się w takich krajach jak Chiny czy Japonia, z UTF32 jeszcze się nie spotkałem.


--------------------
Już mi się ani wiedzieć, ani tym bardziej myśleć nie chce.
[Think different]!
Go to the top of the page
+Quote Post
Crozin
post 19.03.2011, 16:45:45
Post #12





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Cytat
UTF8 jest używane szeroko w świecie, UTF16 spotyka się w takich krajach jak Chiny czy Japonia, z UTF32 jeszcze się nie spotkałem.
UTF-16 to standard bo jest najwygodniejszym kodowaniem Unicode dla BMP (w palecie tej jest kodowaniem o stałej długości w przeciwieństwie do UTF-8) i to ono jest właśnie szeroko stosowane w świecie. UTF-8 to głównie strony WWW (w sumie to nie wiem czemu właśnie ono, a nie 16-bitowa wersja). UTF-32 jest jedynym kodowaniem o stałej długości znaku dla całej palety Unicode, a gdzie jest stosowane? Na Wiki pewnie będzie.
Go to the top of the page
+Quote Post
everth
post 19.03.2011, 16:57:00
Post #13





Grupa: Zarejestrowani
Postów: 782
Pomógł: 153
Dołączył: 21.07.2010

Ostrzeżenie: (0%)
-----


UTF8 jest wstecznie zgodne z ASCII, UTF16 i powyższe już raczej nie. Myślę że właśnie dlatego jest stosowane dla WWW. Co do tego UTF16 to rzeczywiście - aż mnie to zdziwiło że XPek już to stosuje - ale racja po twojej stronie smile.gif


--------------------
Już mi się ani wiedzieć, ani tym bardziej myśleć nie chce.
[Think different]!
Go to the top of the page
+Quote Post
Crozin
post 28.03.2011, 17:49:32
Post #14





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


W każdym kodowaniu Unikode (czyli m.in. UTF-8) da się zapisać każdy znak Unikodu, a Unikod sam w sobie zawiera właściwie wszystkie znaki używane do komunikacji na Ziemii. Tak więc jakieś głupoty wypisujesz @InnoDB (pomijając fakt, że ledwo da się Ciebie zrozumieć).
Go to the top of the page
+Quote Post
Crozin
post 31.03.2011, 11:43:26
Post #15





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Proponuję się najpierw douczyć: http://en.wikipedia.org/wiki/Comparison_of_Unicode_encodings
Go to the top of the page
+Quote Post
everth
post 31.03.2011, 16:22:48
Post #16





Grupa: Zarejestrowani
Postów: 782
Pomógł: 153
Dołączył: 21.07.2010

Ostrzeżenie: (0%)
-----


@InnoDB
Z tego co pamiętam to tobie chodziło o sposób składowania jakiś wielojęzycznych wierszy (może mi się miesza, dużo tego przewija się na forum). W takim wypadku najsensowniej byłoby składować po stronie bazy jako UTF-16 a serwować przeglądarce jako UTF-8. Wszystko rozbija się o zajętość. W bazie i tak będziesz składował wszystkie wersje a można założyć że większość użytkowników będzie się posługiwać alfabetem łacińskim lub pochodnymi - więc zaoszczędzisz trochę na łączu.


--------------------
Już mi się ani wiedzieć, ani tym bardziej myśleć nie chce.
[Think different]!
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.07.2025 - 10:34