2012-09-16 8 views
15

mam (w bazie danych SQLite) następujący ciąg:PHP: Czy można poprawnie PODSTAWOWAĆ ciąg znaków UTF-8?

Лампа в вытяжке на кухне меняется, начиная с вытаскивания белого штырька справа.

Łańcuch jest prawidłowo wykazane przez PHP przy użyciu print. Chciałbym uzyskać tylko pierwszych 50 znaków tego łańcucha, tj.

Лампа в вытяжке на кухне меняется, начиная с вытас.

Próbowałem, używając zarówno substr i mb_substr i uzyskać

Лампа в вытяжке на кухне ме�, to tylko 28 znaków.

Po przeczytaniu tutaj i gdzie indziej na temat problemów z mbstringiem, zdaję sobie sprawę, że jest to właściwie 50-bajtowy ciąg znaków (22 rosyjskie znaki = 44 bajty plus 5 spacji plus 1 symbol pytania).

Czy jest jakieś dobre rozwiązanie tego problemu? Wszystkie moje ciągi są UTF-8, więc mogłem oczywiście zaprogramować funkcję substr-siebie, sprawdzając pierwszy bit każdego bajtu itp. Ale to powinno być zrobione wcześniej, prawda?

AKTUALIZACJA: Uważam, że mb_substr nie działa poprawnie, ponieważ mb_detect_encoding()does not work properly.

+10

Mówisz, że próbowałeś 'mb_substr', ale czy próbowałeś podać kodowanie? Czy na przykład 'mb_substr ($ string, 0, 10," UTF-8 ")' działa? – h2ooooooo

+5

Upewnij się, że przekazałeś właściwe kodowanie do 'mb_substr' -' mb_substr ($ input, 0, 50, 'UTF-8') 'działa dla mnie,' mb_substr ($ input, 0, 50) 'nie działa. – DCoder

+0

@ h2ooooooo: Nie, przegapiłem to w instrukcji. I tak. Dodaj komentarz jako odpowiedź, zaakceptuję to. – texnic

Odpowiedz

7

Jak zwykle wygląda na to, że odpowiedź pojawiła się tutaj. (Szczerze mówiąc, mam poszukiwanej przez około godzinę)

Odpowiedź na (鉑) string functions and UTF8 in php brzmi:

Upewnij się, że ustawienie odpowiedniego kodowania wewnętrznego: mb_internal_encoding ('utf-8');

Tym mb_internal_encoding ("utf-8"); wszystko działa dobrze. Przepraszam, że przeszkadzam wam, dzięki za pomoc.

+2

Jak wspomniano w moim komentarzu do OP, jestem pewien, że 'mb_substr ($ string, 0, 50," UTF-8 ")' również by działało, ale cieszę się, że znalazłeś swoje rozwiązanie (i hej , jest znacznie lepszym rozwiązaniem, jeśli używasz 'mb_substr' w wielu różnych miejscach!) – h2ooooooo

16

Poniżej URL:

Wyodrębnianie podciągu z UTF-8 string w PHP

http://osc.co.cr/extracting-a-substring-from-a-utf-8-string-in-php/

PHP podciąg z UTF-8

http://greekgeekz.blogspot.in/2010/11/php-substring-with-utf-8.html

Lub spróbuj go:

Przykład # 1

$str1 = utf8_encode("Feliz día"); 

$str2 = substr($str1, 0, 9); 

echo utf8_decode($str2); 

// will output Feliz d� 

Przykład # 2

$str3 = mb_substr($str1, 0, 9, 'UTF-8'); 

echo utf8_decode($str3); 

// will output Feliz dí 

Od PHP> = 5,3 można również zadeklarować dyrektywę kodowania i użyj funkcja substr

Przykład # 3

declare(encoding='UTF-8'); 

$str4 = "Feliz día"; 

$str5 = substr($str4, 0, 9);echo $str5; 


// will output Feliz dí 
+2

Chociaż wszystko działa, najbardziej podoba mi się przykład nr 3: lepiej użyć jednej funkcji. Jednakże instrukcja 'declare' mówi:" Deklaracja wartości deklaracji jest ignorowana w PHP 5.3, chyba że php jest skompilowany z --enable-zend-multibyte. Uwaga: PHP nie ujawnia, czy do kompilacji PHP użyto opcji -enable-zend-multibyte. inne niż przez phpinfo(). " Sądzę, że na razie będę się trzymał funkcji mb_. – texnic

3

Spróbuj mb_strcut().
Jego zachowanie jest takie samo jak substr(), z tym że nie pozostawia ostatniego znaku do zerwania.
Jeśli na pozycji, którą próbujesz wyciąć, masz znak wielobajtowy z 2 lub więcej bajtami, mb_strcut() nie będzie przecinał postaci na kawałki, ale zignoruje tę postać.

Na przykład, jeśli starają się wyciąć 50 bajtów OUT ciąg Лампа в вытяжке на кухне меняется, начиная с вытаскивания белого штырька справа., mb_strcut() nie będzie wyciąć postać н w połowie, ale wyeliminuje go z wyniku.

$str = "Лампа в вытяжке на кухне меняется, начиная с вытаскивания белого штырька справа."; 

echo mb_strcut($str, 0, 50); 
// Prints: Лампа в вытяжке на кухне ме 

echo substr($str, 0, 50); 
// Prints: Лампа в вытяжке на кухне ме� 

echo mb_substr($str, 0, 50); 
// Prints: Лампа в вытяжке на кухне меняется, начиная с вытас 

Mam nadzieję, że to pomaga.

Powiązane problemy