različna kodiranja php
pisatelji začetnikov skripta ne marajo takega pojma, kot je kodiranje. Torej, na straneh, ki jih lahko včasih najdete grozno nered, ko se podatki iz baze podatkov pridobijo v enem kodiranju, se stran oblikuje v drugem in strežnik dobi tretji. posledično, če je stran mogoče dešifrirati, potem vsaj 2-krat. Torej, zakaj se zgodi tak problem in kako ga premagati?
v ruskem segmentu najpogosteje najdete tako imenovano kodiranje oken. pokličite ga drugače: windows-1251, cp1251 ali celo ansi. naslednji je utf-8. Prav tako lahko najdete ime unicode, vendar to ni povsem pravilno, saj je Unicode splošno ime za celotno skupino (utf-8, utf-16, utf-32). in zelo priljubljena redkost je koi8-r ali preprosto koi-8 - nekoč priljubljeno kodiranje Linuxa. Seveda je v ruskem segmentu mogoče spoznati še nekaj drugega, vendar je to bolj »popustljivost« avtorja.
Glavna razlika med utf-8 in ostalimi (predvsem windows-1251 in koi8-r) je zadnji enobajtni, največje število znakov, ki jih je mogoče predstaviti z uporabo teh kodiranja, je omejeno na 256. Samoumevno je, da za popolno predstavitev besedila tega morda ne bo dovolj. in za html je bila najdena rešitev - uporaba tako imenovane mnemotehnike. na primer:
© - & copy;
Poleg dejstva, da je vsak tak lik opisan s skupino znakov, postane koda neberljiva in delo z besedilom postane bolj zapleteno. Tukaj rešuje multibyte utf-8. zelo priročno je uporabiti črke različnih abeced in različnih simbolov v enem besedilu.
Tako je najbolj udoben nabor začetnih pogojev: kodiranje podatkovne baze, php skripte in html strani / js skripte bi moralo biti enako. Seveda lahko uporabite različne, toda v tem primeru obstaja tveganje, da boste zmedeni. ni pomembno, katera kodna stran se uporablja. če je spletna stran samo za rusko govoreče občinstvo, bo Windows-1251 dovolj. drugače bi bila utf-8 logična izbira. prva možnost je bolj ali manj jasna. Večbajtno kodiranje bo zahtevalo nekaj gibov.
Pri delu z utf-8 standardna notepad notepad ne bo delovala ! Dejstvo je, da ta urejevalnik pri shranjevanju datoteke v to kodiranje doda podpis na začetek - 3 znake, tako imenovani bom (oznaka bajtnega reda), ki se lahko uporabi za določanje kodiranja pri odpiranju datoteke. bolje je izbrati drugega urejevalnika: notepad2 ali notepad ++ . v nastavitvah, ki jih morate shraniti brez podpisa.
Naslednji pomemben korak je delo z bazo podatkov. Zelo zaželeno je, da se kodiranje baznega / tabelnega / besedilnega polja ujema s kodiranjem skripta (lahko je cp1251 ali utf-8 ali kaj drugega). če so podatki iz baze podatkov pridobljeni v obliki "zyuk", je verjetno, da je kodirna povezava drugačna od podatkov, shranjenih v bazi podatkov. Naslednja poizvedba bo pomagala premagati situacijo (izvršiti takoj po povezavi z bazo podatkov):
če spletno mesto uporablja windows-1251, ga morate podati - cp1251.
na splošno ni nič težkega. samo, standardne funkcije php niso zasnovane za delo z večobitnimi nizi. vendar obstajajo standardne knjižnice, ki bodo pomagale popraviti situacijo: iconv in mbstring . pri regularnih izrazih obstaja tudi potrebno stikalo, ki se aktivira z modifikatorjem u .
No, podatki iz baze podatkov so pridobljeni, skripti so napisani v skladu z vsemi pravili. Še vedno morate poslati pravilen naslov in prikazati kodo strani v brskalniku uporabnika. naslov pošljemo tako:
header ('Content-Type: text / html; charset = utf-8');
če se uporablja enobajtno kodiranje, bo vrednost za nabor znakov drugačna - windows-1251 . Po tem problemi ne bi smeli ostati.
Nekaj najpreprostejših primerov dela z utf-8 v php:
primer 1: ikona, število znakov na vrstico
$ s = 'string'; # string v utf-8 $ cnt1 = strlen ($ s); # bo vsebovala vrednost $ 12 cnt2 = iconv_strlen ($ s, 'UTF-8'); # pravilna vrednost, 6
primer 2: mbstring, število znakov v nizu
$ s = 'string'; # string v utf-8 $ cnt1 = strlen ($ s); # bo vsebovala vrednost $ 12 cnt2 = mb_strlen ($ s, 'UTF-8'); # pravilna vrednost, 6
primer 3: regularni izrazi, iskanje in zamenjava
$ s = 'String'; # vrstica v utf-8 $ s = preg_replace ('/ p / i', 'd', $ s); # zamenjava se ne bo zgodila $ s = preg_replace ('/ p / iu', 'd', $ s); # dok
modifikator i predpisuje iskanje, ki ni občutljivo na velikost črk in modifikator u ukaže motorju regularnega izraza, da dela z nizi utf-8.
če nekdo pravi, da php ne more delati z utf-8, bo to narobe. Že več let delam vse svoje projekte v tem kodiranju in sploh ni bilo nobenih težav. Iskalniki sami že dolgo uporabljajo to čudovito kodiranje.
Založnik
brez povezave 11 ur
x64 (alias)
Komentarji: 2846 Publikacije: 395 Registracija: 02-04-2009
Torej, zakaj se zgodi tak problem in kako ga premagati?