Portál AbcLinuxu, 25. dubna 2024 12:29


Dotaz: ruby a invalid byte sequence in UTF-8

23.7.2010 02:24 Ivanhoej | skóre: 26 | blog: ss2_Debian | Bratislava
ruby a invalid byte sequence in UTF-8
Přečteno: 404×
Odpovědět | Admin
Chcem v Ruby(1.9 a 1.9.1) nacitat normalne subor mailu (co subor to mail) a ked ho zacnem citat a pride na riadok kde je dake kodovanie napise tieto chyby:

invalid byte sequence in UTF-8 (ruby 1.9.1) broken UTF-8 string (ruby 1.9.0

Precita zo subora aj 18 az 28 riadkov a potom p[adne na chybe zistil som ze vzdy tam kde je diakritika.

Subor je mail a teda moze byt v kodovani 1250, 1251, utf-8 8859-2 atd

Ako teda v Ruby nacitat tieto znaky tak aby nepisali chybu bez ohladu na kodovanie ? Napr ich prekodovat do 7 bit ? Skusal som vsetko mozne aj "r:UTF-8". Please poradte.

Kod je jednoducy:
begin
     File.new(cesta_subor,"r").each { |line|
          puts line
     }
rescue
      puts "Chyba citania suboru #{subor}: #{$!}"
      next
end
*** Jabber (XMPP): fogo@jabber.cz ***
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

23.7.2010 12:58 ET
Rozbalit Rozbalit vše Re: ruby a invalid byte sequence in UTF-8
Odpovědět | | Sbalit | Link | Blokovat | Admin
Zdar, koukni se na ty soubory hexa editorem a koukni jestli tam neni naka prasarna, mozna by to mohlo bejt tohle - http://en.wikipedia.org/wiki/Byte_order_mark
23.7.2010 22:27 Ivanhoej | skóre: 26 | blog: ss2_Debian | Bratislava
Rozbalit Rozbalit vše Re: ruby a invalid byte sequence in UTF-8
Su to normalne maily a ked ich otvorim v kodovani v akom su tak sa pekne daju precitat. Len ide o to ze maily maju rozne kodovania textu od 1250, 1251, 8859-1, 8859-2 az po utf-8 a ruby nevie za pana ich precitat.

Ked ten subor precitam funkciou arr=IO.readlines(dir+subor), tak to pekne komplet nacit ado array ael dalej ked to chcem spracovavat tak to iste ako ked to citam

na tomto to spadne tiez: arr.each {|line| }
*** Jabber (XMPP): fogo@jabber.cz ***
23.7.2010 22:27 Ivanhoej | skóre: 26 | blog: ss2_Debian | Bratislava
Rozbalit Rozbalit vše Re: ruby a invalid byte sequence in UTF-8
Su to normalne maily a ked ich otvorim v kodovani v akom su tak sa pekne daju precitat. Len ide o to ze maily maju rozne kodovania textu od 1250, 1251, 8859-1, 8859-2 az po utf-8 a ruby nevie za pana ich precitat.

Ked ten subor precitam funkciou arr=IO.readlines(dir+subor), tak to pekne komplet nacit ado array ale dalej ked to chcem spracovavat tak to iste ako ked to citam

na tomto to spadne tiez: arr.each {|line| }
*** Jabber (XMPP): fogo@jabber.cz ***
23.7.2010 22:27 Ivanhoej | skóre: 26 | blog: ss2_Debian | Bratislava
Rozbalit Rozbalit vše Re: ruby a invalid byte sequence in UTF-8
Su to normalne maily a ked ich otvorim v kodovani v akom su tak sa pekne daju precitat. Len ide o to ze maily maju rozne kodovania textu od 1250, 1251, 8859-1, 8859-2 az po utf-8 a ruby nevie za pana ich precitat.

Ked ten subor precitam funkciou arr=IO.readlines(dir+subor), tak to pekne komplet nacita do array ale dalej ked to chcem spracovavat tak to iste ako ked to citam

na tomto to spadne tiez: arr.each {|line| }
*** Jabber (XMPP): fogo@jabber.cz ***
25.7.2010 08:53 Michal Karas | skóre: 45 | blog: /dev/random
Rozbalit Rozbalit vše Re: ruby a invalid byte sequence in UTF-8
Odpovědět | | Sbalit | Link | Blokovat | Admin
Tak z toho důvodu je v hlavičkách Content-Type, ne? Tak při čtení nastavuj řetězcům kódování, ve kterém opravdu jsou. Anebo použij nějakou knihovnu, která má tohle vyřešené, například mikel's mail vypadá nadějně.
28.7.2010 12:47 Ivanhoej | skóre: 26 | blog: ss2_Debian | Bratislava
Rozbalit Rozbalit vše Re: ruby a invalid byte sequence in UTF-8
A to by znamenalo ze mu pred kazdym citanim mailu musim nastavit v akom je kodovani? To je predsa nemyslitelne, to nevie ruby jednoducho spracovat text v akomkolvek kodovani?

To ej ale citanie mailu z disku(ako subor) nie cez cez protokol POP3 a pod (a ani sa k nemu tak neda dostat)

Tento program prerabam z pythona a ten to vedel spracovat v pohode, no chcel som prejist na ruby vo vsetkom co pouzivam.
*** Jabber (XMPP): fogo@jabber.cz ***
28.7.2010 14:59 l4m4
Rozbalit Rozbalit vše Re: ruby a invalid byte sequence in UTF-8
Buď s tím souborem pracuješ coby se sekvencí bajtů, tj. obsah souboru tě v podstatě nezajímá, nebo coby s textem (či dokonce se strukturovaným textem -- mailem), jeho obsah tě zajímá, a v tom případě ho musíš správně dekódovat a rozparsovat, na což existují knihovny.

Ruby určitě umí i tu první možnost, ale pochybuji, že je to to, co chceš.

Ostatně v Pythonu by taky každý normální člověk použil funkce pro parsování mailu, které jsou přímo ve standardní knihovně...
28.7.2010 12:49 Ivanhoej | skóre: 26 | blog: ss2_Debian | Bratislava
Rozbalit Rozbalit vše Re: ruby a invalid byte sequence in UTF-8
aj tak dik pozriem na ten mail, ale chcel som sa vyvarovat nieco "gemovat" koli tak niecomu trivialnemu, chcel som pouzit cisty Ruby, to sa neda?
*** Jabber (XMPP): fogo@jabber.cz ***
2.8.2010 03:27 Ivanhoej | skóre: 26 | blog: ss2_Debian | Bratislava
Rozbalit Rozbalit vše Re: ruby a invalid byte sequence in UTF-8
Odpovědět | | Sbalit | Link | Blokovat | Admin
mail.read som skusal ale neriesi to moj problem tiez vyhadzuje problem s kodovanin pri niektorych mailoch (mozno cisnke)

Alebo existuej moznost ako arra (tam sa mi to da nacitat) komplet skonvertovat do napr. 8859-1 alebo utf-8 ?

Vdaka.
*** Jabber (XMPP): fogo@jabber.cz ***
3.8.2010 08:59 Michal Karas | skóre: 45 | blog: /dev/random
Rozbalit Rozbalit vše Re: ruby a invalid byte sequence in UTF-8
pole.map! {|x| x.encode('UTF-8')}
Ale stejně ti tam bude pořád lítat výjimka, pokud si pomocí String#force_encoding nenastavíš kódování, ve kterém ty řetězce opravdu jsou.

Yehuda Katz pěkně popisuje současný stav s kódováním v Ruby 1.9: Encodings, Unabridged. Možná ti to trochu pomůže.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.