UTF-8 visiškai

Sukuriu naują serverį ir noriu visiškai palaikyti UTF-8 savo žiniatinklio programoje. Aš bandžiau tai padaryti jau esamuose serveriuose, ir visada turėjau kreiptis į ISO-8859-1.

Kur tiksliai reikia nustatyti kodavimą / kodavimą? Žinau, kad tam reikia konfigūruoti „Apache“, „MySQL“ ir „PHP“ - ar yra kokių nors standartinių kontrolinių sąrašų, kuriuos galiu stebėti arba galbūt išspręsti neatitikimų atveju?

Tai skirtas naujam „Linux“ serveriui, kuriame veikia „MySQL 5“, „PHP“, „5“ ir „Apache 2“.

1050
11 нояб. nustatė Mercutio 11 nov. 2008-11-11 00:04 '08, 12:04 AM 2008-11-11 00:04
@ 16 atsakymų

Duomenų saugykla :

  • Nurodykite visų duomenų bazės lentelių ir teksto stulpelių simbolių rinkinį utf8mb4 . Dėl to „MySQL“ fiziškai saugo ir atkuria natūraliai užkoduotas reikšmes UTF-8. Atkreipkite dėmesį, kad MySQL netiesiogiai naudoja utf8mb4 kodavimą, jei utf8mb4_* rūšiuoti yra utf8mb4_* (be jokio aiškaus simbolių rinkinio).

  • Senesnėse „MySQL“ versijose (<5.5.3), deja, reikia tiesiog naudoti „ utf8 , kuri palaiko tik Unicode simbolių pogrupį. Norėčiau juokauti.

Prieiga prie duomenų :

  • Savo paraiškos kode (pvz., PHP) naudodami bet kurį jūsų naudojamo duomenų bazės metodą turite nustatyti ryšio kodavimą į utf8mb4 . Taigi, MySQL nekonvertuoja iš savo UTF-8, kai perduoda duomenis į jūsų paraišką ir atvirkščiai.

  • Kai kurie vairuotojai savo mechanizmą nustato ryšio simbolių rinkinį, kuris atnaujina savo vidinę būseną ir pasakoja MySQL apie kodavimą, kuris bus naudojamas ryšyje. Tai paprastai yra pirmenybė. PHP:

    • Jei naudojate SKVN abstrakcijos sluoksnį naudodami PHP ge; 5.3.6 galite nurodyti „ chicket“ į „ mysqli“ , galite paskambinti į set_charset() :

       $mysqli->set_charset('utf8mb4'); // object oriented style mysqli_set_charset($link, 'utf8mb4'); // procedural style 
    • Jei esate įstrigę su įprastu mysql , bet atrodo, kad PHP ge; 5.2.3 galite skambinti „ mysql_set_charset .

  • Jei vairuotojas nepateikia savo ryšio ryšio simbolių rinkinio nustatymo mechanizmo, jums gali tekti išduoti prašymą pasakyti MySQL, kaip jūsų programa tikisi, kad duomenys bus užkoduoti: SET NAMES 'utf8mb4' .

  • Tas pats pasakytina ir apie utf8mb4 / utf8 , kaip minėta pirmiau.

Išeiti

  • Jei jūsų programa perduoda tekstą kitoms sistemoms, jie taip pat turėtų būti informuoti apie simbolių kodavimą. Žiniatinklio programose naršyklė turi būti informuojama apie kodavimą, kuriuo duomenys siunčiami (per HTTP atsakymo antraštes arba HTML metaduomenis ).

  • PHP, galite naudoti default_charset php.ini parametrą arba rankiniu būdu atleisti MIME Content-Type antraštę, kuri paprasčiausiai veikia sunkiau, bet turi tą patį poveikį.

