Mbstring och PHP måste användas i webbapplikationsutveckling
Byte och bitar är två enheter för att lagra logisk information. En bit kan ses som ett hål, som kan fyllas med ett av två värden: 0 eller 1.
En byte är en gruppering av åtta bitar. När det gäller matematik kan en byte representera 256 olika värden (28).
Låt oss tänka på ett språk, säg engelska. Den har några tecken (a, b, c, … etc.) som representeras i en dator med byte. Det totala antalet tecken på engelska är inte mer än 256, så varje tecken kan representeras genom att använda en annan 8-bitarssekvens.
Strängar är helt enkelt en samling karaktärer. Normalt i PHP fungerar strängoperationer på strängar med en-byte-tecken. Till exempel: du kanske vill jämföra strängarna "Hello" och "Hi". Med strcmpr() kommer de två strängarna att jämföras förutsatt att varje tecken i strängen tar en byte.
Men tänk på ett språk som har mer än 256 tecken (till exempel japanska), eller när vi vill representera tecken från flera språk samtidigt. En byte lagring för varje tecken räcker inte. Det är här multi-byte-konceptet kommer in.
En sträng med japansk text kan få funktionen strcmpr() att returnera ett felaktigt eller skräpvärde eftersom antagandet att en byte representerar ett tecken inte längre stämmer. När vi arbetar med flerbytekodade strängar behöver manipuleringen av dessa strängar specialfunktioner snarare än de vanliga enbytesträngsfunktionerna. För att hantera flerbytesträngar i PHP tillhandahåller mbstring de multibytespecifika strängfunktionerna.
Förstå UTF-8
UTF står för Unicode Transformation Format och är ett kodningssystem som syftar till att representera varje tecken på varje språk i en teckenuppsättning. Det finns olika versioner av UTF, av vilka några visas nedan:
Kodningsformat | Beskrivning |
UTF-1 | Kompatibel med ISO-2022, föråldrad från Unicode-standarden. |
UTF-7 | 7-bitars kodningssystem, användes huvudsakligen i e-post men inte en del av Unicode-standarden. |
UTF-8 | 8-bitars kodningssystem, variabel bredd och är ASCII-kompatibelt. |
UTF-EBCDIC | 8-bitars kodningssystem, variabel bredd och är EBCDIC-kompatibelt. |
UTF-16 | 16-bitars kodningssystem, variabel bredd. |
UTF-32 | 32-bitars kodningssystem, fast bredd. |
Vi använder UTF-8 för det mesta när vi arbetar med multibytetext, så låt oss fokusera på det ett ögonblick. UTF-8 kodar tecken i flera byte med följande schema:
Så, hur vet det om ett tecken är lagrat i en byte eller flera byte? För detta tittar den på högordningens bit av den första byten.
Koda | Menande |
0xxxxxxx | En enda byte-kod |
110xxxxxx | Ytterligare en byte följer efter denna byte |
1110xxxx | Ytterligare två byte följer denna byte |
11110xxx | Ytterligare tre byte följer denna byte |
111110xx | Ytterligare fyra byte följer denna byte |
1111110x | Ytterligare fem byte följer denna byte |
10xxxxxx | Fortsättning av multibyte-tecken |
Varje fortsatt byte i en sekvens med flera byte börjar sedan med 1 och 0 i sina två mest högordningsbitar för att tillhandahålla ett sätt att upptäcka korrupta data.
Multibyte-ekvivalenter av vanliga strängfunktioner
För vanliga strängfunktioner, som strlen(), strops() och substr(), finns det flerbyte-ekvivalenta funktioner. Du bör använda motsvarande funktioner när du arbetar med flerbytesträngar.
Tabell 4: Enbyte ekvivalenta multibyte strängfunktioner
Enkel byte | Multibyte | Beskrivning |
strlen() | mb_strlen() | Få stränglängd |
strpos() | mb_strpos() | Hitta positionen för första förekomsten av sträng i en sträng |
substr() | mb_substr() | Returnera en del av en sträng |
strtolower() | mb_strtolower() | Gör en sträng med liten bokstäver |
strtoupper() | mb_strtoupper() | Gör en sträng med versaler |
substr_count() | mb_substr_count() | Räkna antalet delsträngsförekomster |
dela() | mb_split() | Dela strängen i array med reguljärt uttryck |
post() | mb_send_mail() | Skicka kodad post |
erg() | mb_ereg() | Matchning av reguljära uttryck |
do() | mb_regi() | skiftlägesokänslig matchning av reguljära uttryck |
Låt mig ge ett exempel på hur man använder multibyte-funktionen:
-
Funktionsnamn: int mb_strlen (sträng $str [, sträng $encoding ] )
-
Beskrivning: Hämta strängens längd.
-
Parametrar: str (indatasträng vars längd ska bestämmas)
kodning (teckenkodning)
-
Returvärde: Antal tecken i inmatningssträngen str med teckenkodningskodning
-
Returtyp: int
Exempelkod: Här är en exempelkod på hur man använder mb_strlen-funktionen. Här är inmatningssträngen ett kinesiskt ord och tre olika teckenkodningsalternativ används.
$ str ="大大";
echo mb_strlen ($ str, 'utf8' ).
echo mb_strlen ($ str, 'gbk' ).
echo mb_strlen ($ str, ' gb2312').
Begränsningar: UTF-8 har vissa begränsningar, som-
- Teoretiskt sett är UTF-8-kodade teckens högsta längd sex byte.
- 0xFE och 0xFF används aldrig i denna kodning.
Aktivera mbstring från php.ini :
- Bekräfta förekomsten av php_mbstring.dll i ext-mappen.
- Avkommentera ;extension=php_mbstring.dll från php.ini (dvs extension=php_mbstring.dll)
- Starta om servern.
Runtime Configuration: För att aktivera vissa mbstring-funktioner bör ytterligare några inställningar ändras.
Tabell 5: Konfigurationer i php.ini
namn | Standardvärde | Föränderligt alternativ |
mbstring.language | neutral | PHP_INI_SYSTEM | PHP_INI_PERDIR |
mbstring.detect_order | NULL | PHP_INI_ALL |
mbstring.http_input | passera | PHP_INI_ALL |
mbstring.http_output | passera | PHP_INI_ALL |
mbstring.internal_encoding | NULL | PHP_INI_ALL |
mbstring.script_encoding | NULL | PHP_INI_ALL |
mbstring.substitute_character | NULL | PHP_INI_ALL |
mbstring.func_overload | 0 | PHP_INI_SYSTEM | PHP_INI_PERDIR |
mbstring.encoding_translation | 0 | PHP_INI_SYSTEM | PHP_INI_PERDIR |
Förklaring av konfigurationsalternativen:
"Changeable alternativet" bestämmer det föränderliga lägesvärdet. Den beskriver hur och varifrån mbstring-alternativen kan ändras. Här kommer betydelsen av lägesvärdena:
Tabell 6: Olika förändringslägen
Läge | Menande |
PHP_INI_SYSTEM | Vi kan ställa in posten med php.ini eller httpd.conf |
PHP_INI_PERDIR | Vi kan ställa in posten med php.ini, .htaccess, httpd.conf eller .user.ini |
PHP_INI_ALL | Vi kan ställa in posten var som helst |
PHP_INI_USER | Vi kan ställa in posten med hjälp av användarskript. |
Så här ändrar du från användarskript:
Vi kan använda följande kod för att ställa in intern kodning av mbstring från användarskript:
<?php
ini_set('mbstring.internal_encoding', 'UTF-8');
?>
Så här ändrar du från php.ini:
Vi kan redigera filen php.ini för att ställa in några mbstring-alternativ.
; 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
Några problem relaterade till mbstring:
Att använda mbstring-funktioner kan ibland orsaka trakasserier för dig. Jag kommer här att diskutera några problem med att använda multibyte-funktionsöverbelastning. Låt oss tänka ett scenario.
Du har aktiverat alternativet mbstring.func_overload i din php.ini-fil. Ditt arbete går bra. Du överbelastas en bytesträngfunktion med flerbytesträngsfunktioner. Men vad händer om du behöver ett externt bibliotek som ofta använder någon strängfunktion?
Det finns en lösning på detta problem. Du kan använda mbstring.internal_coding. När du anropar något externt bibliotek kommer det att använda enkelbyte-kodning och när du kommer tillbaka till ditt projekt kommer multibyte-kodning att implementeras. Men vad händer om det blir en callback mellan ditt projekt och det externa biblioteket? Det misslyckas här.
Så du måste komma ihåg dessa problem när du använder mbstring-alternativ.
Betydelsen av mbstring för webbutveckling:
För att utveckla en internationell webbapplikation är användning av mbstring ett måste. Annars kommer din ansökan att vara begränsad till vissa länder och språk. Som utvecklare föreslår jag att du skaffar dig lite kunskap om denna domän och gör dig effektiv som webbprogrammerare.