Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[python] Problem s unicode.

1 view
Skip to first unread message

David Michal

unread,
Apr 7, 2008, 5:40:59 AM4/7/08
to pyt...@py.cz

Zdravim,

Porad mam problem se spravny zobrazenim textu v utf-8 na nekterych systemech.

 

Jak zaridim aby mi kod dole fungoval na vsech masinach?

 

#!/usr/bin/python

#-*- coding: utf8 -*-

 

def out(text):

    print unicode(str(text) + '\n', 'utf8')

 

out('Žlutý kůň.')

 

Na jednech windows mi to funguje, tam kde kde mam zapnutou volbu “language for non-Unicode programs” na Czech. Tam kde je to English tam mi kod skonci s vyjimkou. Na Linuxu mi to konci take s vyjimkou.

 

Takze jak funkci out upravit tak aby si nejak zjistila locales a podle toho vypsala text?

Diky,

David

 

Pavel Kosina

unread,
Apr 7, 2008, 6:24:19 AM4/7/08
to Konference PyCZ
David Michal napsal(a):

>
> Zdravim,
>
> Porad mam problem se spravny zobrazenim textu v utf-8 na nekterych
> systemech.
>
>
>
> Jak zaridim aby mi kod dole fungoval na vsech masinach?
>
>
>
> #!/usr/bin/python
>
> #-*- coding: utf8 -*-
>
>
>
> def out(text):
>
> print unicode(str(text) + '\n', 'utf8')
>
>
>
> out('Žlutý kůň.')
>
>
>

print u"Žlutý kůň" by mělo fungovat všude, samozřejmě pokud je soubor
uložen v kodovani utf8, které máš nadefinované v hlavičce.
více o češtině na py.cz

--
geon
Pavel Kosina

David Michal

unread,
Apr 7, 2008, 6:31:34 AM4/7/08
to Konference PyCZ
No jo, ale ja to prave potrebuju bez toho 'u' pred stringem. Ty stringy budou brany z externiho souboru a budou psany uzivatelem.

superman

unread,
Apr 7, 2008, 6:36:08 AM4/7/08
to Konference PyCZ
Přiznám se, že jsem to víc nezkoumal - a možná, že nebudu zcela v
obraze, ale měl jsem pocit, že plné zobrazení UTF-8 na Windows zařídit
nejde, a že vždy je riziko výjimky. Kdykoli narazil na znak, který nešel
převést do výstupní znakové sady terminálu, pak výjimka okamžitě
vystřelena. A že se takových znaků najde vždycky!

Miloslav Ponkrác

Pavel Kosina napsal(a):


> David Michal napsal(a):
>
>> Zdravim,
>>
>> Porad mam problem se spravny zobrazenim textu v utf-8 na nekterych
>> systemech.
>>
>>
>>
>> Jak zaridim aby mi kod dole fungoval na vsech masinach?
>>
>>
>>
>> #!/usr/bin/python
>>
>> #-*- coding: utf8 -*-
>>
>>
>>
>> def out(text):
>>
>> print unicode(str(text) + '\n', 'utf8')
>>
>>
>>
>> out('Žlutý kůň.')
>>
>>
>>
>>
>

Pavel Kosina

unread,
Apr 7, 2008, 6:58:25 AM4/7/08
to Konference PyCZ
David Michal napsal(a):

> No jo, ale ja to prave potrebuju bez toho 'u' pred stringem. Ty stringy budou brany z externiho souboru a budou psany uzivatelem.
>

Takže to by mělo fungovat textUnicode= unicode(text, kodovani souboru se
stringy od uživatelů). Pokud nefunguje, je třeba převádět unicode před
tiskem ještě na kodovaní daného terminálu. Na běžné znaky by mělo
fungovat ...

--
geon
Pavel Kosina

David Michal

unread,
Apr 7, 2008, 7:32:05 AM4/7/08
to Konference PyCZ
> Takže to by mělo fungovat textUnicode= unicode(text, kodovani souboru
> se
> stringy od uživatelů). Pokud nefunguje, je třeba převádět unicode před
> tiskem ještě na kodovaní daného terminálu. Na běžné znaky by mělo
> fungovat ...
No pockej ale presne tohle tam mam:


def out(text):
print unicode(str(text) + '\n', 'utf8')

tzn. Ze bych mel nejak zjistit kodovanu terminal jeste pred printem. To udelam jak ?


Pavel Kosina

unread,
Apr 7, 2008, 8:27:33 AM4/7/08
to Konference PyCZ
David Michal napsal(a):

> No pockej ale presne tohle tam mam:
>
>
> def out(text):
> print unicode(str(text) + '\n', 'utf8')
>
> tzn. Ze bych mel nejak zjistit kodovanu terminal jeste pred printem. To udelam jak ?
>

Být tebou, ještě jednou prověřím, že je soubor, vlastně oba dva soubory
(program i soubor s texty) skutečně v kodovani utf8. Tam se vznikají
chyby nejvíce.

Jinak terminály pod Linuxem bývají dnes utf-8, pod Windows cp852, takže
pro windows platí:

# -*- coding: utf-8 -*-
text="Žlutý kůň"

textUnicode= unicode (str(text), "utf-8") # převod na unicode
print textUnicode # tiskne správně

textTerminal = textUnicode.encode("cp852") # převod na kodovaní windows
konsole
print textTerminal # tiskne správně

--
geon
Pavel Kosina

superman

unread,
Apr 7, 2008, 8:40:22 AM4/7/08
to Konference PyCZ
>Jinak termin�ly pod Linuxem b�vaj� dnes utf-8, pod Windows cp852, tak�e

Bohu�el pro Windows nen� to pravidlo - mo�n� v �e�tin� ve Windows ano.
Tak�e k�d po��taj�c� s t�mto k�dov�n�m m�e taky �patn� dopadnout.

Jinak do Windows konzole se d� ps�t jako ANSI �et�zce, tak i Unicode
�et�zce, tedy Windows konzole um� p��m� zobrazen� Unicode znak� -
alespo� v C++ to nen� probl�m, ale ob�v�m se, �e Python to nedok�e
vyu��t. Ale jak ��k�m, nezkoumal jsem to, ale pokud Python d�v� do
Linuxov� konzole Unicode a Windows se sna�� ohnout na n�jakou
osmibitovou znakovou sadu (coďż˝ Win API stejnďż˝ jenom v konzoli emuluje a
p�evede si to nejd��v vnit�n� do Unicode), tak to nen� p��li� dobr�
vizitka pro schopnosti Pythonu.

Miloslav Ponkr�c


Michal Molhanec

unread,
Apr 7, 2008, 10:14:02 AM4/7/08
to Konference PyCZ
Pavel Kosina napsal(a):

ja bych volil
import sys
textTerminal = textUnicode.encode(sys.stdout.encoding, 'ignore')

to by mohlo fungovat vsude

Stefan Oravec

unread,
Apr 8, 2008, 5:04:46 AM4/8/08
to Konference PyCZ
stavil by som sa ze 852 je default pre ceske wokna, kazdopadne sa da zmenit na cokolvek. utfg. pre utf8 je to 65001

S.

Stepan Wagner

unread,
Apr 10, 2008, 9:48:51 AM4/10/08
to pyt...@py.cz
Ahoj,

resim Unicode tez, me postrehy:
Unicode je ideal pro prezentaci vsech znaku, ktery se musi nakonec prekodovat
do bytoveho retezce (taky nazyvan plainstring, bytestring...).

vstup ---> decoding (e.g. ANSI) ---> Unicode ---> encoding (e.g. UTF8)
---> vystup

Plati:

unicodestring = u"Žlutý kůň."
utf8string = unicodestring.encode ("utf-8")


Jak dostat zvolene kodovani do vystupu, ktery pouziva napr. UTF-8:

import codecs, sys
sys.stdout = codecs.lookup ('utf-8')[1](sys.stdout)

Ty si ve svem prikladu prevedl plainstring na Unicode pomoci UTF-8,
ale pak je treba
Unicode prekodovat znovu na plainstring podle zvoleneho kodovani.

Stepan

superman

unread,
Apr 10, 2008, 10:12:38 AM4/10/08
to Konference PyCZ

> >Unicode je ideal pro prezentaci vsech znaku, ktery se musi nakonec prekodovat
> >do bytoveho retezce (taky nazyvan plainstring, bytestring...).
>
>
V našich končinách to asi platí, ale ono není pravda, že Unicode dokáže
reprezentovat všechny znaky používaných znakových sad. Zvláště v Asii
velmi protestují proti používání Unicode - protože není s to
reprezentovat znaky jejich národních znakových sad. Proto třeba autor
Ruby (Japonec) nikdy nezavedl používání Unicode jakožto základní sady
pro řetězce v Ruby. Problém je největší pitomost v sw inženýrství zvaná
"šetření bajtíků stylem po nás potopa", jaká způsobilo problém třeba
roku 2000, a tatáž pitomost zamotala Unicode natolik, že ten bordel je
teď dost veliký. Takže pro asijské jazyky se převádějí znaky do Unicode
přes proces zvaný "han unification", což je de facto "ztrátová
komprese", která několik různých odlišných znaků mapuje na stejný jeden
Unicode znak - ztrácí se tím tedy informace a není divu, že Asiaté si o
Unicode myslí jen to nejhorší, a rozhodně Unicode nehodlají používat.

Takže v našich končinách asi nenarazíte, ale v případě mezinárodního
programu byste se mohl rychle dostat do toho, že byste zásadně
přeprogramovával, a už by Vás to nikdy v budoucnu nenapadlo takhle dělat.

Miloslav Ponkrác

David Michal

unread,
Apr 10, 2008, 10:18:50 AM4/10/08
to Konference PyCZ
> V našich končinách to asi platí, ale ono není pravda, že Unicode dokáže
> reprezentovat všechny znaky používaných znakových sad. Zvláště v Asii
> velmi protestují proti používání Unicode - protože není s to
> reprezentovat znaky jejich národních znakových sad. Proto třeba autor
> Ruby (Japonec) nikdy nezavedl používání Unicode jakožto základní sady
> pro řetězce v Ruby. Problém je největší pitomost v sw inženýrství zvaná
> "šetření bajtíků stylem po nás potopa", jaká způsobilo problém třeba
> roku 2000, a tatáž pitomost zamotala Unicode natolik, že ten bordel je
> teď dost veliký. Takže pro asijské jazyky se převádějí znaky do Unicode
> přes proces zvaný "han unification", což je de facto "ztrátová
> komprese", která několik různých odlišných znaků mapuje na stejný jeden
> Unicode znak - ztrácí se tím tedy informace a není divu, že Asiaté si o
> Unicode myslí jen to nejhorší, a rozhodně Unicode nehodlají používat.
>
> Takže v našich končinách asi nenarazíte, ale v případě mezinárodního
> programu byste se mohl rychle dostat do toho, že byste zásadně
> přeprogramovával, a už by Vás to nikdy v budoucnu nenapadlo takhle
> dělat.

Pri cteni mne napada otazka jak tedy psat programy?

Jan Vrana

unread,
Apr 10, 2008, 10:47:48 AM4/10/08
to Konference PyCZ
> "šetření bajtíků stylem po nás potopa", jaká způsobilo problém třeba >
> roku 2000, a tatáž pitomost zamotala Unicode natolik, že ten bordel >
> je teď dost veliký. Takže pro asijské jazyky se převádějí znaky do
> Unicode přes proces zvaný "han unification"
[Honza Vrana]
Pokud tomu dobre rozumim tak neslo ani o setreni bajtiku tech by snad
pri 31 bitech na znak mohlo byt dost ale o to ze nejaky "chytrak" v
ramci uklidu sjednotil znaky ktere se mu jevily podobne jako kdyby nam
nekdo sjednotil treba nase i s teckou a carkou.

