[python] Q: Cteni unicode retezcu ze souboru UTF-8 s BOM?

RMiklos na pss.sk RMiklos na pss.sk
Čtvrtek Březen 15 09:34:08 CET 2007


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" <PrikrylP na skil.cz> 
Sent by: python-bounces na py.cz
15.03.2007 07:52
Please respond to
Konference PyCZ <python na py.cz>


To
"Konference PyCZ" <python na py.cz>
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
Python na py.cz
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 
------------- další část ---------------
HTML příloha byla odstraněna...
URL: http://www.py.cz/pipermail/python/attachments/20070315/5e21f57e/attachment.htm 


Další informace o konferenci Python