Web zase jede a mluví česky.
Když jsem před časem zkoušel pomoci Jan Cingerovi s převodem čestiny z
jednoho hostingu na druhý, tušil jsem, že to není žádná legrace. Před
dvěma týdny to potkalo i mě na webu ByPS.cz. Sice jsem nepřecházel na
jiný hosting, ale vše mi převedli z jednoho serveru na druhý, který je
modernější, rychlejší, bezpečnější a asi i krásnější.
Správce databazi převedl s tím, že nová DB podporuje už jen kódování
UTF8. Abych rekl pravdu, ani jsem netušil v jakém kódování web jel do
té doby. Kdo už někdy nějaký web rozjížděl asi vím o čm mluvím. Někdy
je prostě člověk rád, že to mluví hezky česky a dál se v tom nešťourá.
Takže někdy v roce 2007 kdyř jsem nainstaloval na web Joomlu jsem se
dopustil velké chyby. Databáze se nainstalovala jako LATIN1 s
porovnáním SWEDISH. Česky to mluvilo dobře a tak jsem to neřešil.
Převedená databáze měla hodně poničenou čestinu. Texty se nedaly vůbec
číst. Pravá hrůza mě polila až když jsem tu pokaženou databázi
vyexportioval a koukal na to co tomu je. Soubor měl být kódovaný v
UTF8. Jeden český znak vyjádřený 2 bajty. Na místo toho jsem našel
sekvence bajtu dlouhé od 2 až po 21.
Co s tím? To přece nemůže jít opravit. Stará DB je už v háji a to co
mám je bez pardonu v prdeli. Zkoušel jsem nejakou dobu googlovat nějaký
postupy jak to vyřešit, ale nic z toho na můj případ nešlo aplikovat a
nebo to mělo mizerný výsledky.
Nakonec v čirém zoufalství jsem se rozhodl napsat program, který by obsah souboru s exportem DB procházel a vyhledával sekvence bajtů a nahrazoval je za ty správné české znaky. Tak jsem koukal do toho souboru a snažil se najít pokažená písmenka a přemýšlel co to bylo zač. Vznikl tak jakýsi seznam který jsem převedl do čitelného formátu pro onen program. Pro zajímavost jeho část přikládám:
Znak, HTML zástupka, Sekvence bajtů
ó, oacute, $C4, $82, $C2, $83, $C3, $82, $C5, $82
ř, rcaron, $C3, $85, $E2, $84, $A2
ě, ecaron, $C3, $84, $E2, $80, $BA
Ž, Zcaron, $C3, $85, $C2, $BD
ó, oacute, $C3, $83, $C2, $B3
í, iacute, $C3, $83, $C2, $AD
é, eacute, $C3, $83, $C2, $A9
ě, ecaron, $C3, $84, $E2, $80
á, aacute, $C3, $83, $C2, $A1
ú, uacute, $C3, $83, $C2, $BA
Ú, Uacute, $C3, $83, $C5, $A1
Č, Ccaron, $C3, $84, $C5, $92
ž, zcaron, $C3, $85, $C2, $BE
Š, Scaron, $C3, $85, $C2, $A0
š, scaron, $C3, $85, $C2, $A1
ť, tcaron, $C3, $85, $C2, $A5
ů, uring, $C3, $85, $C2, $AF
ň, ncaron, $C3, $85, $CB, $86
ý, yacute, $C3, $83, $C2, $BD
Ř, Rcaron, $C3, $85, $CB, $9C
č, ccaron, $C3, $84, $3F
Ý, Yacute, $C3, $83, $3F
Á, Aacute, $C3, $81
á, aacute, $C3, $A1
Popisovat jak program pracuje by bylo náročné a kdo ví jestli by to vůbec někoho zajímalo, tak to popisovat nebudu. Jen uvedu, že soubor s exportem DB ma cca 4,7 MB a program ho na mém PC přechroupe za cca 10 sekund. TO je slušný. PC mám AMD Athlon DUO core 4800 s 4GB paměti a SATA2 disky. Hry na PC nehraju a na práci je to dostatečný "dělo".
Tak když už jsem program odladil a chodí spolehlivě, zjistil jsem po prvním importu zpět do databáze webu, že některý znaky jsou špatně. Malé č a ď měly v některých případech stejné bajtové sekvence. To zpusobilo, že po převodu se v textu objevovaly nečeská slova jako třeba: porač (poraď), bučto (buďto) a další. Nedokázal jsem odhadnout v jakých všech slovech to je takhle poškozené. Napadlo mě, že toho nebude moc a opravím to pak v Joomla v editoru článků, ale kdo by všechny ty texty četl a opravoval. To by byla práce pro vraha. Chvíli jsem si užíval depresi z nepovedenýho díla a pak mě napadlo, že bych mohl ten program ještě rozšířit o takovou jednoduchou lexikální analýzu. Prostě vzít slovník českých slov a jak to tam zamontovat.
Slovník jsem sehnal na stránkách PSPAD, obsahuje 787.176 spisovných slov s diakritikou v různých tvarech. Protože jsem věděl, že některá Ď se mi zaměnila na Č, vyloučil jsem ze slovníku všechna slova kde Ď nebylo. Zbyla hromada slov u kterých jsem Ď zaměnil za Č. Tento seznam slov jsem projel proti celému slovníku a vyloučil ty slova, která existují ve variantě s Č. Tím jsem vyloučil zámeny slov jako je například "tečka=teďka", "času=ďasu".
Zbývalo program naučit rozpoznat celá slova. Slovo může být uvozené a ukončené různými znaky. Nejčastěji to je mezera, která slova odděluje ve větě. Taky slovem může řádek začínat a končit, vzal jsme v úvahu i interpunkční znaménka, závorky a pak konec HTML zátzupky před slovem (znak středník) a začátek HTML zástupky na konci slova (houslový klíč). Tím jsem vyloužil zpravoání slov, kde jsou některá česká písmena reprezentována HTML zástupkami, například slovo "šiška" = "šiška". Taková slova jsem neřešil a doufám, že jsou správně překédévána HTML zástupkami.
Nakonec slovník který měl nahrazovat Č za Ď obsahoval 2011 slov. Jsou to jen spisovná slova a jedno nespisovné: "střídáků" :) Slovník určitě neobsahuje všechny tvary a variace slov, ale lepší než drátem do oka a slovník pro PSPAD je prostý text, kde je každé slovo na jednom řádku, což se mi dobře zpracovávalo.
Zpraconání souboru exportu touto metodou už trvá déle, ikdyž jsem se snažil o drobné optimalizace. Doba zpracování je 177 sekund. Náhrady slov dopadly takto:
Číslo řáku/číslo sloupce. "nalezené slovo s jedním znakem navíc před i za" - náhrada
58/83. " odpověč." - odpověč=odpověď
58/254. " Porač " - porač=poraď
2245/345. "'Horažčovice'" - horažčovice=horažďovice
2887/27. " uvečte " - uvečte=uveďte
2888/45. " uvečte " - uvečte=uveďte
3284/44081. " nahračte " - nahračte=nahraďte
3284/23607. " Nasačte " - nasačte=nasaďte
3306/11148. " Buč " - buč=buď
3306/3297. " nahračte " - nahračte=nahraďte
3308/4483. " posučte " - posučte=posuďte
3310/3556. " buč " - buč=buď
3314/1666. " posučte " - posučte=posuďte
3316/1827. " buč " - buč=buď
3338/7752. " buč " - buč=buď
3338/5740. " klič " - klič=kliď
3338/5438. " nasačte " - nasačte=nasaďte
3346/1991. " Bučte " - bučte=buďte
3350/20745. ">Nalačte " - nalačte=nalaďte
3350/16381. " vyječ " - vyječ=vyjeď
3360/3843. " buč " - buč=buď
3360/1037. " pojčme " - pojčme=pojďme
3362/3654. " nasačte " - nasačte=nasaďte
3370/7. "'Nalačte " - nalačte=nalaďte
3370/3329. " proječte " - proječte=projeďte
3372/659. " proječte " - proječte=projeďte
3374/4474. " buč " - buč=buď
3374/2629. " řičte " - řičte=řiďte
3378/17912. " odpověč." - odpověč=odpověď
3392/8717. " buč " - buč=buď
3392/7600. " nasačte." - nasačte=nasaďte
3397/21529. " buč " - buč=buď
3397/26513. " Bučte " - bučte=buďte
3399/26859. " odpověč " - odpověč=odpověď
3399/10261. " posučte " - posučte=posuďte
3407/2354. " uvečte " - uvečte=uveďte
3409/7916. " buč " - buč=buď
3411/7478. " buč " - buč=buď
3413/30389. " buč " - buč=buď
3429/13425. " nelač." - nelač=nelaď
3446/26104. " bučto " - bučto=buďto
3458/239. ">Odpověč:" - odpověč=odpověď
3460/1101. ">Odpověč:" - odpověč=odpověď
3462/5268. " buč " - buč=buď
3518/1205. ">Odpověč:" - odpověč=odpověď
3520/7294. " buč " - buč=buď
3534/28039. " ječ " - ječ=jeď
3564/562. " buč " - buč=buď
3568/24. " stříčáků?" - stříčáků=střídáků
16271/189. " Uvečte " - uvečte=uveďte
16272/277. " uvečte " - uvečte=uveďte
16293/128. "'Pojčme " - pojčme=pojďme
16293/257. " uvečte " - uvečte=uveďte
16294/451. " uvečte " - uvečte=uveďte
17260/868. " dolačovací " - dolačovací=dolaďovací
17313/723. " závočáku " - závočáku=závoďáku
17315/723. " závočáku " - závočáku=závoďáku
17321/111. " bučto " - bučto=buďto
17372/123. " pořič " - pořič=pořiď
17378/144. " Poračte " - poračte=poraďte
17386/123. " odpověč." - odpověč=odpověď
17401/62. " Odpověč " - odpověč=odpověď
17421/22. " odpověč." - odpověč=odpověď
17437/719. " buč " - buč=buď
17440/474. " buč " - buč=buď
17459/1257. " bučme " - bučme=buďme
17499/344. " buč " - buč=buď
17513/146. " dolačoval " - dolačoval=dolaďoval
17521/31. " čábel " - čábel=ďábel
17528/242. " rozjížčkách " - rozjížčkách=rozjížďkách
17559/176. " Buč " - buč=buď
17562/28. " Buč " - buč=buď
17582/140. " doječ " - doječ=dojeď
17583/16. " odpověč," - odpověč=odpověď
17609/1830. "(buč " - buč=buď
17626/34. " odpověč." - odpověč=odpověď
17633/100. " pořič " - pořič=pořiď
17650/512. " buč " - buč=buď
17710/349. " buč " - buč=buď
17711/321. " buč " - buč=buď
17712/498. " buč " - buč=buď
17755/92. " buč " - buč=buď
17786/611. " Buč " - buč=buď
17933/324. " poračte " - poračte=poraďte
17942/610. " bučto " - bučto=buďto
17952/93. " odpověč'" - odpověč=odpověď
18003/192. " poračte " - poračte=poraďte
19369/29. "'Nalačte " - nalačte=nalaďte
Doba trvání konvertování: 177406
Výsledkem programu je zkonvertovaný a krásně čitelný soubor, kde je vše jak má být. Po prvním importu měl ale polila hrůza podruhé, stále to nemuví česky. Přišlo mi, že vše je jak má být ale ve výsledku není. Nakonec jsem musel upravit v Joomle soubor Database.php a říst připojení do DB, ze má vyloženě používat UTF8. Tím se to celé rozeběhlo a web ByPS.cz opět píše a zobrazuje krásně česky.
A pokud mi někde něco v textech uniklo a narazíte na to, napište mi prosím na jaké stránce, jaké slovo a já tyhle už jednotlivosti budu opravovat. Například pokud byl překlep ve slově KLÍČ a slovo vypadalo takto: KLIČ, pak to program změnil za KLIĎ.
Web teď jede čistě jen v kódovaní UTF8 a do budoucna mám snad klid. Kdybych v roce 2007 vlezl do instalacního SQL souboru Joomly, která byla distribuována jako že je zaručeně CZECH, a změnil kódování z LATIN1 na UTF8 u 84 tabulek z kterých se Joomla skládá, měl jsem klid.
Proto jestli někdo budete instalovat MySQL databázi, věnujte tomu pozornost. Kdyř je to čistá instalace, jde o prd a můžete to 100x předělat a naučit svojí DB správné kódování češtiny aniž byste přisli o data. Později je to už komplikované a tento článek popisoval, jak moc. Problému jsem se věnoval s přestávkami, ale celkem jsem na tom zabil cca 4 dny, než jsem docílil původního stavu, tedy toho co vidí čtnář a to jsou české znaky.
Autor: Petr Škaloud alias ByPS
Přidat jako oblíbený (72) | Citujte tento článek na svých webovkách | Shlédnutí: 1388
Pouze registrovaní uživatelé mohou přidat komentář. Prosím přihlašte se nebo se zaregistrujte.. Powered by AkoComment Tweaked Special Edition v.1.4.6 AkoComment © Copyright 2004 by Arthur Konze - www.mamboportal.com All right reserved
|