Mbstring e PHP devono essere utilizzati nello sviluppo di applicazioni Web
Byte e bit sono due unità per la memorizzazione di informazioni logiche. Un bit può essere pensato come un buco, che può essere riempito con uno dei due valori: 0 o 1.
Un byte è un raggruppamento di otto bit. In termini matematici, un byte è in grado di rappresentare 256 valori diversi (28).
Pensiamo a una lingua, diciamo inglese. Ha alcuni caratteri (a, b, c, … ecc.) che sono rappresentati in un computer da byte. Il numero totale di caratteri in inglese non è superiore a 256, quindi ogni carattere può essere rappresentato utilizzando una diversa sequenza di 8 bit.
Le stringhe sono semplicemente una raccolta di caratteri. Normalmente in PHP le operazioni sulle stringhe operano su stringhe di caratteri a byte singolo. Ad esempio: potresti voler confrontare le stringhe "Ciao" e "Ciao". Con strcmpr(), le due stringhe verranno confrontate assumendo che ogni carattere nella stringa occupi un byte.
Ma pensa a una lingua che ha più di 256 caratteri (ad esempio il giapponese), o quando vogliamo rappresentare caratteri di più lingue contemporaneamente. L’archiviazione di un byte per ogni carattere non è sufficiente. È qui che entra in gioco il concetto multibyte.
Una stringa di testo giapponese può far sì che la funzione strcmpr() restituisca un valore errato o indesiderato poiché il presupposto che un byte rappresenta un carattere non è più vero. Quando lavoriamo con stringhe codificate in più byte, la manipolazione di queste stringhe richiede funzioni speciali piuttosto che le comuni funzioni di stringhe a byte singolo. Per gestire le stringhe multi byte in PHP, mbstring fornisce le funzioni di stringa specifiche multi byte.
Comprendere UTF-8
UTF è l’acronimo di Unicode Transformation Format ed è un sistema di codifica che mira a rappresentare ogni carattere in ogni lingua in un set di caratteri. Esistono diverse versioni di UTF, alcune delle quali sono mostrate di seguito:
Formato di codifica | Descrizione |
UTF-1 | Compatibile con ISO-2022, obsoleto dallo standard Unicode. |
UTF-7 | Sistema di codifica a 7 bit, utilizzato principalmente nella posta elettronica ma non parte dello standard Unicode. |
UTF-8 | Sistema di codifica a 8 bit, larghezza variabile ed è compatibile con ASCII. |
UTF-EBCDIC | Sistema di codifica a 8 bit, larghezza variabile ed è compatibile con EBCDIC. |
UTF-16 | Sistema di codifica a 16 bit, larghezza variabile. |
UTF-32 | Sistema di codifica a 32 bit, larghezza fissa. |
Ci ritroviamo a utilizzare UTF-8 la maggior parte delle volte quando lavoriamo con testo multibyte, quindi concentriamoci su questo per un momento. UTF-8 codifica i caratteri in più byte utilizzando il seguente schema:
Quindi, come fa a sapere se un carattere è memorizzato in un byte o in più byte? Per questo guarda al bit più significativo del primo byte.
Codice | Significato |
0xxxxxxx | Un codice a byte singolo |
110xxxxxx | Un altro byte segue questo byte |
1110xxxx | Altri due byte seguono questo byte |
11110xxx | Altri tre byte seguono questo byte |
111110xx | Altri quattro byte seguono questo byte |
1111110x | Altri cinque byte seguono questo byte |
10xxxxxx | Continuazione del carattere multi byte |
Ogni byte continuato in una sequenza a più byte inizia quindi con 1 e 0 nei suoi due bit di ordine più elevato per fornire un modo per rilevare i dati corrotti.
Equivalenti multibyte di funzioni di stringa comuni
Per le funzioni di stringa comunemente utilizzate, come strlen(), strops() e substr(), esistono funzioni equivalenti multibyte. Dovresti usare le funzioni equivalenti quando lavori con stringhe multibyte.
Tabella 4: Funzioni stringa multi byte equivalenti a un byte
Byte singolo | Multibyte | Descrizione |
strlen() | mb_strlen() | Ottieni la lunghezza della stringa |
strpos() | mb_strpos() | Trova la posizione della prima occorrenza di una stringa in una stringa |
substr() | mb_substr() | Restituisce parte di una stringa |
strtolower() | mb_strtolower() | Crea una stringa minuscola |
strtoupper() | mb_strtoupper() | Rendi una stringa maiuscola |
substr_count() | mb_substr_count() | Contare il numero di occorrenze di sottostringa |
diviso() | mb_split() | Dividi la stringa in un array tramite un’espressione regolare |
posta() | mb_send_mail() | Invia posta codificata |
erg() | mb_ereg() | Corrispondenza di espressioni regolari |
fare() | mb_regi() | Corrispondenza di espressioni regolari senza distinzione tra maiuscole e minuscole |
Faccio un esempio di utilizzo della funzione multibyte:
-
Nome funzione: int mb_strlen (string $str [, string $encoding ] )
-
Descrizione: ottieni la lunghezza della stringa.
-
Parametri: str (stringa di input di cui deve essere determinata la lunghezza)
codifica (codifica dei caratteri)
-
Valore restituito: numero di caratteri della stringa di input str con codifica della codifica dei caratteri
-
Tipo restituito: int
Codice di esempio: ecco un codice di esempio su come utilizzare la funzione mb_strlen. Qui la stringa di input è una parola cinese e vengono utilizzate tre diverse opzioni di codifica dei caratteri.
$ str ="大大";
echo mb_strlen ($ str, 'utf8' ).
echo mb_strlen ($ str, 'gbk' ).
echo mb_strlen ($ str, ' gb2312').
Vincoli: UTF-8 ha alcuni vincoli, come-
- Teoricamente la lunghezza massima dei caratteri con codifica UTF-8 è di sei byte.
- 0xFE e 0xFF non vengono mai utilizzati in questa codifica.
Abilita mbstring da php.ini :
- Conferma l’esistenza di php_mbstring.dll nella cartella ext.
- Rimuovere il commento da ;extension=php_mbstring.dll da php.ini (es. extension=php_mbstring.dll)
- Riavvia il server.
Configurazione di runtime: per abilitare alcune funzioni mbstring, è necessario modificare alcune altre impostazioni.
Tabella 5: Configurazioni in php.ini
Nome | Valore di default | Opzione modificabile |
mbstring.language | neutro | PHP_INI_SYSTEM | PHP_INI_PERDIR |
mbstring.detect_order | NULLO | PHP_INI_ALL |
mbstring.http_input | passaggio | PHP_INI_ALL |
mbstring.http_output | passaggio | PHP_INI_ALL |
mbstring.internal_encoding | NULLO | PHP_INI_ALL |
mbstring.script_encoding | NULLO | PHP_INI_ALL |
mbstring.substitute_character | NULLO | PHP_INI_ALL |
mbstring.func_overload | 0 | PHP_INI_SYSTEM | PHP_INI_PERDIR |
mbstring.encoding_translation | 0 | PHP_INI_SYSTEM | PHP_INI_PERDIR |
Spiegazione delle opzioni di configurazione:
L’opzione “Modificabile" determina il valore della modalità modificabile. Descrive come e da dove è possibile modificare le opzioni di mbstring. Ecco il significato dei valori della modalità:
Tabella 6: Diverse modalità di cambio
Modalità | Significato |
SISTEMA_INI_PHP | Possiamo impostare la voce usando php.ini o httpd.conf |
PHP_INI_PERDIR | Possiamo impostare la voce usando php.ini, .htaccess, httpd.conf o .user.ini |
PHP_INI_ALL | Possiamo impostare la voce da qualsiasi luogo |
PHP_INI_USER | Possiamo impostare la voce utilizzando lo script utente. |
Come cambiare dallo script utente:
Possiamo usare il seguente codice per impostare la codifica interna di mbstring dallo script utente:
<?php
ini_set('mbstring.internal_encoding', 'UTF-8');
?>
Come cambiare da php.ini:
Possiamo modificare il file php.ini per impostare alcune opzioni mbstring.
; Set default language
mbstring.language = Neutral; Set default language to Neutral(UTF-8) (default)
mbstring.language = English; Set default language to English
; Enabled HTTP input encoding translation.
mbstring.encoding_translation = On
; Set default HTTP input character encoding
mbstring.http_input = pass ; No conversion.
mbstring.http_input = auto ; Set HTTP input to auto
Alcuni problemi relativi a mbstring:
L’uso delle funzioni mbstring a volte può causare molestie. Discuterò qui alcuni problemi relativi all’utilizzo dell’overload di funzioni multibyte. Pensiamo uno scenario.
Hai abilitato l’opzione mbstring.func_overload nel tuo file php.ini. Il tuo lavoro sta andando bene. Stai sovraccaricando la funzione di stringa a byte singolo con funzioni di stringa a più byte. Ma cosa succederà se hai bisogno di una libreria esterna che utilizza frequentemente alcune funzioni di stringa?
C’è una soluzione a questo problema. Puoi usare mbstring.internal_coding. Quando chiami una libreria esterna, utilizzerà la codifica a byte singolo e quando torni al tuo progetto, verrà implementata la codifica multibyte. Ma cosa succede se c’è una richiamata tra il tuo progetto e la libreria esterna? Qui fallisce.
Quindi, devi tenere a mente questi problemi mentre usi le opzioni mbstring.
Importanza di mbstring per lo sviluppo web:
Per sviluppare qualsiasi applicazione web internazionale, l’uso di mbstring è un must. Altrimenti la tua domanda sarà limitata ad alcune nazioni e lingue. Come sviluppatore, ti suggerisco di acquisire una certa conoscenza di questo dominio e di renderti efficiente come programmatore web.