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
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
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ůň.')
>>
>>
>>
>>
>
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
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
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
ja bych volil
import sys
textTerminal = textUnicode.encode(sys.stdout.encoding, 'ignore')
to by mohlo fungovat vsude
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
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
Pri cteni mne napada otazka jak tedy psat programy?
ale moc anglicky neumim takze pro zajemce:
http://en.wikipedia.org/wiki/Han_unification
H.
Miloslav Ponkrác
diky za informace.
Vim, ze ve vetsine pripadu s timto resenim uspeji. Ano, s asiatama a Klingonova budou mozna
mensi problemy :)
S
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
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
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