Je to zjavne bug - tu sa o tom docitas:
http://evanjones.ca/python-utf8.html
Takze BOM treba odrezat rucne:
--------------------------------------------------
# -*- coding: cp1250 -*-
import codecs
bom = unicode( codecs.BOM_UTF8, "utf8" )
print "BOM = %s" % repr(bom)
f = codecs.open('soubor.txt', 'r', 'utf-8')
for line in f:
#print "line[0]= %s" % repr(line[0])
if line[0] == unicode( codecs.BOM_UTF8, "utf8" ):
l=line.lstrip(unicode( codecs.BOM_UTF8, "utf8" ))
else:
l = line
print repr(l)
print l[1:]
f.close()
--------------------------------------------------
Vysledok skriptu:
BOM = u'\ufeff'
u'\r\n'
u'Prvn\xed \u0159\xe1dek.\r\n'
rvní řádek.
u'Druh\xfd \u0159\xe1dek.\r\n'
ruhý řádek.
u'T\u0159et\xed \u0159\xe1dek.\r\n'
řetí řádek.
u'P\u0159\xed\u0161ern\u011b \u017elu\u0165ou\u010dk\xfd k\u016f\u0148
\xfap\u01
1bl \u010f\xe1belsk\xe9 \xf3dy.\r\n'
říšerně žluťoučký kůň úpěl ďábelské ódy.
Pozn.: Tvoj subor som vytvoril takto:
--------------------------------------------------
# -*- coding: cp1250 -*-
import codecs
out = file( "soubor.txt", "w" )
out.write( codecs.BOM_UTF8 )
unicodeString=\
u'''
První řádek.
Druhý řádek.
Třetí řádek.
Příšerně žluťoučký kůň úpěl ďábelské ódy.
'''
out.write( unicodeString.encode( "utf-8" ) )
out.close()
--------------------------------------------------
"Petr Prikryl" <[EMAIL PROTECTED]>
Sent by: [EMAIL PROTECTED]
15.03.2007 07:52
Please respond to
Konference PyCZ <[email protected]>
To
"Konference PyCZ" <[email protected]>
cc
Subject
[python] Q: Cteni unicode retezcu ze souboru UTF-8 s BOM?
Ahoj všeci,
Tak nějak prakticky poprvé se dostávám k tomu,
jak přečíst unicode řetězce ze souboru, který
je uložen ve formátu UTF-8 se signaturou
na začátku (BOM). Nějak se mi nedaří.
Mám takovýto soubor.txt v UTF-8 s BOM
=====================================
První řádek.
Druhý řádek.
Třetí řádek.
Příšerně žluťoučký kůň úpěl ďábelské ódy.
=====================================
... a pustím skript
=====================================
import codecs
f = codecs.open('soubor.txt', 'r', 'utf-8')
for line in f:
print repr(line)
print line[1:]
f.close()
=====================================
Výsledek vypadá takto
=====================================
C:\tmp>python a.py
u'\ufeffPrvn\xed \u0159\xe1dek.\r\n'
První řádek.
u'Druh\xfd \u0159\xe1dek.\r\n'
ruhý řádek.
u'T\u0159et\xed \u0159\xe1dek.\r\n'
řetí řádek.
u'P\u0159\xed\u0161ern\u011b \u017elu\u0165ou\u010dk\xfd k\u016f\u0148
\xfap\u011bl \u010f\xe1belsk\xe9 \xf3dy.\r\n'
říšerně žluťoučký kůň úpěl ďábelské ódy.
=====================================
Všimněte si, že na prvním řádku je \ufeff, což je Byte Order Mark,
který se tam vůbec nemá objevit. Jeví se mi to jako chyba.
Na všech řádcích záměrně nevypisuji printem první znak,
protože u toho prvního řádku to krachne (což je pochopitelné).
Řešil někdo něco podobného? Musí se BOM ukousávat ve vlastní režii?
Díky,
pepr
_______________________________________________
Python mailing list
[email protected]
http://www.py.cz/mailman/listinfo/python
Mgr. Ing. Roman MIKLÓŠ
Prvá stavebná sporiteľňa a.s.
Bajkalská 30, P. O. Box 48
829 48 Bratislava 25
Tel.: +421/ 2 / 582 31 174
Fax: +421/ 2 / 582 31 109
_______________________________________________
Python mailing list
[email protected]
http://www.py.cz/mailman/listinfo/python