You are not logged in.
- Topics: Active | Unanswered
Announcement
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
Ну я ж говорю, где-то по дороге портится кодировка.
Вряд ли тут модуль виноват
По дороге откуда куда?
Может какие-то тесты написать?
Прога пока вот такая:
#!/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
До сих пор не пойму, что меня торкнуло этим заняться!
Offline
#37 2010-10-23 20:18:51
- Ilis
- Member
- From: Екатеринбург
- Registered: 2009-05-24
- Posts: 5,970
Re: perl + .osm
Нет там багов, есть недопонимание работы с кодировками.
Для начала почитать 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
Дык я ж говорил как: все промежуточные файлы писать и читать с фильтром :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
Объективные, объективные
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 и хочу заметить (совершенно в отрыве от темы), что набор значений тэга принято разделять точками с запятой, а не запятыми
Offline
#43 2010-10-23 21:45:27
- Upliner
- Member
- From: Kyiv
- Registered: 2008-09-18
- Posts: 845
Re: perl + .osm
Хотелось бы верить, что все эти проблемы действительно объективные
Не будь эти проблемы объективными, мы бы вообще не знали никаких проблем с кодировками
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
Я посмотрел changeset и хочу заметить (совершенно в отрыве от темы), что набор значений тэга принято разделять точками с запятой, а не запятыми
Если ты про 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
Ну в четвёртом же посте написано
Offline
#48 2010-10-24 07:52:36
- Ilis
- Member
- From: Екатеринбург
- Registered: 2009-05-24
- Posts: 5,970
Re: perl + .osm
Ещё пачку залил: http://www.openstreetmap.org/browse/changeset/6153635
Offline
#49 2010-10-24 07:59:00
- Ilis
- Member
- From: Екатеринбург
- Registered: 2009-05-24
- Posts: 5,970
Re: perl + .osm
Скажите тогда как мне после чтения из файла через фильтр потом печатать можно было по-русски?
Ну в четвёртом же посте написано
установи выходную кодировку.
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