ale moc anglicky neumim takze pro zajemce:
http://en.wikipedia.org/wiki/Han_unification

H.

superman

unread,
Apr 10, 2008, 11:37:36 AM4/10/08
to Konference PyCZ

> >Pokud tomu dobre rozumim tak neslo ani o setreni bajtiku tech by snad
> >pri 31 bitech na znak mohlo byt dost ale o to ze nejaky "chytrak" v
>
Bacha! Unicode je definováno na 21 bitech a více ani mít nemůže! Protože
pak by nefungovalo kódování UTF-16, které je de facto naprosto základní
pro Windows, Javu, a další. A Unicode consortium nemůže jít proti
gigantům IT průmysl, protože Ti by začali Unicode consortium ignorovat a
to by se mohlo jít klouzat. Unicode začalo na 16 bitech a vytroubilo do
světa, že Unicode rovná se 16 bitů a tím dalo consortium základ
budoucímu bordelu, ačkoli každý logicky přemýšlející člověk asi tušil,
že to jednou bude průser. Následkem toho už jen pijeme kalich hořkosti,
který z této blbosti vzniknul - a omezení na 21 bitů u Unicode je tím
nejmenším.

Miloslav Ponkrác

Stepan

unread,
Apr 10, 2008, 12:45:52 PM4/10/08
to pyt...@py.cz

diky za informace.

 

Vim, ze ve vetsine pripadu s timto resenim uspeji. Ano, s asiatama a Klingonova budou mozna

mensi problemy :)

 

S

superman

unread,
Apr 10, 2008, 1:03:49 PM4/10/08
to Konference PyCZ
>Pri cteni mne napada otazka jak tedy psat programy?

Prostě Unicode nevyřešilo co mělo řešit. Ale alespoň udělalo jednu věc,
že osekalo počet nutných znakových sad, které potřebujete k tomu plně
vyjádřit pro všechny znaky - když jako jednu vezmete Unicode, pak pár
asijských znakových sad a plus pár drobotin, tak de facto s pěti až
deseti znakovými sadami vystačíte.

Já osobně to řeším tak, že Unicode znaky mám 31 bitového a do horního
prostoru si namapuji ty znaky, které se nevejdou do Unicode - ale
předpokládá to svoje Unicode řešení. Pak mi můj "extended Unicode"
string opravdu přenese vše.

Jinak UTF-8 technicky dokáže zobrazit myslím až 36 bitové znaky (pouze
normou je to omezené dříve na 32, později na 21 bitů, ale to je jen
papírové omezení, nikoli omezení UTF-8 algoritmu), takže UTF-8 uloží i
mojí "extended Unicode" sadu a ještě má velké rezervy.

Miloslav Ponkrác

Vaclav Hula

unread,
Apr 14, 2008, 5:18:08 AM4/14/08
to Konference PyCZ
Jan Vrana napsal(a):

>> "šetření bajtíků stylem po nás potopa", jaká způsobilo problém třeba >
>> roku 2000, a tatáž pitomost zamotala Unicode natolik, že ten bordel >
>> je teď dost veliký. Takže pro asijské jazyky se převádějí znaky do
>> Unicode přes proces zvaný "han unification"
> [Honza Vrana]
> Pokud tomu dobre rozumim tak neslo ani o setreni bajtiku tech by snad
> pri 31 bitech na znak mohlo byt dost ale o to ze nejaky "chytrak" v
> ramci uklidu sjednotil znaky ktere se mu jevily podobne jako kdyby nam
> nekdo sjednotil treba nase i s teckou a carkou.

No to trochu prehanis, sjednoceny byly graficky odlisne znaky se shodnym
vyznamem. Lepsi priklad mi prijde jako kdyby Nemci psali porad
svabachem, ale v unicode nebyl odlisny znak pro "A" a "svabachove A" -
protoze je to hlaska "a" a rozliseni se da delat fontem. Plus teda
spousta mene pouzivanych znaku v unicode chybi, zejmena starsi
nabozenske a poeticke texy maji v unicode smulu - ale i nektere stale
(byt mene) pouzivane znaky.

