» »

[php] encoding niza

[php] encoding niza

kriko1 ::

Imam naslednjo situacijo:
forum - strani servira v windows-1250 formatu, v bazi med vsem pa so uporabniki.
V bazi zraven stolpca za ime piše da uporablja collation: utf8_slovenian_ci

Sedaj pa, ko npr. naredim poizvedbo za uporabnika, dobim tole solato npr. (ne vem če se bo sploh prav prikazalo tukaj):
"èenèaƎÊ-" - namesto "čenčaĆŽĐŠ-"

Kak encoding je to oz. kako lahko tale niz pretvorim v utf-8?

Poizkusil sem takole:
$return = iconv('UTF-8', 'ISO-8859-1', $userData["userName"]);

vendar dobim še večjo zmešnjavo.

BigWhale ::

Najprej preveri kaj se dejansko zapise v bazo. Tudi baza lahko dela med poizvedbami konverzije sem ter tja, ker lahko nastavis collate za clienta in za bazo posebaj.

Probaj pred zapisom v bazo stvar spremeniti iz cp1250 v utf8.

Pa pazi pri poizvedbah, ce bo moral uporabnik vnasati kak text, potem ga moras iz cp1250 prav tako spremenit v utf8.

kriko1 ::

Tega ne bi počel, ker bi razbil delovanje foruma, naj je v bazi kot je.
Not iz te skripte ne bom nič zapisoval, samo prebiral - trenutno sem naredil en grd workaround:

function char_hack($text)
{
$text=str_replace("è",'č',$text);
$text=str_replace("æ",'ć',$text);
//...
}

:)

Haniball ::

Prvo ugotovi v katerem kodiranju so nedelujoči šumniki, potem pa uporabi iconv.
To najenostavneje narediš, da odpreš stran v browserju in tako dolgo spreminjaš encoding strani (če imaš FF: view / character encoding) da bodo šumniki pravilno prikazani.
Drugače pa lahko probaš tudi s "SET names neko_kodiranje;" poizvedbo. S tem ne boš nič spremenil v bazi, edino baza ti bo pred vračanjem konvertala.

kriko1 ::

Tole sem v brskalniku ravnokar probal - ni sreče, ravno tako sem še prej kar direktno z iconv preikusil cp125* ter različna iso kodiranja.
Iz podore za IPB skripto sem zvedel da edino header v htmlju nastavi tako kot je v nadzorni plošči (torej windows-1250) in tudi preverjeno to naredi.
Vprašanje zakaj jaz ne dobim šumnikov ven ko naredim konverzijo iz win-1250.

Gledal šem se bazo in nastavitve so naslednje:
MySQL charset: UTF-8 Unicode (utf8)
MySQL connection collation: utf8_unicode_ci

collation pod samim stolpcom za "name" je pa utf8_slovenian_ci.

Npr. "čenčžćšđa" v bazi dejansko zgleda takole (prek phpMyAdmin): "èenèžæšða"
FF pa mi tole izpiše: èenèžæšða
Opera pa: èenèžæšða
(izpisujem z var_dump($string))

Imena pa dobim s pomočjo apija za IPB, kar naj bi pa delal vse v UTF-8.
zakaj je toliko različnih utf-8 kodiranj (slovenian_ci....) ni to samo en standard?

krho ::

Zakaj encodina na forumu ne nastaviš na utf-8?
si.Mail odprto-kodni odjemalec elektronske pošte. - http://www.simail.si
Uredite si svojo zbirko filmov, serij in iger - http://xcollect.sf.net

kriko1 ::

Zato ker ta forum vleče čreva iz davnih časov phpBB in takrat stvari niso bile v UTF-8. Če nastavim v utf-8 se vse polomi - prevodi ter vsi podatki iz baze so napačno prikazani.
Pri prehodu na IPB3 je v načrtu prehod na UTF-8.

krho ::

Potem v phpBBju, tam, takoj za klicem, ki naredi povezavo na bazo naredi naslednjo poizvedbo SET NAMES cp1250;
si.Mail odprto-kodni odjemalec elektronske pošte. - http://www.simail.si
Uredite si svojo zbirko filmov, serij in iger - http://xcollect.sf.net

BigWhale ::

Saj UTF je isti za vse, tisto potem je collation, razvrstitev po abecedi. Vsak narod ima svojo abecedno razporeditev, to je zato, da ti sort dela prav. Ce to spremenis se v sami bazi nic ne spremeni, samo ce sortiras po tistem columnu so stvari v drugem vrstnem redu.

Pravilna resitev za problem bi itak bil dump celotne baze in se en import v UTF8. Stvar je relativno trivialna. Potem bi ti vse delalo tako kot treba.

kriko1 ::

Hm, glede na to da je v planu selitev, lahko verjetno storim konverzijo baze v utf8.
Je že kdo kaj takega počel in ima izkušnje s tem?

Težava je da ne morem kar tako eksperimentirat z poizkušanjem, saj moj računalnik potrebuje štiri ure za en import :|

#iconv -c -f cp1250 -t utf8 forum_phpbb1_6.4.sql > mydatabase.utf8.sql_finish

