![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 253 Pomógł: 1 Dołączył: 26.08.2009 Skąd: Szczecin Ostrzeżenie: (10%) ![]() ![]() |
Mam dosyć dziwny problem z kodowaniem między stroną, a bazą danych MySQL. W bazie mam zapisane dwa rekordy: nazwa i skrót. Nazwa jest podawana przez użytkownika, a skrót jest generowany automatycznie przez skrypt (pobiera on pierwsze trzy znaki i sprawdza, czy taki skrót istnieje - jeśli tak to dopisuje cyfrę).
Wszystko odbywa się przy pomocy zwykłego formularza. Po wysłaniu i wygenerowaniu skutu pojawia się potwierdzenie zawierające nazwę i wygenerowany skrót. Potem jest to zapisywane do bazy i wyświetlana jest lista zwierająca nazwę i odpowiadający jej skrót. I tutaj pojawia się mój problem. Nazwa zawsze, jest poprawnie wyświetlana (zawiera polskie znaki), a skrót nie - zawsze ma znak zapytania w rombie zamiast polskich znaków. Sprawdzałem w bazie, i tam zarówno nazwa jak i skrót wpisują się z krzaczkami zamiast polskich liter, ale wszelkie sprawdzenia, porównania itp. dokonywane na bazie zawsze są poprawne. Jak już mówiłem, wyświetlanie nazwy na stronie jest zawsze poprawne - zawsze znaczy i w momencie wyświetlenia potwierdzenia jak i listy, dlatego to co się dzieje w bazie średnio mnie niepokoi bo wynik nazwy mam poprawny. Parę info dot. mojej strony i środowiska programistycznego, może to kogoś na coś naprowadzi: - używam systemu szablonów smarty ze zdefiniowanym kodowaniem utf-8 - na wszystkich stronach html jest zdefiniowany meta-tag kodowania utf-8 - pliki tpl są tworzone w notepad++ z kodowaniem utf-8 - piszę w NetBeans, który ma odgórne kodowanie plików utf-8 Tak więc już nie wiem co jest nie tak, z tym skrótem, a przyznaje, że jest to rzecz, która mnie już bardzo irytuje. Może ktoś ma jakiś pomysł, jak ten problem rozwiązać? Jeśli coś jeszcze mam sprawdzić to napiszcie. |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 94 Pomógł: 31 Dołączył: 12.10.2008 Skąd: WAT Ostrzeżenie: (0%) ![]() ![]() |
To co jest wpisywane z poziomu formularza musi być tak samo zinterpretowane w drugą stronę. Ale skoro przy wysyłaniu z kodu coś nie tak to gdzieś tego utf-8 brakuje... A przy połączeniu z bazą danych masz ustalanie kodowania?
Tylko jak będziesz sprawdzał to wrzuć najpierw kilka rekordów bo to ma wpływ też na inserty. |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 1 729 Pomógł: 346 Dołączył: 4.04.2009 Ostrzeżenie: (0%) ![]() ![]() |
A jak skracasz, znając życie używasz substr zamiast mb_substr
|
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 116 Pomógł: 29 Dołączył: 13.12.2010 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Zaraz po mysql_connect:
Odsyłam do tego tematu: Temat: MYSQL Polskie znaki //Edit: Poprawiony link, dzięki @toaspzoo Ten post edytował morbic 17.07.2011, 21:07:36 |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 778 Pomógł: 84 Dołączył: 29.07.2010 Skąd: Gliwice / Pławniowice Mistrz niezmordowanej klawiatury. Ostrzeżenie: (20%) ![]() ![]() |
php header
<meta ... Zaraz po mysql_connect: <!--Geshi:283079:php--><pre class="php-brief" style="font-family:monospace;"><div class="head">[PHP] 110402 Pusto ! |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 253 Pomógł: 1 Dołączył: 26.08.2009 Skąd: Szczecin Ostrzeżenie: (10%) ![]() ![]() |
@lobopol: nie używam żadnej funkcji wbudowanej, tylko traktuje napis jako tabelę znaków.
@YaQzi, @morbic: Wkleiłem to mysql_query('SET NAMES') zarówno utf8 jak i iso-8859-2 i jak wpisuję utf-8 to wyświetla mi te same krzaczki co mam w bazie - zarówno na nazwie jak i na skrócie, jak wpisałem iso-8859-2 to nazwa jest ok, a skrot tak jak był. @toaspzoo: sory, ale nie rozumiem o co Ci chodzi. |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 778 Pomógł: 84 Dołączył: 29.07.2010 Skąd: Gliwice / Pławniowice Mistrz niezmordowanej klawiatury. Ostrzeżenie: (20%) ![]() ![]() |
@lobopol: nie używam żadnej funkcji wbudowanej, tylko traktuje napis jako tabelę znaków. @YaQzi, @morbic: Wkleiłem to mysql_query('SET NAMES') zarówno utf8 jak i iso-8859-2 i jak wpisuję utf-8 to wyświetla mi te same krzaczki co mam w bazie - zarówno na nazwie jak i na skrócie, jak wpisałem iso-8859-2 to nazwa jest ok, a skrot tak jak był. @toaspzoo: sory, ale nie rozumiem o co Ci chodzi. Pozwolę sobie napisać kolorem czerwonym - LINK NIEPRAWIDŁOWY! |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 94 Pomógł: 31 Dołączył: 12.10.2008 Skąd: WAT Ostrzeżenie: (0%) ![]() ![]() |
@YaQzi, @morbic: Wkleiłem to mysql_query('SET NAMES') zarówno utf8 jak i iso-8859-2 i jak wpisuję utf-8 to wyświetla mi te same krzaczki co mam w bazie - zarówno na nazwie jak i na skrócie, jak wpisałem iso-8859-2 to nazwa jest ok, a skrot tak jak był. Ale jak wstawiłeś 'SET NAMES' to dodałeś nowe rekordy czy sprawdzałeś na starych? Bo na starych będzie Ci cały czas bugować bo masz w dwóch kolumnach różne kodowanie. |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 778 Pomógł: 84 Dołączył: 29.07.2010 Skąd: Gliwice / Pławniowice Mistrz niezmordowanej klawiatury. Ostrzeżenie: (20%) ![]() ![]() |
Link morbic'a jest nieprawidłowy (IMG:style_emoticons/default/wink.gif)
|
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 1 729 Pomógł: 346 Dołączył: 4.04.2009 Ostrzeżenie: (0%) ![]() ![]() |
Link morbic'a jest nieprawidłowy (IMG:style_emoticons/default/wink.gif) Genialnie 4 raz już tego nie pisz. |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 253 Pomógł: 1 Dołączył: 26.08.2009 Skąd: Szczecin Ostrzeżenie: (10%) ![]() ![]() |
@toaspzoo: dzięki, już to sprawdziłem
@YaQzi: tak dodałem owe rekordy przy utf-8 i nadal to samo, a wręcz gorzej, bo obcina krzaki na wyświetlaniu. |
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 94 Pomógł: 31 Dołączył: 12.10.2008 Skąd: WAT Ostrzeżenie: (0%) ![]() ![]() |
Link morbic'a jest nieprawidłowy (IMG:style_emoticons/default/wink.gif) Zamiast marudzić na 3 posty to być poprawił. (IMG:style_emoticons/default/tongue.gif) Bo id tematu w linku jest. Link poprawiony. |
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 116 Pomógł: 29 Dołączył: 13.12.2010 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
A jakie kodowanie ma tabela i pola w niej?
|
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 253 Pomógł: 1 Dołączył: 26.08.2009 Skąd: Szczecin Ostrzeżenie: (10%) ![]() ![]() |
Poprawiłem już kodowanie tabeli i bazy przy pomocy instrukcji z tego artykułu o MySQL. Teraz w bazie nie mam już krzaczków, jak i na stronie przy wywołaniu. Jednak cały czas coś jest nie tak, a mianowicie ucina mi trzeci znak jeśli w skrócie pojawia się polski znak, lub pokazuje znak zapytania w rombie ( nie wiem jeszcze do końca od czego to zależy).
W czasie tworzenia skrótu, pierwszy znak przy pomocy funkcji strtolower jest zamieniany na małą literę, jednak jeśli jest to polski znak, to już ta funkcja nie chce go zmienić. Tak więc, niby coś się poprawiło, ale niedużo, bo nadal nie mam tego czego chciałem, tyle tylko, że teraz ładniej mi się wyświetla wszystko w bazie. Aha, zapomniałem dodać, że jak ręcznie dopiszę polski znak w tabeli to w podglądzie na stronie już się dobrze wyświetla. |
|
|
![]()
Post
#15
|
|
Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
A czytałeś, że funkcje stringowe działają kiepsko z polskimi znakami, ponieważ bazują na iso-8859-1, a nie iso-8859-2? Tutaj musisz używać funkcji uniwersalnych dla kodowań wielobajtowych, a więc tych z przedrostkiem mb_ lub zrobić sobie mapowanie przy konwersji.
|
|
|
![]()
Post
#16
|
|
Grupa: Zarejestrowani Postów: 253 Pomógł: 1 Dołączył: 26.08.2009 Skąd: Szczecin Ostrzeżenie: (10%) ![]() ![]() |
@thek:
No szczerze powiedziawszy, to przeczytałem to w manualu, ale nie do końca nie wiedziałem o co chodzi. Dzięki za info. Rzeczywiście wystarczyło zamienić ta funkcję, plus dokonać paru konwersji i tyle. Wielkie dzięki za to info. Teraz mam tylko jeszcze jedno pytanie dot. długości napisów. Jak już mówiłem, skrót wykonuję, traktując nazwę, jako tablicę znaków i pobieram trzy pierwsze znaki, a jeśli już taki skrót istnieje dopisuję jeszcze dwa - . i 1. Jeśli nadal istnieje dodaje 1 do ostatniego znaku i tak aż do skutku. Jednak, jeśli w napisie występuje polski znak, to zajmuje on dwie pozycje w tabeli. Czy może ktoś mi poradzić, jak to obejść, żeby można było zrobic tak jak napisałem, również na ciągach z polskimi znakami? |
|
|
![]()
Post
#17
|
|
Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Używaj wciąż funkcji mb_ to będziesz wiedział, bo istnieje także mb_strlen, która zlicza dobrze wyrazy z polskimi znakami, a do cięcia jest mb_substr teraz jedynie file_exist i jazda w stylu
oczywiście dopasować to musisz sam do swojego skryptu, ja tylkoCi w komentaarzach do kolejnych instrukcji napisałem na co zwrócić uwagę. z pętlą for( $i=1; ;$i++) musisz uważać. Dawno tego nie używałem i powinno działać w nieskończoność aż do instrukcji break, ale nie jestem pewien czy php przyjmował ten zapis z pominięciem czy w końcu sobie odpuścili (IMG:style_emoticons/default/smile.gif) Jeśli sypnie Ci tam błędem to daj dowolny warunek zawsze prawdziwy w miejsce pustki, czyli przykładowo for( $i=1; true; $i++) |
|
|
![]() ![]() |
![]() |
Aktualny czas: 24.09.2025 - 04:08 |