Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Kodowanie PHP -> MySQL
spokz
post 18.12.2007, 19:47:06
Post #1





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

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


Witam.

Moje ustawienia to:
- w pliku .php: content="text/html; charset=utf-8"
- na serwerze mysql:
-- metoda porównywania napisów: wszędzie utf8_general_ci.

Dopisałem przed INSERT'em linijki z set character set utf8 i wydaje się, że działa.

Problem pojawia się tylko przy wprowadzeniu wszystkich polskich znaków w ciągu, czyli: ęóąśłżźćń. strlen() pokazuje wówczas 18 znaków a jest 9. Dziwna sprawa, spotkał się ktoś z tym?

Doszedłem do wniosku, że coś jest nie tak z literą "ń".
Jeden znak "ń" jest widziany jako 2 znaki. Czyli "ńńń" w strlen() zwraca 6. A przy zastosowaniu go przy ciągu znaków "ęóąśłżźćń" powoduje iż system widzi ten ciąg jako 18 znaków. Przy ciągu "ąąąąń" wychodzi 10 znaków. Co dziwne, przy zastosowaniu ograniczenia:
  1. <?php
  2. if (strlen($ciag) < 6) { echo "ciąg znaków musi mieć minimum 6 znaków"; }
  3. ?>

przed INSERT'em do bazy i wprowadzeniu "ńńń" jako $ciag, fukcja if zwraca false i INSERT wchodzi bo system widzi "ńńń" jako 6 znaków...

Przy pominięciu "ń" też coś jest nie tak bo ciąg znaków "ęóąśłżźć" odczytany jest przez strlen() jako 16 znaków.

Ma ktoś jakiś pomysł co to może być?

Ten post edytował spokz 18.12.2007, 19:42:28
Go to the top of the page
+Quote Post
Indeo
post 18.12.2007, 22:39:41
Post #2





Grupa: Zarejestrowani
Postów: 295
Pomógł: 7
Dołączył: 26.03.2004
Skąd: Opole

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


Ogonki w UTF'ie są kodowane 2bajtowo, zwykłe znaki 1 bajtowo. Nie wiem co ma do tego mysql, bo w sumie nic o bazach danych nie piszesz. Z drugiej strony ciekawy problem. Zazwyczaj walka toczy się o prawidłowe wyświetlanie polskich znaków na stronie, czasem o problemy z sortowaniem polskich znaków lub ich porównywaniem, ale długości nie mierzyłem :) . Jednak całkiem możliwe, że tekst w kodowaniu utf8 zwracany z mysql po rozłożeniu na poszczególne znaki może mieć większą długość niż by to wynikało z polskiego alfabetu.


--------------------
Go to the top of the page
+Quote Post
c2h5oh
post 19.12.2007, 01:51:13
Post #3





Grupa: Zarejestrowani
Postów: 29
Pomógł: 1
Dołączył: 6.10.2006

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


strlen zwraca bajty - do utf8 używaj mb_strlen (jeśli masz mbstringa) lub strlen(utf8_decode($zmienna)) jeśli mbstringa nie masz.
Jak chcesz mieć pewność, że zadziała wrzuć sobie
Kod
function mb_strlen($t, $encoding = 'UTF-8')
    {
        if (function_exists('mb_strlen'))
        {
            return mb_strlen($t, $encoding);
        }
        else
        {
            return strlen(utf8_decode($t));
        }
    }
Go to the top of the page
+Quote Post
spokz
post 19.12.2007, 12:20:57
Post #4





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

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


Dzięki za pomoc. strlen(utf8_decode($zmienna)) działa bardzo dobrze smile.gif
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: 26.06.2025 - 11:12