In sedaj za primerjavo, na forum sem napisal:
Testni post: čćžšđČĆŽŠĐ
in tole sedaj v dumpu zgleda takole:
(slotech tega ne sprejme)
ko pa poženem iconv skozi pa pride:
Testni post: èæžšðĂÆŽŠĂ

Sicer npr. kwrite sedaj prepozna kot utf8 document, ampak šumniki še vedno so napačni.

EDIT: nič ne bo iz tega.
stvar ima na več mestih drugače zapisane šumnike. Torej sed skozi da popuca stvari.

Zgodovina sprememb…

  • spremenil: kriko1 ()

kriko1 ::

Še nekaj - ko naredim konverzijo dumpa z iconv postane neveljaven. Ugotovil sem da mi določene stavke sfuzla, primer:
INSERT INTO `ibf_email_logs` (email_id`,...

recimo pri email_id je odstranil tisti `.
Je možno kako drugače dump pretvorit najprej v čisto utf8 datoteko brez da bi razbil stvari?

Baza je pa prevelika da bi jo na roke popravljal...

Zgodovina sprememb…

  • spremenil: kriko1 ()

krho ::

mysqldump --default-character-set=latin1 --hex-blob --single-transaction --opt -B <ime baze> | \
/bin/sed -e 's/latin1/<kodna tabela>/g' | iconv -f cp1250 -t utf-8 > podatki.sql

zamenjaj še latin1 in cp1250 z ustreznimi charseti. In naslednja zadeva deluje 100%
si.Mail odprto-kodni odjemalec elektronske pošte. - http://www.simail.si
Uredite si svojo zbirko filmov, serij in iger - http://xcollect.sf.net

S4NNY1 ::

Tudi jaz sem se znašel v tem peklu, pa ne znam iz njega ven pobegnit:
https://slo-tech.com/forum/t696201/p575...
Po urah googlanja sem ugovil, da so podatki, ki jih s php-jem izpišem v ASCII.
Glede datotek sem sicer uredil, charset/encoding pa nikakor ne morem popravit. Kako torej postopat, da rešim vso to štalo in bom v končni XAMARIN aplikaciji uporabil enak encoding/charset kot na serverju?
SloTech - če nisi z nami, si persona non grata.

msjr ::

Ene 9000 let nazaj sem imel podoben problem, ko mi je editor posnel vse php datoteke v ascii in sem imel zj. utf-8 output. Takrat sem to rešil z enostavnim komentarjem

- odprl ascii file
- convert to utf-8
- dodal komentar // (C)Jest
- zaradi copyright simbola je editor "vedel" da gre za utf-8 file in ga ni več konvertiral nazaj v ascii
- success

Upam da kaj pomaga

S4NNY1 ::

Glede samih datotek, je vse ok, sem že rešil, zanima me dalje za "programske" stvari. Se pravi za php.ini fajl, apache2.conf, ter nastavitev PB / tabel / stolpcev /... itd., da bo delal najprej izpis, potem pa v XAMARIN, ko bo (de)šifrirano vse skupaj. Sem že delal take zadeve, vendar na istih platformah, sedaj pa, ko je vse pomešano pa sem se enostavno zgubil.
Sicer, a ni ASCII subset UTF8?
SloTech - če nisi z nami, si persona non grata.

Zgodovina sprememb…

  • spremenil: S4NNY1 ()

S4NNY1 ::

Po "skrbnih" opažanjih
Filezilla klienta sem ugotovil, da FTP server ne podpira znakov, ki niso ASCII. Se pravi, da jaz vseeno na server pošiljam ASCII charset? Na žalost, rešitvi ne pridem blizu. Povezava https://stackoverflow.com/questions/228..., mi da sicer nekaj teorije, a v praksi dosti kaj ni bolje.
SloTech - če nisi z nami, si persona non grata.

krho ::

nastavi ftp client, da naj vedno pošilja binary!
si.Mail odprto-kodni odjemalec elektronske pošte. - http://www.simail.si
Uredite si svojo zbirko filmov, serij in iger - http://xcollect.sf.net

S4NNY1 ::

Hm, zanimivo. Namesto
echo json_encode($rows);
sem dal
print_r($rows);
in mi šumnike sedaj pravilno prikazuje. Kako bi to sedaj sparsal v C#?
Oblika, ki jo sedaj imam je Array([0]=> Array([ID]=>6 ...),
Edit:
echo json_encode($rows,JSON_UNESCAPED_UNICODE);
je rešila celotno situacijo.
SloTech - če nisi z nami, si persona non grata.

Zgodovina sprememb…

  • spremenil: S4NNY1 ()


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Unicode decode

Oddelek: Programiranje
121324 (782) Randomness
»

Šumniki v php-ju

Oddelek: Izdelava spletišč
213261 (1764) JoSmo
»

[C++] charset-a

Oddelek: Programiranje
7442 (299) SasoS
»

Šumniki in MySql

Oddelek: Izdelava spletišč
195062 (4599) SPEEEED
»

MySQL in czs

Oddelek: Izdelava spletišč
422707 (1797) krho

Več podobnih tem