fr3akX Posted May 19, 2008 Report Share Posted May 19, 2008 (edited) Sveiki! Šobrīd cīnos ar sekojošu problēmu. Ir datubāze kuras tabulu kodējums ir latin1 un satura kodējums ir ISO-8859-13,ISO-8859-1, 1257 t.i LV, RU, EN. Saturs man ir jāpārkonvertē uz UTF-8, tad arī pašas tabulas jāpārkonvertē uz UTF-8. Tākā saturs ir vairākos kodējumos, tad šis variants neder (http://www.mysqlperformanceblog.com/2007/12/18/fixing-column-encoding-mess-in-mysql/). Nav iespējams arī pārkonvertēt ar iconv, tākā ir jānorāda ieejas kodējums, un tie ir vairāki. Man ir pāris varianti kā šo konvertējumu varētu paveikt: Detektēt katra simbola kodējumu un konvertēt ar iconv (problēma - kā detektēt) Izveidot charsetu tabulu, pēc kuras izparsēt visu datubāzi aizmainot vienu pret otru, arī simbola bāzēts risinājums, bet šajā gadījumā pastāv iespēja, ka dažādos gadījumos simboli var sakrist varbūt kāds ir saskāries ar šādu problēmu un varētu ieteikt risinājumu. Jau iepriekš paldies! Edited May 19, 2008 by fr3akX Link to comment Share on other sites More sharing options...
andrisp Posted May 19, 2008 Report Share Posted May 19, 2008 Man liekas, ka tavi divi pašpiedāvātie varianti nevarētu darboties. Jautājums - kā aplikācija, kas darbojas ar šo db, prot atpazīt kurš teksts ir kādā kodējumā ? Link to comment Share on other sites More sharing options...
Grey_Wolf Posted May 19, 2008 Report Share Posted May 19, 2008 var megjinaat sadi: izlasiit 3 atseviskjos *.sql failos datus --> katram kodejumam atseviskji (ceru ka kautkaa tachu tos datus peec valodaam atskjir) kartu atseviskji parkonverteet --> un pec tam salasiit visu kopaa.... kjepiigi , bet vajadzeetu izdoties... Link to comment Share on other sites More sharing options...
fr3akX Posted May 19, 2008 Author Report Share Posted May 19, 2008 (edited) Aplikācijā ir iespēja pārslēgties starp valodām. Sadalīt 3 sql failos nesanāks, jo visas valodas ir vienā kaudzē. Piem. ja izvēlies RUS interfeisu un raksti LV, tad tas arī tā saglabāsies. Tabulās nav nekāda dalījuma starp valodām. Ja raksta RUS interfeisaa LV purtiem, un otrādi, tad simboli saglabājas entītēs, ko pārkonvertēt problēmu nebūs. Domāju jābūt iespējai nodetektēt čārsetu, piem. skanē vārdu, ja atrod kādu simbolu, kas nav en, tad skatās konvertāciajs tabulās, jā tādu atrod, tad visu vārdu konvertē no detektētā čārseta. Problēma tikai atrast šādas tabulas. Edited May 19, 2008 by fr3akX Link to comment Share on other sites More sharing options...
Grey_Wolf Posted May 19, 2008 Report Share Posted May 19, 2008 (edited) ??? pag, a kaa tad juus atskjirojat valodas? Raksti utt? kautkaa murgaini .... visi teksti (teiksim komentari) ir lapaa redzami gan LV, gan Ru , gan Eng?? un db nekaa tas netiek skjirots??? tb parsledzos uz LV un man krievu tekstaa vietaa raadas herioglifi??? Edit : un kaa atskjirsi kaadaa valoda ir vards FORUMS / ? angliski vai latviski? Edited May 19, 2008 by Grey_Wolf Link to comment Share on other sites More sharing options...
fr3akX Posted May 19, 2008 Author Report Share Posted May 19, 2008 (edited) ???pag, a kaa tad juus atskjirojat valodas? Raksti utt? kautkaa murgaini .... visi teksti (teiksim komentari) ir lapaa redzami gan LV, gan Ru , gan Eng?? un db nekaa tas netiek skjirots??? tb parsledzos uz LV un man krievu tekstaa vietaa raadas herioglifi??? Šī sistēma ir per/user. Satur sevī informāciju par lietotājiem un to kontaktiem. Dažādi lietotāji lieti dažādus interfeisus, tādēļ nav nepieciešamības redzēt informāciju, kas ir vadīta no citas valodas. EDIT: Edit : un kaa atskjirsi kaadaa valoda ir vards FORUMS / ? angliski vai latviski? Par to pēdējo, tad domāju, ka tam nav atšķirības, tā kā tur nav diakritisko simbolu. Edited May 19, 2008 by fr3akX Link to comment Share on other sites More sharing options...
andrisp Posted May 19, 2008 Report Share Posted May 19, 2008 Nu it kā ir: mb_detect_encoding Tad sanāk, ka lietotājam ir fiksēta valoda interfeisā ? Tb, ja nebūtu, tad pastāvētu iespēja, ka ievadot RU infu caur RU intefeisu un pēc tam atverot LV interfeisu, būs garbage simboli ? Link to comment Share on other sites More sharing options...
Grey_Wolf Posted May 19, 2008 Report Share Posted May 19, 2008 Dažādi lietotāji lieti dažādus interfeisus, Nu luuk arii risinajums , apskaties kadu interfeisu vinsh lieto un miers... kursh teksts kuram userim pieder tu tachu zini? Link to comment Share on other sites More sharing options...
fr3akX Posted May 19, 2008 Author Report Share Posted May 19, 2008 Nu it kā ir: mb_detect_encoding Tad sanāk, ka lietotājam ir fiksēta valoda interfeisā ? Tb, ja nebūtu, tad pastāvētu iespēja, ka ievadot RU infu caur RU intefeisu un pēc tam atverot LV interfeisu, būs garbage simboli ? Tā arī ir, ka lietotājam, kurš vadījis RU interfeisā, atverot LV ir ķeburi. mb_detect_encoding esmu skatījies, diez cik labi tas nestrādā, detektee tikai ASCII un UTF-8, vismaz tā ir manā gadījumā. Link to comment Share on other sites More sharing options...
andrisp Posted May 19, 2008 Report Share Posted May 19, 2008 Kārtīga WTF sistēmiņa. ;) Bet vispār man nav ideju. Link to comment Share on other sites More sharing options...
fr3akX Posted May 19, 2008 Author Report Share Posted May 19, 2008 Nu luuk arii risinajums , apskaties kadu interfeisu vinsh lieto un miers... kursh teksts kuram userim pieder tu tachu zini? zinu tikai kāda valoda tika norādīta reģistrējoties, bet pēdējais valodas uzstādījums tiek glabāts tikai pārlūka cookie. Var jau balstoties uz to kāda valoda tika norādīta reģistrējoties, bet būs datu zudumi. Izskatās, ka tas ir vienkāršākais risinājums. Ja ņemties ar konvertācijas tabulām, tad arī iespējams būtu datu zudumi, ja simboliem dažādos kodējumos izrādās vienāds hex's. Droši vien būs jāveic konvertācija, kas balstās uz valodu, kas norādīta registrējoties. Paldies, par ātrām atbildēm un padomiem! Link to comment Share on other sites More sharing options...
xPtv45z Posted May 19, 2008 Report Share Posted May 19, 2008 Ja visi iespējamie encodingi ir zināmi, tad var uztaisīt funkciju, kas mēģināt pārvērst no katra uz utf8 un pārbaudīt, vai ir utf8 vai nav, ja nav, pārkonvertēšanai ņemt nākamo encodingu. utf8 var pārbaudīt ar šādu funkciju, ko uzgāju iekš php.net. function isUTF8($str) { if ($str === mb_convert_encoding(mb_convert_encoding($str, "UTF-32", "UTF-8"), "UTF-8", "UTF-32")) { return true; } else { return false; } } mb_convert_encoding vietā var izmantot arī iconv. Link to comment Share on other sites More sharing options...
fr3akX Posted May 19, 2008 Author Report Share Posted May 19, 2008 Ja visi iespējamie encodingi ir zināmi, tad var uztaisīt funkciju, kas mēģināt pārvērst no katra uz utf8 un pārbaudīt, vai ir utf8 vai nav, ja nav, pārkonvertēšanai ņemt nākamo encodingu.utf8 var pārbaudīt ar šādu funkciju, ko uzgāju iekš php.net. function isUTF8($str) { if ($str === mb_convert_encoding(mb_convert_encoding($str, "UTF-32", "UTF-8"), "UTF-8", "UTF-32")) { return true; } else { return false; } } mb_convert_encoding vietā var izmantot arī iconv. interesants variants, būs jāizmēģina. paldies! Link to comment Share on other sites More sharing options...
andrisp Posted May 19, 2008 Report Share Posted May 19, 2008 fr3akX, pag - tad tev izdevās izdomāt vai nē ? Link to comment Share on other sites More sharing options...
fr3akX Posted May 19, 2008 Author Report Share Posted May 19, 2008 Gala risinājums ir līdzīgs sākotnēji izteiktajiem variantam par konvertācijas tabulām. 1. Katram charsetam tika izveidots paterns heksā, kur ietilps visi simboli, kas nav ASCII. (http://www.mikezilla.com/exp0012.html) 2. Katrs ieraksts tika matchots pret katru paternu un, ja tas mačojās, tad iegūstam ieraksta kodējumu, ja nē, tad tas ir ASCII. 3. Kad ieguvām kodējumu konvertējam ierakstu ar iconv no iegūtā kodējuma uz UTF-8. 4. Kad ieraksts tika pārkonvertēts uz UTF-8, pēdējais solis bija pārkonvertēt entītes ar html_entity_decode. Pēc kā tika iegūts UTF-8 kontents :) Link to comment Share on other sites More sharing options...
Recommended Posts