Įvestis

  • Deja, prieš bandydami išsaugoti arba naudoti bet kur, privalote patikrinti kiekvieną gautą eilutę kaip galiojančią UTF-8. PHP mb_check_encoding() daro triuką, bet jūs turite jį naudoti religiškai. Tiesą sakant, taip nėra, nes kenkėjiški klientai gali siųsti duomenis bet kokiam kodavimui, kurio jie nori, ir neradau gudrybės, kad priverstumėte PHP tai padaryti patikimai.

  • Perskaičiuojant dabartinę HTML specifikaciją, šios papildomos paletės nėra reikalingos ar net netinka modernaus HTML. Suprantu, kad naršyklės veiks ir išsiųs duomenis į dokumentui skirtą simbolių rinkinį. Tačiau, jei taikote senesnes HTML versijas (XHTML, HTML4 ir tt), šios sąlygos vis tiek gali būti naudingos:

    • Tik HTML5 HTML5: norite, kad visi duomenys, kuriuos siunčiate naršyklėse, būtų UTF-8. Deja, jei tik atliksite vienintelį būdą, kaip tai patikimai atlikti, pridėkite atributą „ accept-charset visoms <form> žymėms: <form ... accept-charset="UTF-8"> .
    • Tik HTML HTML5 atveju: atkreipkite dėmesį, kad W3C HTML specifikacija sako, kad klientai pagal nutylėjimą siunčia formas į serverį bet kokiame serveryje aptarnaujamame kode, tačiau tai atrodo tik rekomendacija, todėl būtinybė būti aiški kiekviena <form> .

Kiti kodo aspektai :

  • Akivaizdu, kad visi failai, kuriuos aptarnausite (PHP, HTML, JavaScript ir kt.), Turi būti užkoduoti galiojančiame UTF-8.

  • Jūs turite įsitikinti, kad kiekvieną kartą, kai apdorosite UTF-8 eilutę, tai saugiai atliksite. Tai, deja, yra sunki dalis. Jūs tikriausiai norėsite plačiai naudoti „PHP mbstring .

  • Numatytosios PHP integruotos eilutės operacijos nėra saugios UTF-8. Yra keletas dalykų, kuriuos galite saugiai atlikti su įprastomis PHP eilutės operacijomis (pvz., Susiejimas), tačiau daugeliui dalykų turėtumėte naudoti lygiavertę mbstring funkciją.

  • Norėdami sužinoti, ką jūs darote (skaitykite: nesistenkite), jums tikrai reikia žinoti UTF-8 ir kaip jis veikia kuo žemesniame lygyje. Išbandykite visas nuorodas iš utf8.com ir gaukite gerų išteklių, kad sužinotumėte viską, ką reikia žinoti.

913
11 нояб. Atsakymas pateikiamas chazomaticus 11 lapkričio. 2008-11-11 00:43 '08 0:43 2008-11-11 00:43

Norėčiau pridurti vieną puikų atsakymą į puikų atsakymą :

Nepamirškite ir META žyma (pvz., HTML4 arba XHTML versija ):

 <meta charset="utf-8"> 

Tai atrodo nereikšminga, bet IE7 man tai anksčiau iškėlė problemų.

Aš padariau viską teisingai; duomenų bazė, duomenų bazės ryšys ir turinio tipo HTTP antraštė buvo sukonfigūruota UTF-8, ir ji veikė gerai visose kitose naršyklėse, tačiau „Internet Explorer“ vis dar reikalavo naudoti „Vakarų Europos“ kodavimą.

border=0

Paaiškėjo, kad puslapyje nėra META žyma. Šio problemos sprendimo pridėjimas.

Redaguoti:

W3C iš tikrųjų turi gana didelę I18N sekciją. Jie turi eilę straipsnių, susijusių su šia problema - aprašyti HTTP, (X) HTML ir CSS pusių:

Jie rekomenduoja naudoti HTTP antraštę ir HTML meta žymeklį (arba XML deklaraciją, kai naudojate XHTML kaip XML).

138
12 нояб. atsakymas suteiktas Mercator 12 nov. 2008-11-12 22:27 '08, 22:27 pm 2008-11-12 22:27

Be „ default_charset nustatymo „php.ini“, prieš bet kurį išvestį galite siųsti teisingą kodavimą su header() iš kodo:

 header('Content-Type: text/html; charset=utf-8'); 

Darbas su „Unicode“ PHP yra paprastas, jei suprantate, kad dauguma eilutės funkcijų neveikia su „Unicode“, o kai kurios gali visiškai užblokuoti eilutes . PHP mano, kad „simboliai“ yra 1 baitas. Kartais tai yra normalu (pavyzdžiui, explode() ieško tik baitų sekos ir naudoja jį kaip separatorių, todėl nesvarbu, kokie faktiniai simboliai ieškote). Tačiau kitais atvejais, kai funkcija faktiškai sukurta dirbti su simboliais, PHP nežino, kad jūsų tekstas turi daugybinius simbolius, esančius Unicode.

