2012-09-16 9 views
15

Ho (in un database SQLite) la seguente stringa:PHP: È possibile SUBSTR correttamente una stringa UTF-8?

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

La stringa viene correttamente visualizzato da PHP utilizzando print. Vorrei ottenere solo i primi 50 caratteri di questa stringa, ovvero

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

Ho provato con sia il substr e mb_substr, e ottenere

Лампа в вытяжке на кухне ме�, cioè solo 28 caratteri.

Dopo aver letto qui e altrove i problemi di mbstring, mi rendo conto che questa è in realtà una stringa da 50 byte (22 caratteri russi = 44 byte più 5 spazi più 1 simbolo domanda).

C'è qualche buona soluzione a questo? Tutte le mie stringhe sono UTF-8, quindi potrei ovviamente programmare io stesso una sottostringa, controllando il primo bit di ogni byte ecc. Ma questo dovrebbe sicuramente essere stato fatto prima, giusto?

AGGIORNAMENTO: Credo che mb_substr non funzioni correttamente perché mb_detect_encoding()does not work properly.

+10

Si dice di aver provato 'mb_substr', ma si è tentato di specificare la codifica? Ad esempio, 'mb_substr ($ stringa, 0, 10," UTF-8 ")' funziona? – h2ooooooo

+5

Assicurati di passare la codifica corretta a 'mb_substr' -' mb_substr ($ input, 0, 50, 'UTF-8') 'funziona per me,' mb_substr ($ input, 0, 50) 'no. – DCoder

+0

@ h2ooooooo: non ce l'ho, l'ho perso nel manuale. E lo fa. Per favore aggiungi il tuo commento come risposta, lo accetterò. – texnic

risposta

7

Come al solito, la risposta sembra essere stata qui. (Onestamente, ho cercato per circa un'ora)

Una risposta a (鉑) string functions and UTF8 in php legge:

Assicurarsi di impostare la codifica interna corretta: mb_internal_encoding ('utf-8');

Con questo mb_internal_encoding ('utf-8'); tutto funziona bene. Mi dispiace disturbarti ragazzi, grazie per l'aiuto.

+2

Come menzionato nel mio commento sull'OP, sono sicuro che 'mb_substr ($ string, 0, 50," UTF-8 ")' avrebbe funzionato anche, ma sono felice che tu abbia trovato la tua soluzione (ed ehi , è una soluzione molto migliore se usi 'mb_substr' in molti posti diversi!) – h2ooooooo

1

Is mb_substr() non funziona per voi?

+0

L'ho provato, non funziona. Vedi il mio post per favore. – texnic

16

Vedere sotto URL:

Estrazione di una sottostringa da una stringa UTF-8 in PHP

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

PHP stringa con UTF-8

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

O provare:

Esempio # 1

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

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

echo utf8_decode($str2); 

// will output Feliz d� 

Esempio # 2

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

echo utf8_decode($str3); 

// will output Feliz dí 

Dal PHP> = 5.3 si può anche dichiarare la direttiva codifica e utilizzare il sub function

Esempio # 3

declare(encoding='UTF-8'); 

$str4 = "Feliz día"; 

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


// will output Feliz dí 
+2

Anche se tutto funziona, mi piace l'esempio n. 3 soprattutto: è meglio usare una singola funzione. Tuttavia, il comando 'declare' dice:" Il valore di decodifica della codifica viene ignorato in PHP 5.3 a meno che php non sia compilato con --enable-zend-multibyte. Si noti che PHP non espone se --enable-zend-multibyte è stato usato per compilare PHP diverso da phpinfo(). " Credo, per ora mi limiterò alle funzioni mb_. – texnic

3

Prova mb_strcut().
Il suo comportamento è uguale a substr(), tranne che non lascia l'ultimo carattere da interrompere.
Se nella posizione che si sta tentando di tagliare, disporre di un carattere multibyte con 2 o più byte, mb_strcut() non taglierà il carattere in pezzi, ma ignorerà questo carattere.

Ad esempio, se la stanno cercando di tagliare 50 byte dalla stringa Лампа в вытяжке на кухне меняется, начиная с вытаскивания белого штырька справа., mb_strcut() sarà non tagliare il carattere н a metà, ma eliminerà dal risultato.

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

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

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

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

Spero che sia d'aiuto.