[php] Kodowanie znaków |
[php] Kodowanie znaków |
6.01.2008, 12:27:42
Post
#1
|
|
Grupa: Zarejestrowani Postów: 21 Pomógł: 0 Dołączył: 3.05.2007 Ostrzeżenie: (0%) |
Witam.
Mam formularz do którego wpisywane są dane i przesyłane do tablicy POST. Później text ten jest poddawany specjalnej obróbce i wsadzany do bazy danych. Jednak zanim nastąpi to ostatnie należy dostosować kodowanie znaków do UTF-8 (takie mam ustawione w bazie). Zmiana kodowania nie była by problemem gdyby było znane kodowanie wejściowe. I moje pytanie jest jak sprawdzić w jakim systemie jest zakodowany dany ciag znaków? Użytkownik tegoż formularza może wprowadzać tekst w przeróżnych systemach (nie znanych podczas wprowadzania - bo np. tekst może zostać skopiowany z jakiejś zagranicznej strony i kodowanie nie jest już takie same jak na mojej stronie w formularzu), a ja chce je wszystkie mieć w UTF-8. Jak dokonać takiej konwersji? Niestety biblioteka z funkcjami iconv()" title="Zobacz w manualu PHP" target="_manual i mb_detect_encoding()" title="Zobacz w manualu PHP" target="_manual nie jest zainstalowana na serwerze |
|
|
6.01.2008, 18:34:24
Post
#2
|
|
Grupa: Zarejestrowani Postów: 233 Pomógł: 9 Dołączył: 3.06.2007 Ostrzeżenie: (0%) |
generalnie z tego co widzę jeśli masz formularz w jakimś kodowaniu (w tym wypadku UTF-8) i skopiujesz do niego jakąś zawartość to przeglądarka zadba o to żeby doszło to do Ciebie już w UTF
(z tym że przeglądarka wie z nagłówków strony jakie kodowanie miała i jakie ma dostarczyć) ja wziąłem swoją stronkę w UTF i wpisałem coś z jakieś francuskiej strony z ISO-8859-1 i nie pokazały mi się szlaczki przeglądarka o to zadba gdy w kodowaniu z Twojej strony będą odpowiednie znaczki... co do samego wykrywania kodowania na podstawie tekstu..., funkcja którą podałeś mb_detect_encoding" title="Zobacz w manualu PHP" target="_manual, jako parametr przyjmuję listę języków, aby wiedzieć co najpierw za kodowanie ma wypluć... stąd wniosek że one magicznie nie stwierdzą Ci co to było za kodowanie z całą pewnością więc tak naprawdę wiesz niewiele o ISO wiesz że znaki od 7F do 9F są nieużywane... więc jeśli pojawi Ci się jakiś znak o kodzie w tym zakresie to wiesz że to nie iso... ale rozpoznać kodowań ISO między sobą już właściwie nie masz szans... musiałbyć mieć słowniki różnych języków i sprawdzać czy kolejne słowa tekstu się w nim znajdują (mając przy tym nadzieje że ludzie piszą bez błędów ortograficznych) ogólnie moim zdaniem nie ma tutaj zbyt wiele pola do popisu |
|
|
7.01.2008, 15:13:07
Post
#3
|
|
Grupa: Zarejestrowani Postów: 21 Pomógł: 0 Dołączył: 3.05.2007 Ostrzeżenie: (0%) |
no własnie tutaj jest problem... bo u mnie jest tak ze mam stronkę w utf-8... Plik strony też jest zapisany (z notatnika) w kodowaniu utf-8 i wszystko wyświetla się ok. i jak wkleje jaki kolwiek tekst z polskimi znakami do formularza to pokazują mi się kwadraciki...
Przed chwilką zauważyłem że jak wyłączę funkcję preg_match" title="Zobacz w manualu PHP" target="_manual i strtoupper" title="Zobacz w manualu PHP" target="_manual które operuja tym tekstem to znaki polskie wyświetlają się poprawnie... Co moze być nie tak??:| |
|
|
7.01.2008, 18:47:07
Post
#4
|
|
Grupa: Zarejestrowani Postów: 233 Pomógł: 9 Dołączył: 3.06.2007 Ostrzeżenie: (0%) |
zauważ że jest funkcja: mb_strtoupper" title="Zobacz w manualu PHP" target="_manual która jako drugi parametr przyjmuję kodowanie... czyli prawdopodobnie strtoupper nie jest pod tym względem zbyt bezpieczne...
[m]preg_match[\m] zasadniczo nie zmienia zawatości stringa, sprawdza ona tylko zgodność w regexp i wyszukuję ew. podciągów... więc ze zmianą zawartości ma raczej niewiele wspólnego... ale dla pewności sprawdź co będzie gdy preg_match wyłączysz a strtoupper zostawisz i na odwrót... prawdopodobnie musisz użyć [m]mb_strtoupper[\m], ale ponieważ z tego co mówiłeś to nie masz tej funkcji (ani cąłej biblioteki)... no to jakiś odpowiednik musisz zaimplementować |
|
|
7.01.2008, 18:55:29
Post
#5
|
|
Grupa: Zarejestrowani Postów: 21 Pomógł: 0 Dołączył: 3.05.2007 Ostrzeżenie: (0%) |
już mam włączoną biblioteke mbstring... no i z strtoupper masz racje... w przypadku mb_strtoupper nie ma juz tego problemu... Niestety problem pozostaje nadal z preg_match.
funkcja ta ma usuwać ewentualne znaki interpunkcyjne i inne które nie są literami. No i jeśli użyje wyrażenia [:punct:] to wtedy usuwa znaki ale mi się wykrzacza... jeśli użyje zamiast tego to [,./;:`~] itd wtedy jest wszystko ok. Jednak nie zabezpiecza mnie to przed wszystkimi możliwymi znakami interpunkcyjnymi których nie mam na klawiaturze. Jak sobie z tym poradzić?? A teraz taki offtopic. Dlaczego jeśli używam funkcji strlen to długosć ciągu z polskim znakiem dialektycznym jest zawsze o 1 większa?? :| Ten post edytował coder() 7.01.2008, 18:57:33 |
|
|
7.01.2008, 19:15:48
Post
#6
|
|
Grupa: Zarejestrowani Postów: 233 Pomógł: 9 Dołączył: 3.06.2007 Ostrzeżenie: (0%) |
nie bardzo wiem co wykombinowałeś w kodzie z tego co wiem preg_match nie ma prawa zmienić stringa...
może używasz preg_replace... jak sobie poradzić: w wyrażeniach regularnych masz możliwość podawania kodów w zapisie hex danych znaków... możesz je wypisać w ten sposób... doczytaj w dokumentacji regexp zalinkowanej w dokumentacji PHP co do offtopica to nie odrobiłeś zadania domowego... bo jest również mb_strlen... o której nie przeczytałeś... UTF ma pewną swoją składnie... i często składa się z 2 bajtów które są interpretowane jako 1 znak strlen nie wnika w kodowanie i widzi tylko pojedyncze znaki... PS. odrób lekcje: wiki -> UTF, manual PHP, dokumentacja regexp Ten post edytował zimi 7.01.2008, 19:17:10 |
|
|
7.01.2008, 21:17:55
Post
#7
|
|
Grupa: Zarejestrowani Postów: 21 Pomógł: 0 Dołączył: 3.05.2007 Ostrzeżenie: (0%) |
ok Dzięki za pomoc Temat uważam za zamknięty
|
|
|
Wersja Lo-Fi | Aktualny czas: 3.06.2024 - 20:38 |