Gera biblioteka, kurią reikia patikrinti, yra phputf8 . Tai perrašo visas „blogas“ funkcijas, kad galėtumėte saugiai dirbti su UTF8 stygomis. Yra išplėtimų, pvz., „Mbstring“ plėtinys, kuris taip pat stengiasi tai padaryti už jus, bet aš norėčiau naudoti biblioteką, nes jis yra nešiojamas (bet rašau masinės rinkos produktus, todėl man tai svarbu). Bet phputf8 bet kuriuo atveju gali naudoti „mbstring“ užkulisiuose, kad pagerintų našumą.

56
11 нояб. atsakymas suteikiamas chroder 11.11 . 2008-11-11 00:30 '08 0:30 2008-11-11 00:30

Žinau seną temą. Buvo nustatyta problema su asmeniu, naudojančiu SKVN, ir atsakymas buvo naudoti jį PDO ryšio eilutėje:

 $pdo = new PDO( 'mysql:host=mysql.example.com;dbname=example_db', "username", "password", array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")); 

Svetainė, kurioje aš ją paėmė, neveikia, galėjau ją gauti naudodama „Google“ talpyklą.

26
11 сент. Atsakymas duotas Brad F Jacobs rugsėjo 11 d 2012-09-11 18:40 '12 18:40 2012-09-11 18:40

Mano atveju naudoju mb_split , kuris naudoja įprastą išraišką. Taigi taip pat turėjau rankiniu būdu patikrinti, ar įprastinė išraiška kodavimas buvo utf-8, vykdant mb_regex_encoding('UTF-8');

Kaip papildomą pastabą, paleidžiant mb_internal_encoding() , taip pat mb_internal_encoding() , kad vidinis kodavimas nebuvo utf-8, ir aš jį mb_internal_encoding("UTF-8"); paleidžiant mb_internal_encoding("UTF-8"); .

20
24 февр. Atsakymą pateikė JDelage 24 vasaris. 2012-02-24 01:20 '12 at 1:20 2012-02-24 01:20

Visų pirma, jei esate <5.3PHP, tada ne. Jūs turite daug problemų, su kuriomis reikia elgtis.

Nustebau, kad niekas neminėjo intl bibliotekos, kuri palaiko unicode , grafemas , styginių operacijas , lokalizaciją ir daugelį kitų, žr. Žemiau.

Pateiksiu informacijos apie unicode PHP palaikymą naudojant skaidres pateikė Elizabeth Smith PHPBenelux'14

Intl

Geras:

  • Apvyniokite aplink ICU biblioteką
  • Standartizuotos vietovės, nustatykite lokalę pagal scenarijų
  • Formatavimo numeriai
  • Valiutos formatavimas
  • Pranešimo formatavimas (pakeičia gettext)
  • Kalendoriai, datos, laiko juosta ir laikas
  • Vertėjas
  • Spoofchecker
  • Išteklių paketai
  • keitikliai
  • IDN palaikymas
  • grafimas
  • Derinimas
  • iteratoriai

Netinkamas:

  • Nepalaiko zend_multibite
  • Nepalaiko HTTP įvesties išvesties konvertavimo.
  • Nepalaiko funkcijų perkrovos.

mb_string

  • Įgalina zend_multibyte palaikymą
  • Palaiko skaidrią HTTP įvedimo / išjungimo kodavimą
  • Teikia kai kuriuos vyniojimo įrenginius, pvz., Strtoupper

Iconv

  • Pirminis kodavimas
  • Išvesties buferio tvarkyklė
  • mime kodavimo funkcija
  • konversijos
  • kai kurie styginių pagalbininkai (len, subst, strpos, strrpos)
  • Srauto filtras stream_filter_append($fp, 'convert.iconv.ISO-2022-JP/EUC-JP')

BAZ

  • mysql: kodavimo ir atitikimo lentelės ir sujungimai (ne rūšiavimas). Taip pat nenaudokite mysql - msqli arba SKVN
  • postgresql: pg_set_client_encoding
  • sqlite (3): įsitikinkite, kad jis buvo sudarytas su unicode ir intl palaikymu

Kai kurie kiti

  • Jūs negalite naudoti Unicode failų pavadinimų su PHP ir Windows, nebent naudojatės trečiosios dalies plėtiniu.
  • Nusiųskite visus į ASCII, jei naudojate exec, proc_open ir kitus komandų eilutės skambučius
  • Paprastas tekstas nėra paprastas tekstas, failai turi koduotę
  • Failus galite konvertuoti į „iconv“ filtrą.

Atnaujinsiu šį atsakymą, jei kas nors pakeis pridėtas funkcijas ir pan.

19
27 янв. Jimmy Kane atsakė 27 Jan 2014-01-27 12:16 '14, 12:16 2014-01-27 12:16

Neseniai sužinojau, kad naudojant strtolower() gali kilti problemų, kai duomenys yra sutrumpinti po specialaus pobūdžio.

Sprendimas buvo naudoti

 mb_strtolower($string, 'UTF-8'); 

mb_ naudoja „MultiByte“. Jis palaiko daugiau simbolių, bet apskritai šiek tiek lėčiau.

13
13 янв. Atsakymas pateikiamas Notflip Jan 13 2014-01-13 12:37 '14, 12:37 2014-01-13 12:37

Vienintelis dalykas, kurį norėčiau papildyti šiais nuostabiais atsakymais, yra pabrėžti failų išsaugojimą „utf8“ koduotėje, pastebėjau, kad naršyklės šią funkciją naudoja, kad nustatytų utf8 kaip kodų kodavimą. Bet koks tinkamas teksto redaktorius jums tai parodys, pvz., „Notepad ++“ turi failų rinkimo meniu elementą, parodo dabartinį kodavimą ir leidžia jį pakeisti. Visiems mano php failams naudoju utf8 be specifikacijos.

Kažkada kažkas paprašė manęs pridėti utf8 palaikymą kitam php / mysql programai, pastebėjau, kad visi failai buvo užkoduoti ANSI, todėl turėjau naudoti ICONV, kad galėčiau konvertuoti visus failus, pakeisti duomenų bazės lenteles naudoti utf8 charset ir utf8_general_ci, pridėkite „SET NAMES utf8“ prie duomenų bazės abstrakcijos sluoksnio po prisijungimo (jei naudojate 5.3.6 ar anksčiau, priešingu atveju reikia naudoti charset = utf8 ryšio eilutėje) ir keisti eilutės funkcijas, kad galėtumėte naudoti funkcines php daugialypės eilutės funkcijos yra lygiavertės.

12
10 сент. Atsakymas, kurį pateikė Puerto AGP 10 rugsėjis 2014-09-10 06:39 '14 at 6:39 2014-09-10 06:39

Aš tiesiog išgyvenau tą pačią problemą ir rasti gerą sprendimą PHP vadovuose.

Aš pakeičiau visą mano failo kodavimą į UTF8, o tada - numatytąjį ryšį. Tai leido išspręsti visas problemas.

 if (!$mysqli->set_charset("utf8")) { printf("Error loading character set utf8: %s\n", $mysqli->error); } else { printf("Current character set: %s\n", $mysqli->character_set_name()); } 

Peržiūrėti šaltinį

8
06 мая '15 в 0:36 2015-05-06 00:36 Abdul Sadik Yalcin atsakymas gegužės 06 d. 15 d. 0:36 2015-05-06 00:36

PHP sistemoje turite naudoti daugybines funkcijas arba įjungti „ mbstring.func_overload“ . Taigi, tokie dalykai kaip strlen veiks, jei turėsite simbolių, kurie pasieks daugiau nei vieną baitą.

Taip pat turėsite nustatyti savo atsakymų pobūdžio rinkinį. Galite naudoti AddDefaultCharset, kaip aprašyta aukščiau, arba parašyti PHP kodą, kuris grąžina antraštę. (Arba galite pridėti META žymą į savo HTML dokumentus.)

8
Atsakymą pateikė JW. Lapkričio 11 d 2008-11-11 00:29 '08 0:29 2008-11-11 00:29

Geras tikslas - nuo pat pradžių, remiantis svetainės pobūdžiu, „Google“ sistemoje rado daug išteklių šiuo klausimu - žinoma, jūs nesate pirmasis, kuris tai supranta.

Mistinis PHP6 turėtų jį ištiesinti, ar ne?

Jūs galite gana daug konfigūruoti utf-8 kaip pasaulinį numatytąjį „mysql“ kodavimą serverio lygiu, ir pagal nutylėjimą jis teisingai atitiks labiau išsamesnius lygius.

7
11 нояб. Atsakymas pateikiamas dkretz 11.11 . 2008-11-11 00:41 '08, 12:41 am 2008-11-11 00:41

Unicode palaikymas PHP vis dar yra didžiulis. Nors ji gali konvertuoti ISO8859 eilutę (kuri naudojama jos viduje) į utf8, ji iš pradžių neturi galimybės dirbti su unikodo eilutėmis, o tai reiškia, kad visos eilutės apdorojimo funkcijos bus trikdomos ir sugadins jūsų eilutes. Todėl, norėdami tinkamai palaikyti utf8, turite naudoti atskirą biblioteką arba patys perrašyti visas eilutės apdorojimo funkcijas.

Paprasta dalis yra tik kodavimo kodavimas HTTP antraštėse ir duomenų bazėje ir tt, tačiau nė vienas iš šių dalykų nėra svarbus, jei jūsų PHP kodas nespausdina galiojančio UTF8. Tai sunki dalis, o PHP suteikia jums beveik jokios pagalbos. (Manau, kad PHP6 turėtų išspręsti blogiausią, bet vis dar yra tolimoje vietoje)

6
11 нояб. Atsakymą pateikė jalf 11 lapkričio. 2008-11-11 00:48 '08 0:48 2008-11-11 00:48

Jei norite, kad „MySQL“ serveris išspręstų simbolių rinkinį, o ne „PHP“ kaip klientas (mano nuomone, pageidaujamas senas elgesys), pabandykite „ my.cnf pridėti „ skip-character-set-client-handshake [mysqld] ir paleiskite mysql .

Tai gali sukelti problemų, jei naudojate kitą nei UTF8.

5
12 февр. Nikola Tulimirovic atsakymas vasario 12 d. 2015-02-12 02:52 '15 at 2:52 2015-02-12 02:52

Pagrindinis atsakymas yra puikus. Štai ką turėjau daryti įprastu debian / php / mysql nustatymu:

 // storage // debian. apparently already utf-8 // retrieval // the mysql database was stored in utf-8, // but apparently php was requesting iso. this worked: // ***notice "utf8", without dash, this is a mysql encoding*** mysql_set_charset('utf8'); // delivery // php.ini did not have a default charset, // (it was commented out, shared host) and // no http encoding was specified in the apache headers. // this made apache send out a utf-8 header // (and perhaps made php actually send out utf-8) // ***notice "utf-8", with dash, this is a php encoding*** ini_set('default_charset','utf-8'); // submission // this worked in all major browsers once apache // was sending out the utf-8 header. i didnt add // the accept-charset attribute. // processing // changed a few commands in php, like substr, // to mb_substr 

Tai viskas!

5
14 янв. Atsakymą pateikė commonpike Jan 14 2011-01-14 19:13 '11, 19:13, 2011-01-14 19:13
 <meta charset="utf-8"> 

Turinio tipas: text / html; Kodavimas = UTF-8

spustelėkite čia nuorodos aprašymą

-1
03 дек. Atsakymą pateikė Jayanit Satani 03 d. 2017-12-03 06:33 '17 at 6:33 2017-12-03 06:33

Patalpinta kaip wiki bendruomenė:

„WordPress“ naudotojams:

Sidenote: klausimas buvo atšauktas. Pranešimas buvo paimtas iš:

Dalinis pranešimas:

Turiu WordPress svetainę, kurią įdiegiau į savo vietinį kompiuterį. Aš ką tik jį įkėliau į savo prieglobą ir importavau duomenų bazę, bet jie visi rodomi kaip.


Sprendimas iš OP:

Kiekvienas, kuris turi šią problemą, žemiau yra nustatytas man. Jis nebuvo susijęs su duomenų baze.

Būtinas Wp-config.php atnaujinimas. Aš define('DB_CHARSET', 'utf8mb4'); define('DB_CHARSET', 'utf8');

-4
03 дек. Atsakymą pateikė Fredas - 03- oji . 2017-12-03 06:33 '17 at 6:33 2017-12-03 06:33

Kiti klausimai apie „ arba „ Užduoti klausimą“