Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



Konverze řetězců v Python 2.7

Seznam témat     Nová odpověď

Přihlásit se     Registrace     Zapomenuté heslo

Re: Konverze řetězců v Python 2.7

Autor: Petricek

11:48:54 14.02.2011

Je zbytečné dělat převod na unicode, když text lze zapsat přímo:
[code]
# -*- coding: utf-8 -*-
u"abč" # toto je unicode
type(u"abč")
[/code]
Jen je potřeba na začátek souboru uvést [i]coding[/i] podle toho, v jakém kódování je kód uložen.
http://docs.python.org/tutorial/interpreter.html#source-code-encoding

U python 2.x je výchozí kódování ASCII; u python 3.x je výchozí kódování UTF-8. Pokud se kódování souboru shoduje s výchozím, tak se [i]coding[/i] uvádět nemusí.

Kódování vstupu od uživatele [i]raw_input[/i] se to samozřejmě netýká, tam se musíte řídit podle nastavení OS.

[code]
import sys
text = raw_input('>').decode(sys.stdin.encoding)
type(text) # toto je unicode
[/code]
Pozor, v nějterých případech [i]encoding[/i] v [i]sys.stdin[/i] může chybět.

Citovat příspěvek

 

Re: Konverze řetězců v Python 2.7

Autor: Martin_

7:50:55 18.01.2011

mol: opět velké díky.

Už si začínám připadat jako úplný blb, že nedokážu vyhledat poměrně základní věci v dokumentaci Pythonu. Dokumentaci při každém zádrhelu poctivě prohledávám, jen nechápu, kam přitom koukám.

Citovat příspěvek

 

Re: Konverze řetězců v Python 2.7

Autor: mol

0:05:39 18.01.2011

[code]# -*- coding: utf-8 -*-

import sys
import codecs

retezec = "abč"
unicoderetezec = unicode(retezec, 'utf-8')
[/code]

Citovat příspěvek

 

Re: Konverze řetězců v Python 2.7

Autor: Martin_

22:10:34 17.01.2011

Narazil jsem na další zádrhel. Snažím se v Pythonu 2.7.1 na českých Windows načítat vstup z klávesnice a ten poté zapsat do souboru. Rád bych, aby výstupní soubor byl v UTF-8. Pokud však řetězec zadaný klávesnicí obsahuje jakýkoliv znak s kódem vyšším než 128 (typicky právě znak s diakritkou) nedaří se mi prostě žádným způsobem řetězec zkonvertovat na unicode. Pokaždé je vrácena takováto chyba:
[code]
UnicodeDecodeError: 'ascii' codec can't decode byte 0x9f in position 2: ordinal
not in range(128)
[/code]
Stejná chyba je potom vrácena i pokud používám různé funkce z balíčku codecs.

Načtené řetězce se dají do souboru uložit rovnou bez pokusu o konverzi, pak je zapsaný soubor v CP852.

Ještě podotýkám, že i takovýto jendoduchý skriptík skončí výše popsanou chybou, v řetězci se prostě nesmí objevit znak s kódem nad 128:
[code]
# -*- coding: utf-8 -*-

import sys
import codecs

retezec = "abč"
#nasledujici prikaz skonci chybou
unicoderetezec = unicode(retezec)
[/code]

A po podrobném popisu problému otázka: Nechá se v Pythonu pod Windows (s českým národním prostředím) načíst řetězec s diakritikou a ten zkonvertovat do unicode?

Citovat příspěvek

 

Re: Konverze řetězců v Python 2.7

Autor: Martin_

3:25:57 16.01.2011

[bold]mol: Super, díky moc za rychlou a užitečnou odpověď.[/bold] (tu) (tu) (tu)


Zkusil jsem si obsah proměnné text vypsat jak do konzole, tak do okna (Tkinter). Obsah té samé proměnné v tom samém skriptu, jednou do konzole, podruhé do okna. V obou případech vše funguje korektně. Z toho bych usuzoval, že pokud mám v Pythonu "unicodový řetězec", postará se Python automaticky o jeho správné výstupní kódování, odpovídající vždy tomu konkrétnímu typu výstupu. [bold]Chápu to správně?[/bold]

Výrazem "unicodový řetězec" myslím proměnnou (zde např. pojmenovanou myvariable), která po zadání
print type(myvariable)
vypíše:

Citovat příspěvek

 

Re: Konverze řetězců v Python 2.7

Autor: mol

1:55:14 16.01.2011

[code]import codecs
text = codecs.open('x.txt', 'r', 'UTF-8').read()
print text [/code]

Citovat příspěvek

 

Konverze řetězců v Python 2.7

Autor: Martin_

1:37:44 16.01.2011

Ahoj vespolek, jsem úplný začátečník v Pythonu a spíše začínající programátor obecně. V rámci procházení tutoriálů a zkoušení naprostých základů jazyka Python jsem narazil na jeden problém. Snažím se načíst soubor s českou diakritikou, uložený v UTF-8 a jeho obsah si vypsat na obrazovku (konzoli) ve Windows (Vista). Vím, že české Windows používají navenek kódování CP1250 a pro konzoli CP852. Problém u mě nastává právě v té konverzi z UTF-8 na CP852, která se nezdaří a například při použití funkce encode program zahlásí chybu. Po delší době, strávené zkoušením a googlováním a dalším zkoušením se zeptám takto: Jde to vůbec?

Používám Python 2.7.1 na Windows Vista, pokud to nevyplynulo z předchozího textu. Zdrojové soubory v Pythonu (.py)jsou uloženy v UTF-8.

1) Python skript otevře UTF-8 textový soubor a jeho obsah načte do proměnné typu string.
2) String zkonvertuje do CP852.
3) String, obsahující text ze souboru, vypíše na obrazovku.

Problém nastává v bodu 2, který mi prostě různými způsoby vyřešit nejde, např. funkce encode vrací chybu, kupodivu UnicodeDecodeError. S vynecháním kroku 2 to jde bez problémů, ale pak to celé zase nedává příliš smysl (vypíšou se paznaky, pochopitelně). Závěrem ještě doplním, že když je načítaný soubor v CP1250, nastane prakticky stejný problém (jen se místo znaků s interpunkcí nevypíšou dvojznakové paznaky, ale jen jednoznakové paznaky :-) ).

Předem díky za každou odezvu a prosím nekamenovat, pokud je můj dotaz příliš začátečnický nebo příliš naivní.

Citovat příspěvek

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: