Thread View: pl.comp.lang.perl
7 messages
7 total messages
Started by mrek
Tue, 13 Jul 2010 23:43
"Piekło" kodowania ...
Author: mrek
Date: Tue, 13 Jul 2010 23:43
Date: Tue, 13 Jul 2010 23:43
51 lines
2526 bytes
2526 bytes
Witam wszystkich chcących pomagać w taki czy inny sposób ;-).
Toczę nierówną walkę z fragmentem skryptu, który w założeniu ma zmienić
kodowanie treści wiadomości pocztowej (tekstu) do CP1250. Tekst ten
zostanie w dalszej części użyty do przygotowania wydruku, stąd potrzeba
użycia strony kodowej win.
Skrypt który próbuję popełnić pracował będzie pod Win.
Wysyłam sobie mailem zestaw polskich znaków diakrytycznych duże i małe
litery w ramach testu.
Odbieram wiadomość za pomocą Net-POP3.
Wyciągam treść wiadomości (tekst) i dostaję go w postaci z RFC czyli
=CA=D3=A1=A6=A3=AF=AC=C6=D1 =EA=F3=B1=B6=B3=BF=BC=E6=F1
poniżej kawałek skryptu w którym ćwiczę samą konwersję i utknąłem
#!/usr/bin/perl -w
use strict;
use locale;
use Encoding;
use Data::Dumper qw(Dumper);
use Encode qw(find_encoding encode decode from_to); use MIME::QuotedPrint;
$Data::Dumper::Maxdepth = 2;
$Data::Dumper::Indent = 0;
our $tekst = '=CA=D3=A1=A6=A3=AF=AC=C6=D1 =EA=F3=B1=B6=B3=BF=BC=E6=F1';
our $tekst_zdekodowany = decode_qp($tekst); działanie tej funkcji daje
zestaw znaków ĘÓˇ¦ŁŻ¬ĆŃ ęó±¶łżĽćń przypisania dla strony kodowej
iso-8859-2 w tym miejscu zamieram bo dalsze linie nic nie zmieniają
our $tekst_in_octets = encode("iso-8859-2", $tekst_zdekodowany);
print decode("cp1250", $tekst_in_octets);
1;
------------------------
dla fontów windowsowych potrzebne jest CP1250
Czy ktoś ma jakiś pomysł bo ja już straciłem dystans do tego i nie widzę
może prostego rozwiązania.
Pozdrawiam.
Marek
Re: "Piekło" kodowania ...
Author: Maciej Zielenkieiwcz
Date: Wed, 14 Jul 2010 08:51
Date: Wed, 14 Jul 2010 08:51
52 lines
2621 bytes
2621 bytes
On 2010-07-13 23:43, mrek <marq@iq.pl> wrote:
> Witam wszystkich chcących pomagać w taki czy inny sposób ;-).
>
> Toczę nierówną walkę z fragmentem skryptu, który w założeniu ma zmienić
> kodowanie treści wiadomości pocztowej (tekstu) do CP1250. Tekst ten
> zostanie w dalszej części użyty do przygotowania wydruku, stąd potrzeba
> użycia strony kodowej win.
> Skrypt który próbuję popełnić pracował będzie pod Win.
>
>
> Wysyłam sobie mailem zestaw polskich znaków diakrytycznych duże i małe
> litery w ramach testu.
>
> Odbieram wiadomość za pomocą Net-POP3.
>
> Wyciągam treść wiadomości (tekst) i dostaję go w postaci z RFC czyli
>=CA=D3=A1=A6=A3=AF=AC=C6=D1 =EA=F3=B1=B6=B3=BF=BC=E6=F1
>
> poniżej kawałek skryptu w którym ćwiczę samą konwersję i utknąłem
>
> #!/usr/bin/perl -w
>
> use strict;
> use locale;
> use Encoding;
>
> use Data::Dumper qw(Dumper);
> use Encode qw(find_encoding encode decode from_to); use MIME::QuotedPrint;
>
> $Data::Dumper::Maxdepth = 2;
> $Data::Dumper::Indent = 0;
>
> our $tekst = '=CA=D3=A1=A6=A3=AF=AC=C6=D1 =EA=F3=B1=B6=B3=BF=BC=E6=F1';
>
> our $tekst_zdekodowany = decode_qp($tekst); działanie tej funkcji daje
> zestaw znaków ĘÓˇ??ŁŻ??ĆŃ ęó????łżĽćń przypisania dla strony kodowej
> iso-8859-2 w tym miejscu zamieram bo dalsze linie nic nie zmieniają
>
our $tekst_in_octets = decode("iso-8859-2", $tekst_zdekodowany);
>
print encode("cp1250", $tekst_in_octets);
>
> 1;
> ------------------------
>
> dla fontów windowsowych potrzebne jest CP1250
>
> Czy ktoś ma jakiś pomysł bo ja już straciłem dystans do tego i nie widzę
> może prostego rozwiązania.
Owszem, trzeba zamienić miejscami encode() i decode (patrz wyżej). One
robią to co mają w nazwie ;-).
Re: "Piekło" kodowania ...
Author: mrek
Date: Wed, 14 Jul 2010 19:03
Date: Wed, 14 Jul 2010 19:03
69 lines
3558 bytes
3558 bytes
Dnia Wed, 14 Jul 2010 08:51:08 +0000, Maciej Zielenkieiwcz napisał(a):
> On 2010-07-13 23:43, mrek <marq@iq.pl> wrote:
>> Witam wszystkich chcących pomagać w taki czy inny sposób ;-).
>>
>> Toczę nierówną walkę z fragmentem skryptu, który w założeniu ma zmienić
>> kodowanie treści wiadomości pocztowej (tekstu) do CP1250. Tekst ten
>> zostanie w dalszej części użyty do przygotowania wydruku, stąd potrzeba
>> użycia strony kodowej win.
>> Skrypt który próbuję popełnić pracował będzie pod Win.
>>
>>
>> Wysyłam sobie mailem zestaw polskich znaków diakrytycznych duże i małe
>> litery w ramach testu.
>>
>> Odbieram wiadomość za pomocą Net-POP3.
>>
>> Wyciągam treść wiadomości (tekst) i dostaję go w postaci z RFC czyli
>>=CA=D3=A1=A6=A3=AF=AC=C6=D1 =EA=F3=B1=B6=B3=BF=BC=E6=F1
>>
>> poniżej kawałek skryptu w którym ćwiczę samą konwersję i utknąłem
>>
>> #!/usr/bin/perl -w
>>
>> use strict;
>> use locale;
>> use Encoding;
>>
>> use Data::Dumper qw(Dumper);
>> use Encode qw(find_encoding encode decode from_to); use
>> MIME::QuotedPrint;
>>
>> $Data::Dumper::Maxdepth = 2;
>> $Data::Dumper::Indent = 0;
>>
>> our $tekst = '=CA=D3=A1=A6=A3=AF=AC=C6=D1 =EA=F3=B1=B6=B3=BF=BC=E6=F1';
>>
>> our $tekst_zdekodowany = decode_qp($tekst); działanie tej funkcji daje
>> zestaw znaków ĘÓˇ??ŁŻ??ĆŃ ęó????łżĽćń przypisania dla strony kodowej
>> iso-8859-2 w tym miejscu zamieram bo dalsze linie nic nie zmieniają
>>
> our $tekst_in_octets = decode("iso-8859-2", $tekst_zdekodowany);
>>
> print encode("cp1250", $tekst_in_octets);
>>
>> 1;
>> ------------------------
>>
>> dla fontów windowsowych potrzebne jest CP1250
>>
>> Czy ktoś ma jakiś pomysł bo ja już straciłem dystans do tego i nie
>> widzę może prostego rozwiązania.
>
> Owszem, trzeba zamienić miejscami encode() i decode (patrz wyżej). One
> robią to co mają w nazwie ;-).
Dziękuję za "światło" nauki. Za sprowadzenie mnie z myślowych manowców. ;-)
W takim razie dokumentacja Encode wprowadza lekkie zamieszanie.
Wg mojego rozeznania dekodowanie odtwarza z nieczytelnej postaci
do czytelnej a tutaj jest jakby odwrotnie.
Dokumentacja podaje że decode zwraca string a nie sekwencję
bitowo kodowanych znaków. I podobnie jest z encode tzn. odwrotnie ;-).
Dlatego idąc tym tropem zbłądziłem i błądziłem próbując
mnóstwo wariantów, oczywiście oprócz tego właściwego podejścia.
Podane rozwiązanie oczywiście zadziałało ;-)
Pozdrawiam.
Marek
Re: "Piekło" kodowania ...
Author: Szymon Sokół
Date: Wed, 14 Jul 2010 20:22
Date: Wed, 14 Jul 2010 20:22
27 lines
2477 bytes
2477 bytes
On 14 Jul 2010 19:03:00 GMT, mrek wrote: > Dziękuję za "światło" nauki. Za sprowadzenie mnie z myślowych manowców. ;-) > W takim razie dokumentacja Encode wprowadza lekkie zamieszanie. Nie, dokumentacja jest bardzo jasna, jeśli się oczywiście rozumie angielski. > Wg mojego rozeznania dekodowanie odtwarza z nieczytelnej postaci > do czytelnej a tutaj jest jakby odwrotnie. decode() konwertuje z konkretnego kodowania (w tym wypadku ISO-8859-2) do wewnętrznej reprezentacji Perla (czyli Unicode), a encode() odwrotnie - z reprezentacji wewnętrznej do wskazanego kodowania (w tym wypadku CP-1250). "Czytelna" jest każda z tych postaci, oczywiście. > Dokumentacja podaje że decode zwraca string a nie sekwencję > bitowo kodowanych znaków. A cóż to jest "sekwencja bitowo kodowanych znaków"?? Wszystkie znaki są kodowane bitowo, jak zresztą cała informacja w komputerze. A string jest oczywiście sekwencją znaków, więc to zdanie powyżej jest trochę jakby bez sensu. -- Szymon Sokół (SS316-RIPE) -- Network Manager B Computer Center, AGH - University of Science and Technology, Cracow, Poland O http://home.agh.edu.pl/szymon/ PGP key id: RSA: 0x2ABE016B, DSS: 0xF9289982 F Free speech includes the right not to listen, if not interested -- Heinlein H
Re: "Piekło" kodowania ...
Author: Maciej Zielenkieiwcz
Date: Wed, 14 Jul 2010 20:54
Date: Wed, 14 Jul 2010 20:54
25 lines
2063 bytes
2063 bytes
On 2010-07-14 19:03, mrek <marq@iq.pl> wrote: > Dnia Wed, 14 Jul 2010 08:51:08 +0000, Maciej Zielenkieiwcz napisał(a): > W takim razie dokumentacja Encode wprowadza lekkie zamieszanie. > Wg mojego rozeznania dekodowanie odtwarza z nieczytelnej postaci > do czytelnej a tutaj jest jakby odwrotnie. A co to jest czytelna postać? decode "dekoduje" to, co perl dostał z zewnątrz i nie wiedział, w jakim jest kodowaniu. Czyli przekształca z nieznanej (dla interpretera) postaci do znanej. Analogicznie encode koduje dane tak, żeby świat je zrozumiał. > Dokumentacja podaje że decode zwraca string a nie sekwencję > bitowo kodowanych znaków. I podobnie jest z encode tzn. odwrotnie ;-). Podaje słusznie. String = para: ciąg znaków i kodowanie. A encode bierze drugi kodowanie, wykonuje konwersję i zwraca to, co się skonwertowało (jako ciąg bajtów). perldoc Encoding: > Decodes a sequence of octets assumed to be in ENCODING into Perl's > internal form and returns the resulting string. powinno być w miarę jasne. Trzeba tylko zauważyć, że decode_qp nie ma skąd wiedzieć, jakie było kodowanie znaków, więc nie może dawać "internal form".
Re: "Piekło" kodowania ...
Author: mrek
Date: Thu, 15 Jul 2010 13:07
Date: Thu, 15 Jul 2010 13:07
52 lines
3065 bytes
3065 bytes
Dnia Wed, 14 Jul 2010 22:22:52 +0200, Szymon Sokół napisał(a):
> On 14 Jul 2010 19:03:00 GMT, mrek wrote:
>
>> Dziękuję za "światło" nauki. Za sprowadzenie mnie z myślowych manowców.
>> ;-) W takim razie dokumentacja Encode wprowadza lekkie zamieszanie.
> Nie, dokumentacja jest bardzo jasna, jeśli się oczywiście rozumie
> angielski.
>
>> Wg mojego rozeznania dekodowanie odtwarza z nieczytelnej postaci do
>> czytelnej a tutaj jest jakby odwrotnie.
>
> decode() konwertuje z konkretnego kodowania (w tym wypadku ISO-8859-2)
> do wewnętrznej reprezentacji Perla (czyli Unicode), a encode() odwrotnie
> - z reprezentacji wewnętrznej do wskazanego kodowania (w tym wypadku
> CP-1250). "Czytelna" jest każda z tych postaci, oczywiście.
>
>> Dokumentacja podaje że decode zwraca string a nie sekwencję bitowo
>> kodowanych znaków.
>
> A cóż to jest "sekwencja bitowo kodowanych znaków"?? Wszystkie znaki są
> kodowane bitowo, jak zresztą cała informacja w komputerze. A string jest
> oczywiście sekwencją znaków, więc to zdanie powyżej jest trochę jakby
> bez sensu.
Ok. Rozumiem ton wypowiedzi. Rozumiem aluzję odnośnie języka angielskiego.
Trochę semantyki zatem:
kodowanie (encode)
jest metodą przeobrażenia jawnej formy wiadomości w formę ukrytą
dekodowanie (decode)
Proces zamiany nieczytelnej (zakodowanej) informacji na zrozumiałą
dla jakiegoś urządzenia (np. peceta), programu lub człowieka.
wynik działania decode
\x{118}\x{d3}\x{104}\x{15a}\x{141}\x{17b}\x{179}\x{106}\x{143}
\x{119}\x{f3}\x{105}\x{15b}\x{142}\x{17c}\x{17a}\x{107}\x{144}
mimo najszczerszych chęci nie uznam tego za czytelną postać
w odróżnieniu od takiej
ĘÓĄŚŁŻŹĆŃ
ęóąśłżźćń co jest wynikiem działania encode
W kwestii "sekwencja bitowo kodowanych znaków" moja wina
zły dobór słów. Mowa jest o oktetach.
Rozumiem też aluzję odnośnie wiedzy na temat
sposobu przetwarzania informacji przez komputer.
Dziękuje i pozdrawiam.
Marek
Re: "Piekło" kodowania ...
Author: Maciej Zielenkieiwcz
Date: Thu, 15 Jul 2010 17:09
Date: Thu, 15 Jul 2010 17:09
76 lines
4507 bytes
4507 bytes
On 2010-07-15 13:07, mrek <marq@iq.pl> wrote:
> Dnia Wed, 14 Jul 2010 22:22:52 +0200, Szymon Sokół napisał(a):
>
>> On 14 Jul 2010 19:03:00 GMT, mrek wrote:
>>
>>> Dziękuję za "światło" nauki. Za sprowadzenie mnie z myślowych manowców.
>>> ;-) W takim razie dokumentacja Encode wprowadza lekkie zamieszanie.
>> Nie, dokumentacja jest bardzo jasna, jeśli się oczywiście rozumie
>> angielski.
>>
>>> Wg mojego rozeznania dekodowanie odtwarza z nieczytelnej postaci do
>>> czytelnej a tutaj jest jakby odwrotnie.
>>
>> decode() konwertuje z konkretnego kodowania (w tym wypadku ISO-8859-2)
>> do wewnętrznej reprezentacji Perla (czyli Unicode), a encode() odwrotnie
>> - z reprezentacji wewnętrznej do wskazanego kodowania (w tym wypadku
>> CP-1250). "Czytelna" jest każda z tych postaci, oczywiście.
>>
>>> Dokumentacja podaje że decode zwraca string a nie sekwencję bitowo
>>> kodowanych znaków.
>>
>> A cóż to jest "sekwencja bitowo kodowanych znaków"?? Wszystkie znaki są
>> kodowane bitowo, jak zresztą cała informacja w komputerze. A string jest
>> oczywiście sekwencją znaków, więc to zdanie powyżej jest trochę jakby
>> bez sensu.
>
> Ok. Rozumiem ton wypowiedzi. Rozumiem aluzję odnośnie języka angielskiego.
>
> Trochę semantyki zatem:
> kodowanie (encode)
> jest metodą przeobrażenia jawnej formy wiadomości w formę ukrytą
>
> dekodowanie (decode)
> Proces zamiany nieczytelnej (zakodowanej) informacji na zrozumiałą
> dla jakiegoś urządzenia (np. peceta), programu lub człowieka.
Nie, nie ukrytą, tylko zakodowaną. Właśnie to jest istotna różnica.
W jakiś sposób zakodowane są obie fomry, natomiast żadna nie jest
ukryta. Można się spierać, która forma jest łatwiejsza do odczytania,
ale różnica jest niewielka, a dyskusja raczej jałowa.
> wynik działania decode
> \x{118}\x{d3}\x{104}\x{15a}\x{141}\x{17b}\x{179}\x{106}\x{143}
> \x{119}\x{f3}\x{105}\x{15b}\x{142}\x{17c}\x{17a}\x{107}\x{144}
No niezupełnie. Znaczki polskie w UTF-8 są (co najwyżej) dwubajtowe, i
żadnych \x ani klamerek tam nie ma, więc ta postać nie jest aż taka zła:
$ perl -MEncode -e 'print(encode("utf-8",decode("iso-8859-2", "ĘÓĄŚŁŻŹĆŃ\nęóąśłżźćń")))'|xxd
0000000: c498 c393 c484 c59a c581 c5bb c5b9 c486 ................
0000010: c583 0ac4 99c3 b3c4 85c5 9bc5 82c5 bcc5 ................
0000020: bac4 87c5 84 .....
> mimo najszczerszych chęci nie uznam tego za czytelną postać
> w odróżnieniu od takiej
>
> ĘÓĄŚŁŻŹĆŃ
> ęóąśłżźćń co jest wynikiem działania encode
Ale to uważanie jest "osobiste". Mój terminal uważa tylko ISO-8859-2 za
postać czytelną, ale terminal kolegi - tylko UTF-8. Wybór tego, co jest
a co nie jest zakodowane nie jest obiektywny, tylko estetyczny.
> W kwestii "sekwencja bitowo kodowanych znaków" moja wina
> zły dobór słów. Mowa jest o oktetach.
> Rozumiem też aluzję odnośnie wiedzy na temat
> sposobu przetwarzania informacji przez komputer.
To nie była żadna aluzja :-). Po prostu trzeba "poczuć się komputerem",
żeby przyjęta filozofia wydawała się naturalna, a system jest
zaprojektowany z myślą o pracy w wielu kodowaniach "na świecie", i jednym
wybranym "wewnątrz", co pewnie nie pomaga jeżeli pisze się program który
używa tylko dwóch kodowań. Do takich rzeczy można użyć funkcji
from_to(), ale chcialem poprawić przykład, bo jest to pewnie bardziej
pouczające.
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads