2013-03-11 13 views
5

Ho un sito web wordpress.PHP: strlen restituisce la lunghezza del carattere anziché la lunghezza del byte

ho creato modello di pagina semplice come:

<?php 
/** 
* Template Name: Test 
*/ 

echo strlen('Привет'); 

?> 

Poi ho creato una pagina utilizzando questo modello. La pagina mostra la lunghezza della stringa russa 'Привет' (significa 'Ciao'). Mi aspetto di vedere 12, poiché la stringa russa con codifica UTF-8 composta da 6 caratteri dovrebbe avere una dimensione di 12 byte, ma io invece ne ottengo 6.

Ho provato la stessa cosa su un altro server e ho avuto il valore corretto - 12. Quindi penso che il motivo sia la configurazione del mio server. Ho wp 3.2.1 (ho avuto lo stesso problema dopo l'aggiornamento a wp 3.5.1) e PHP 5.3.3.

Attualmente ho trascorso circa 5 giorni cercando di trovare una soluzione, ma non ho fortuna. Qualcuno sa qual è la ragione di tale comportamento?

+0

possibile duplicato di [Come ottengo i valori di byte di una stringa in PHP?] (http://stackoverflow.com/questions/591446/how-do-i- get-the-byte-values-of-a-string-in-php) – Neal

+0

@Neal - questa domanda non ha niente a che fare con ord() –

risposta

0

È necessario utilizzare le funzioni di stringa multibyte per questo? Ad esempio http://www.php.net/manual/en/function.mb-strlen.php

+1

Sembra che l'OP * voglia * il numero di byte (non il numero di caratteri), che è ciò che ['strlen'] (http://php.net/manual/en/function.strlen.php) è in realtà supposto ritornare. –

+0

il problema è che non uso mb_strlen. So che mb_strlen mostrerà 6 nel mio caso, ma perché strlen farlo ... non lo so ... – Vasiliy

7

Verificare l'impostazione mbstring.func_overload in php.ini. Questa opzione consente a PHP di sovrascrivere la funzione strlen() con mb_strlen() (e similmente per altri equivalenti). Questo potrebbe spiegare la discrepanza tra i server

EDIT

Citando dal link doc:

Per utilizzare l'overloading di funzioni, impostare mbstring.func_overload in php.ini per un valore positivo che rappresenta una combinazione di maschere di bit che specifica le categorie di funzioni da sovraccaricare. Dovrebbe essere impostato su 1 su per sovraccaricare la funzione mail(). 2 per le funzioni di stringa, 4 per le funzioni di espressione regolari . Ad esempio, se è impostato su 7, le stringhe di posta elettronica e le funzioni di espressioni regolari verranno sovraccaricate.

Quindi un valore con il set 2 bit significa che le funzioni di stringa di base saranno sovraccaricati con la loro mbstring equivalente, ma non posta o funzioni di espressioni regolari; se si desidera il comportamento normal, questo dovrebbe essere 0

+0

Questo è il corretto (e [* documentato *] (http://php.net/manual/ en/mbstring.overload.php)) risposta. –

+0

Grazie Jeremy, ho appena aggiunto il riferimento dei documenti alla risposta –

+0

ho mbstring.func_overload = "2". Quale dovrebbe essere il valore corretto per me? – Vasiliy