2012-09-16 13 views
15

Ich habe (in einer SQLite-Datenbank) die folgende Zeichenfolge:PHP: Ist es möglich, eine UTF-8-Zeichenfolge korrekt SUBSTR?

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

Die Zeichenfolge richtig von PHP print gezeigt. Ich möchte nur die ersten 50 Zeichen dieser Saite erhalten, d. H.

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

Ich habe versucht, sowohl die substr mit und mb_substr und

Лампа в вытяжке на кухне ме�, das heißt nur 28 Zeichen erhalten.

Nachdem ich hier und anderswo über die Probleme von mbstring gelesen habe, merke ich, dass dies tatsächlich eine 50-Byte-Zeichenfolge (22 russische Zeichen = 44 Bytes plus 5 Leerzeichen plus 1 Fragezeichen) ist.

Gibt es eine nette Lösung? Alle meine Strings sind UTF-8, also könnte ich natürlich selbst eine Teilstr-Funktion programmieren, indem ich das erste Bit jedes Bytes etc. überprüfe. Aber das hätte vorher sicher geschehen sollen, oder?

UPDATE: Ich glaube, mb_substr funktioniert nicht richtig, weil mb_detect_encoding()does not work properly.

+10

Sie sagen, dass Sie "mb_substr" versucht haben, aber haben Sie versucht, die Codierung zu spezifizieren? Funktioniert 'mb_substr ($ string, 0, 10," UTF-8 ")' zum Beispiel? – h2ooooooo

+5

Stellen Sie sicher, dass Sie die richtige Kodierung an 'mb_substr' übergeben -' mb_substr ($ input, 0, 50, 'UTF-8') 'funktioniert für mich,' mb_substr ($ input, 0, 50) 'nicht. – DCoder

+0

@ h2ooooooo: Ich habe nicht, ich habe es im Handbuch verpasst. Und es tut es. Bitte füge deinen Kommentar als Antwort hinzu, ich akzeptiere es. – texnic

Antwort

7

Wie üblich scheint die Antwort hier zu sein. (Ehrlich gesagt, ich habe etwa eine Stunde lang gesucht)

Eine Antwort auf (鉑) string functions and UTF8 in php lautet:

Stellen Sie sicher, die richtige interne Codierung gesetzt: mb_internal_encoding ('utf-8');

Mit diesem mb_internal_encoding ('utf-8'); alles funktioniert gut. Entschuldigen Sie die Störung, danke für die Hilfe.

+2

Wie in meinem Kommentar zum OP erwähnt, bin ich sicher, dass 'mb_substr ($ string, 0, 50," UTF-8 ") auch funktioniert hätte, aber ich bin froh, dass du deine Lösung gefunden hast (und hey es ist eine viel bessere Lösung, wenn Sie "mb_substr" viele verschiedene Orte verwenden!) – h2ooooooo

1

Funktioniert mb_substr() nicht für Sie?

+0

Ich habe es versucht, es funktioniert nicht. Sehen Sie meinen Beitrag bitte. – texnic

16

Siehe unten URL:

einen Teils aus einem UTF-8-String in PHP

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

PHP String mit UTF-8

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

Oder versuchen Sie es:

Beispiel # 1

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

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

echo utf8_decode($str2); 

// will output Feliz d� 

Beispiel # 2

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

echo utf8_decode($str3); 

// will output Feliz dí 

Ab PHP> = 5.3 können Sie auch die Codierung Richtlinie erklären und die Verwendung Teilfunktion

Beispiel # 3

declare(encoding='UTF-8'); 

$str4 = "Feliz día"; 

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


// will output Feliz dí 
+2

Obwohl alles funktioniert, mag ich am meisten Beispiel Nr. 3: Es ist besser, eine einzige Funktion zu verwenden. Das 'declare'-Handbuch sagt jedoch:" Der Kodierungsdeklarationswert wird in PHP 5.3 ignoriert, es sei denn, PHP wird mit --enable-zend-multibyte kompiliert. Beachten Sie, dass PHP nicht angibt, ob --enable-zend-multibyte zum Kompilieren von PHP verwendet wurde anders als von phpinfo(). " Ich glaube, ich bleibe für mb_ Funktionen für jetzt. – texnic

3

Versuchen mb_strcut().
Sein Verhalten ist dasselbe wie substr(), außer dass das letzte Zeichen nicht unterbrochen wird.
Wenn an der Position, die Sie ausschneiden möchten, ein Multibyte-Zeichen mit 2 oder mehr Bytes hat, wird mb_strcut() das Zeichen nicht in Stücke schneiden, sondern dieses Zeichen ignorieren.

Zum Beispiel, wenn Ihr versuchen, 50 Bytes, ausgeschnitten aus dem String Лампа в вытяжке на кухне меняется, начиная с вытаскивания белого штырька справа., mb_strcut() wird den Charakter н in Hälfte geschnitten, aber es wird aus dem Ergebnis zu beseitigen.

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

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

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

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

Ich hoffe, es hilft.