You are not logged in.

Announcement

*** NOTICE: forum.openstreetmap.org is being retired. Please request a category for your community in the new ones as soon as possible using this process, which will allow you to propose your community moderators.
Please create new topics on the new site at community.openstreetmap.org. We expect the migration of data will take a few weeks, you can follow its progress here.***

#26 2010-10-23 19:33:16

Ilis
Member
From: Екатеринбург
Registered: 2009-05-24
Posts: 5,970

Re: perl + .osm

Undefined subroutine &main::decode called at ./make_osm_cz.pl line 13, <GEN0> line 62.

ещё до кучи...

Offline

#27 2010-10-23 19:33:58

liosha
Member
From: Moscow
Registered: 2008-03-04
Posts: 8,447
Website

Re: perl + .osm

use Encode;

Offline

#28 2010-10-23 19:39:49

Ilis
Member
From: Екатеринбург
Registered: 2009-05-24
Posts: 5,970

Re: perl + .osm

Если я просто печатаю принтами, то всё по-русски. Как доходит до модуля, там корявства.

С декоде тоже не всё хорошо, то ворнинги, то корявки:

[ilis@altus osm_perl]$ ./make_osm_cz.pl | grep name:ru
Wide character in print at ./make_osm_cz.pl line 16, <GEN0> line 62.
    <tag k="name:ru" v="Ðиглава"/>
    <tag k="name:ru" v="Рокицани"/>
    <tag k="name:ru" v="Хеб"/>
    <tag k="name:ru" v="Бероун"/>
    <tag k="name:ru" v="Кладно"/>
    <tag k="name:ru" v="Теплице"/>
    <tag k="name:ru" v="Тахов"/>
    <tag k="name:ru" v="Славков-у-Брна"/>
Wide character in print at ./make_osm_cz.pl line 16, <GEN0> line 2775.
    <tag k="name:ru" v="Миловице"/>
    <tag k="name:ru" v="Хрудим"/>
    <tag k="name:ru" v="Адамов"/>
    <tag k="name:ru" v="Клатови"/>
    <tag k="name:ru" v="Свитави"/>
    <tag k="name:ru" v="ÐÑнов"/>
    <tag k="name:ru" v="Страконице"/>

Offline

#29 2010-10-23 19:42:21

liosha
Member
From: Moscow
Registered: 2008-03-04
Posts: 8,447
Website

Re: perl + .osm

Ну я ж говорю, где-то по дороге портится кодировка.
Вряд ли тут модуль виноват

Offline

#30 2010-10-23 19:44:37

Ilis
Member
From: Екатеринбург
Registered: 2009-05-24
Posts: 5,970

Re: perl + .osm

А вот это вообще не работает:
$csname = decode( 'utf8', $_[0]->{tag}->{'name'});

Cannot decode string with wide characters at /usr/lib/perl5/vendor_perl/i386-linux/Encode.pm line 160, <GEN0> line 23

Offline

#31 2010-10-23 19:46:02

liosha
Member
From: Moscow
Registered: 2008-03-04
Posts: 8,447
Website

Re: perl + .osm

Правильно, и не должно работать. В $_[0] там уже всё и так раскодировано.

Offline

#32 2010-10-23 19:52:34

Ilis
Member
From: Екатеринбург
Registered: 2009-05-24
Posts: 5,970

Re: perl + .osm

liosha wrote:

Ну я ж говорю, где-то по дороге портится кодировка.
Вряд ли тут модуль виноват

По дороге откуда куда?

Может какие-то тесты написать?

Прога пока вот такая:

#!/usr/bin/perl

# use Encode;
# use utf8;
use Geo::Parse::OSM;

# binmode STDOUT, ':utf8';

my $ru; my $cs; my $csname;
my %hash = ();
my $addname = sub {
        $csname = $_[0]->{tag}->{'name'};
        # $csname = decode( 'utf8', $_[0]->{tag}->{'name'});
        if ( $hash{$csname} ne '' && $_[0]->{tag}->{'name:ru'} eq '') {
                $_[0]->{action} = 'modify';
                $_[0]->{tag}->{'name:ru'} = $hash{$csname};
                print Geo::Parse::OSM->to_xml( $_[0] );
                # print decode( 'utf8', Geo::Parse::OSM->to_xml( $_[0] ) );
        }
};

open(MYINPUTFILE, "<ru_cs_towns.txt");
while(<MYINPUTFILE>) {
        chomp;
        ($ru, $cs) = split /:/;
        $hash{$cs} = $ru;
        print "$cs --> $hash{$cs}\n";
}


print "<osm>\n";
Geo::Parse::OSM->parse_file( 'file.osm', $addname );
print "</osm>\n";

