2009-12-29 6 views
24

quando uso substr() ho un carattere strano alla finesubstr funzione PHP) errore (

$articleText = substr($articleText,0,500); 

Ho una potenza di 500 caratteri e < -

Come posso risolvere questo problema? È un problema di codifica? La mia lingua è greca.

+0

hanno visto la stessa cosa in (UK) Inglese . – alimack

risposta

56

substr sta contando utilizzando byte e non caratteri.

greco significa probabilmente che si sta utilizzando una codifica multi-byte, come UTF-8, e il conteggio per byte non è abbastanza buono per quelli.

Forse l'utilizzo di mb_substr potrebbe aiutare, qui: le funzioni mb_* sono state create appositamente per codifiche multibyte.

+4

Imparare sempre di più ogni singolo giorno ... Grazie StackOverflow! –

+1

Grazie mille. Ma per me la cosa principale è aggiungere 'mb_internal_encoding (" UTF-8 ");' prima di usare le funzioni 'mb_ *'. Senza aggiungerlo vedo ancora i quadrati. – ivkremer

+0

@Kremchik Non vedrai i quadrati, se usi 'mb_substr ($ short, 0, 75, 'utf-8')'. Quindi non è necessario usare 'mb_internal_encoding' prima di' mb_substr'. – trejder

6

Sembra che stiate tagliando un personaggio unicode a metà lì. Utilizzare mb_substr invece per l'affettamento delle stringhe unicode-safe.

+1

... con la chiamata 'mb_internal_encoding ('utf-8')' prima o con l'uso di '' utf-8'' come quarto parametro di 'mb_substr'. Doc dice che è opzionale e quando viene omesso, verrà usato il valore di codifica dei caratteri interni, ma il pensiero è (spiegato da qualche altra parte in PHP doc), che la "codifica interna" di PHP in quasi sempre "qualcos'altro" rispetto al tuo codifica della pagina. Quindi, per affettare la stringa UTF8, diventa necessario questo quarto parametro o chiamare 'mb_internal_encoding ('utf-8')'. – trejder

19

Usa mb_substr invece, è in grado di affrontare con più codifiche, non solo le stringhe di byte singolo come substr:

$articleText = mb_substr($articleText,0,500,'UTF-8'); 
+2

La parte "UTF-8" era importante per me - non dimenticarlo fa capolino! – JoeRocc

+1

"UTF-8" come parametro opzionale ha funzionato per me. Tieni presente che potresti anche voler usare mb_strlen() se stai usando la lunghezza della stringa per determinare se deve essere tagliata. –

+2

Un'alternativa è usare 'mb_internal_encoding ('utf-8')' prima di qualsiasi comando 'mb_ *'. – trejder

0

ms_substr() funziona anche in modo eccellente per la rimozione strana linea di trascinamento rompe pure, che mi stava avendo problemi con dopo aver analizzato il codice html. Il problema non è stata gestita da:

trim() 

o:

var_dump(preg_match('/^\n|\n$/', $variable)); 

o:

str_replace (array('\r\n', '\n', '\r'), ' ', $text) 

non si cattura.

1

Soluzione alternativa per stringhe con codifica UTF-8 - questo convertirà UTF-8 in caratteri prima di tagliare la sottostringa.

$articleText = substr(utf8_decode($articleText),0,500); 

per ottenere la stringa articleText torna a UTF-8, sarà necessario un intervento in più:

$articleText = utf8_encode(substr(utf8_decode($articleText),0,500)); 
1

uso questa funzione, Ha funzionato per me

function substr_unicode($str, $s, $l = null) { 
    return join("", array_slice(
     preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY), $s, $l)); 
} 

Credits: http://php.net/manual/en/function.mb-substr.php#107698

+0

Utilizzare i collegamenti posteriori per favore, c/p non è un atto appropriato per rispondere a una domanda .. –

0

Si sta tentando di tagliare unicode character.So ho preferito invece di substr() prova mb_substr() in php.

substr()

substr (string $string , int $start [, int $length ]) 

mb_substr()

mb_substr (string $str , int $start [, int $length [, string $encoding ]]) 

Per ulteriori informazioni per substr() - Credits => Check Here