Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Kodowanie PHP -> MySQL
Forum PHP.pl > Forum > Bazy danych > MySQL
spokz
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ć?
Indeo
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.
c2h5oh
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));
        }
    }
spokz
Dzięki za pomoc. strlen(utf8_decode($zmienna)) działa bardzo dobrze smile.gif
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.
Invision Power Board © 2001-2025 Invision Power Services, Inc.