Результат такой:

...
Cheb --> Хеб
Chrudim --> Хрудим
Česká Lípa --> Ческа-Липа
České Budějovice --> Ческе-Будеёвице
...
  <node action="modify" id="86964510" version="4" timestamp="2008-11-04T13:10:12Z" uid="308" user="MichaelCollinson" changeset="676656" lat="48.9474349" lon="16.3134502" visible="true">
    <tag k="is_in" v="Czech Republic, Europe"/>
    <tag k="is_in:continent" v="Europe"/>
    <tag k="is_in:country_code" v="cz"/>
    <tag k="name" v="Miroslav"/>
    <tag k="name:ru" v="ÐиÑоÑлав"/>
    <tag k="place" v="town"/>
    <tag k="source" v="geonames.org,cs.wikipedia.org,nga.mil"/>
  </node>
  <node action="modify" id="86965801" version="3" timestamp="2008-11-04T13:09:50Z" uid="308" user="MichaelCollinson" changeset="676656" lat="50.5607811" lon="15.9128796" visible="true">
    <tag k="is_in" v="Czech Republic, Europe"/>
    <tag k="is_in:continent" v="Europe"/>
    <tag k="is_in:country_code" v="cz"/>
    <tag k="name" v="Trutnov"/>
    <tag k="name:ru" v="ТÑÑÑнов"/>
    <tag k="place" v="town"/>
    <tag k="source" v="geonames.org,cs.wikipedia.org,nga.mil"/>
  </node>

[ilis@altus osm_perl]$ cat ru_cs_towns.txt | wc -l
93
[ilis@altus osm_perl]$ ./make_osm_cz.pl | grep '"name"' | wc -l
25

Cheb, Chrudim -- обрабатываются
Česká Lípa, České Budějovice -- нет

Offline

#33 2010-10-23 19:56:56

liosha
Member
From: Moscow
Registered: 2008-03-04
Posts: 8,447
Website

Re: perl + .osm

open MYINPUTFILE, '<:utf8', "ru_cs_towns.txt";

Offline

#34 2010-10-23 20:04:52

Ilis
Member
From: Екатеринбург
Registered: 2009-05-24
Posts: 5,970

Re: perl + .osm

Нда... модуль заработал, обычные принты разломались.

С модулем википедии таких проблем не было. И вообще раньше с моим перлом таких проблем не было. Думаю, дело всё-таки в модуле.

Может какие-то тесты на эту тему подготовить и найти багу?

Offline

#35 2010-10-23 20:10:42

liosha
Member
From: Moscow
Registered: 2008-03-04
Posts: 8,447
Website

Re: perl + .osm

Нет там багов, есть недопонимание работы с кодировками.
Для начала почитать http://perldoc.perl.org/perlunicode.html

Ну а про то, что to_xml выдаёт готовый utf8 вместо внутренней кодировки, я уже говорил.

Offline

#36 2010-10-23 20:16:00

Ilis
Member
From: Екатеринбург
Registered: 2009-05-24
Posts: 5,970

Re: perl + .osm

Да что ж такое то! Теперь йосм не хочет файл открывать!

Ага, надо вместо <osm> обязательно <osm version='0.6'>

Ну и вот результат трудов: http://www.openstreetmap.org/browse/changeset/6150621

До сих пор не пойму, что меня торкнуло этим заняться! smile

Offline

#37 2010-10-23 20:18:51

Ilis
Member
From: Екатеринбург
Registered: 2009-05-24
Posts: 5,970

Re: perl + .osm

liosha wrote:

Нет там багов, есть недопонимание работы с кодировками.
Для начала почитать http://perldoc.perl.org/perlunicode.html

Ну а про то, что to_xml выдаёт готовый utf8 вместо внутренней кодировки, я уже говорил.

Там много и не по-русски.

Можно как-то по-простому, как сделать чтобы и обычные принты работали, и модуль всё понимал?

Offline

#38 2010-10-23 20:22:49

liosha
Member
From: Moscow
Registered: 2008-03-04
Posts: 8,447
Website

Re: perl + .osm

Дык я ж говорил как: все промежуточные файлы писать и читать с фильтром :utf8, а результат to_xml писать БЕЗ фильтра.

Offline

#39 2010-10-23 20:27:00

Ilis
Member
From: Екатеринбург
Registered: 2009-05-24
Posts: 5,970

Re: perl + .osm

liosha wrote:

Дык я ж говорил как: все промежуточные файлы писать и читать с фильтром :utf8, а результат to_xml писать БЕЗ фильтра.

У меня уже мозг засыпает, пойду и я посплю...

Хотелось бы верить, что все эти проблемы действительно объективные, и иначе как танцем с бубном над работающим в остальных 99 % случаев перлом нормально с этим модулем работать невозможно.

Offline

#40 2010-10-23 20:32:00

liosha
Member
From: Moscow
Registered: 2008-03-04
Posts: 8,447
Website

Re: perl + .osm

Объективные, объективные big_smile

Offline

#41 2010-10-23 20:56:35

Sergey Astakhov
Member
From: St.Petersburg, Russia
Registered: 2009-11-13
Posts: 5,816

Re: perl + .osm

Кодировки - это примерно такая же вещь, как указатели в C/C++. Некоторые люди понимают концепцию сразу и без проблем, а до других доходит с большим трудом. Уж насколько в Java простая схема, и то постоянно вызывает проблемы у начинающих... :-)

Offline

#42 2010-10-23 21:43:07

zverik
Member
From: Saint-Petersburg
Registered: 2009-07-31
Posts: 771

Re: perl + .osm

Я посмотрел changeset и хочу заметить (совершенно в отрыве от темы), что набор значений тэга принято разделять точками с запятой, а не запятыми smile

Offline

#43 2010-10-23 21:45:27

Upliner
Member
From: Kyiv
Registered: 2008-09-18
Posts: 845

Re: perl + .osm

Ilis wrote:

Хотелось бы верить, что все эти проблемы действительно объективные

Не будь эти проблемы объективными, мы бы вообще не знали никаких проблем с кодировками wink

Last edited by Upliner (2010-10-23 21:45:39)


Big cat is watching you

Offline

#44 2010-10-23 21:58:05

krysha
Member
Registered: 2009-03-30
Posts: 100

Re: perl + .osm

Кстати, никто не сравнивал вариант работы с xml через модули Perl с вариантом вызова из perl xmlstarlet ? Что быстрее?

Offline

#45 2010-10-24 05:54:39

liosha
Member
From: Moscow
Registered: 2008-03-04
Posts: 8,447
Website

Re: perl + .osm

zverik wrote:

Я посмотрел changeset и хочу заметить (совершенно в отрыве от темы), что набор значений тэга принято разделять точками с запятой, а не запятыми smile

Если ты про source, то к этот конкретный ченжсет его не трогал.

Offline

#46 2010-10-24 06:53:23

Ilis
Member
From: Екатеринбург
Registered: 2009-05-24
Posts: 5,970

Re: perl + .osm

Скажите тогда как мне после чтения из файла через фильтр потом печатать можно было по-русски?

open MYINPUTFILE, '<:utf8', "ru_cs_towns.txt";
while(<MYINPUTFILE>) {
        chomp;
        ($ru, $cs) = split /:/;
        $hash{$cs} = $ru;
        print "$cs --> $hash{$cs}\n";
}

Offline

#47 2010-10-24 06:57:34

liosha
Member
From: Moscow
Registered: 2008-03-04
Posts: 8,447
Website

Re: perl + .osm

Ну в четвёртом же посте написано  smile

Offline

#48 2010-10-24 07:52:36

Ilis
Member
From: Екатеринбург
Registered: 2009-05-24
Posts: 5,970

Re: perl + .osm

Offline

#49 2010-10-24 07:59:00

Ilis
Member
From: Екатеринбург
Registered: 2009-05-24
Posts: 5,970

Re: perl + .osm

Ilis wrote:

Скажите тогда как мне после чтения из файла через фильтр потом печатать можно было по-русски?

liosha wrote:

Ну в четвёртом же посте написано  smile

liosha wrote:

установи выходную кодировку.
binmode STDOUT, ':utf8';

Так ведь блин одновременно не работает всё равно!

Šumperk --> Шумперк
Jaroměř --> Яромерж
<osm version='0.6'>
  <node action="modify" id="21560644" version="3" timestamp="2008-11-04T13:19:22Z" uid="308" user="MichaelCollinson" changeset="676656" lat="49.1857456" lon="15.4520172" visible="true">
    <tag k="is_in" v="Czech Republic, Europe"/>
    <tag k="is_in:continent" v="Europe"/>
    <tag k="is_in:country_code" v="cz"/>
    <tag k="name" v="TelÄ"/>
    <tag k="name:ru" v="ТелÑÑ"/>
    <tag k="place" v="town"/>
  </node>

Offline

#50 2010-10-24 08:04:07

liosha
Member
From: Moscow
Registered: 2008-03-04
Posts: 8,447
Website

Re: perl + .osm

Чтобы одновременно работало - 23-й пост
http://forum.openstreetmap.org/viewtopi … 12#p112812

Можно просто отключить фильтр перед выводом xml-а:
binmode STDOUT;

Offline

Board footer

Powered by FluxBB