Navic maji mnozi z CJK pocit, ze na ne byla unifikace v unicode uvalena
systemem "o nas bez nas", ackoliv byli jejich zastupci v unicode
kosorciu aktivni od zacatku. Japonsky zastupce (zamestnanec tusim DECu,
tedy americke fimy a vyrazneho zastance unifikace) hlasoval pro
unifikaci, korejci a cinani proti. Cela politicka stranka tehle
zalezitosti je neprehledna a alespon trochu masla na hlave maji vsichni.

S pozdravem,
Ax

superman

unread,
Apr 14, 2008, 8:10:55 AM4/14/08
to Konference PyCZ

> >No to trochu prehanis, sjednoceny byly graficky odlisne znaky se shodnym
> >vyznamem.
Aha, a proč jsou v Unicode zvlášť třeba indické číslice, zvlášť arabské,
proč jsou tam některé číslice superscriptem, atd...? Proč když by
stačilo tam tu jedničku mít jednou a ne v x možných podobách? Protože to
co píšete, není pravda. Pravda je to co říkám, že sice Unicode
consortium mlží tak, až se za ním práší - ve skutečnosti najdete v
Unicode mnoho příkladů, kde je znak v jednom významu ve více podobách.

Problém je prostě v "nemístném šetření bajtíků" - Unicode consortium
začínalo na 16 bitech - a tak se jim tam všechny asijské znaky do tohoto
rozsahu 65535 znaků prostě nevešly. Dnes je sice na 21 bitech, ale se
znaky nad 16 bitovou hranicí má obrovská spousta systémů a
programovacích jazyků problém, takže je nutné vše základní mít v 16
bitech. Prostě špatná práce a odhad Unicode consortia.

A protože samozřejmě nechtěli nakrknout asijce - a asi víte, že nemohou
říct naplno - "Víte my Unicode consortium jsme to špatně vymysleli celý
ten systém Unicode, a někdo to holt odskákat musí. A rozhodli jsme se,
že to odnesete Vy - a že jsme nuceni Vám Vaší abecedu zprznit, protože
prostě na Vás dlabeme, nám se ta Vaše abeceda už do prostoru znaků
nevejde a jiné státy by řvaly víc - oni nás totiž sponzorují víte? A
chápete, že love, prachy, to je to co dneska hýbe světem, takže se
přizpůsobte a polibte nám zadek". Ačkoli předchozí věty by na 100%
odpovídaly pravdě, zajisté chápete, že na mezinárodní úrovni se takto
nejedná, a je nutné vymyslet kladný důvod, kterým se to zastře a
vysvětlí. A ten důvod je, že "Unicode sjednocuje znaky se stejným
významem" - ale že je to lež jako věž Vás přesvědčí i letmý průchod
Unicode tabulkami znaků.

>Navic maji mnozi z CJK pocit, ze na ne byla unifikace v unicode
uvalena systemem "o nas bez nas", ackoliv byli jejich zastupci v unicode
kosorciu aktivni od zacatku. Japonsky zastupce (zamestnanec tusim DECu,
tedy americke fimy a vyrazneho zastance unifikace) hlasoval pro
unifikaci, korejci a cinani proti. Cela politicka stranka tehle
zalezitosti je neprehledna a alespon trochu masla na hlave maji vsichni.

No a čem píšu? Prostě Unicode to špatně vymyslelo, a někdo prostě to
musel odnést, protože na všechny abecedy není v 16bitovém Unicode
systému místo. A protože všichni, firmy i consortia se řídí prachama -
tak to odnesl ten, kdo byl mimo - tedy Asiaté. Viz výše.

Obecná rada: Musíte když něco čtete, číst mezi řádky a nenechat si
nabulíkovat každou blbost.

Miloslav Ponkrác


0 new messages