[2009-08-27]
携帯vCardからgmail用ふりがなデータつきvCardデータへ変換
gmailと自分の持っている携帯(softbank 821SH)との間で電話帳をsyncしたくて、いろいろ探していたのですが、gmailとはふりがなの同期ができないとの記述ばかりであきらめかけていました。
最近、変わったのかもしれませんが、gmailがエクスポートしてくれるvCardデータにそれらしきカラムがあるのを発見したので、結局自分で変換用のperl scriptを実装しちゃいました。
もし、同じようなことをしようとしていて悩んでいる人がいれば、なにかの足しにしてください。
vcard.pl
#!/usr/bin/perl
# sharp携帯のvcardデータをgmail対応に変換するスクリプト
use strict;
use warnings;
use utf8;
use Encode;
use feature qw(say switch);
use MIME::QuotedPrint;
my @cards;
my $card;
my @src = <>;
while (my $line = shift @src) {
$line =~ s/\r?\n$//;
while (@src and $src[0] =~ /^(\s|\=)/i) {
my $l = shift @src;
$l =~ s/^.(.*)\r\n$/$1/;
$line .= $l;
}
my ($key, $value) = split /:/, $line, 2;
given ($key) {
when ('BEGIN') {
$card = {};
}
when ('END') {
push @cards, $card;
}
when (/^(N|TEL|EMAIL|ADR|NOTE|URL)\b/) {
# デコードのみ
$value = decode_vcard(\$key, $value);
push @{$card->{$key}}, $value;
}
when (/^SOUND\b/) {
# デコードして、フリガナに
($card->{'X-PHONETIC-LAST-NAME'}, $card->{'X-PHONETIC-FIRST-NAME'}) = split /;/, decode_vcard(\$key, $value);
}
when (/^X-GN\b/) {
# グループ名 - noteへ
push @{$card->{NOTE}}, decode_vcard(\$key, $value);
}
}
}
# 出力
foreach my $v (@cards) {
print "BEGIN:VCARD\r\nVERSION:2.1\r\n";
foreach my $k (keys %$v) {
if (ref $v->{$k} eq 'ARRAY') {
foreach my $val (@{$v->{$k}}) {
print Encode::encode_utf8("$k:$val\r\n");
}
} else {
if ($v->{$k}) {
print Encode::encode_utf8("$k:$v->{$k}\r\n");
}
}
}
print "END:VCARD\r\n";
}
sub decode_vcard {
my $key = shift;
my $src = shift;
my @dst;
return '' unless ($src);
my $charset;
my $encode;
if ($$key =~ s/(^|;)CHARSET\=(.*?)(;|$)/$3/) {
$charset = 'shift_jis'; # $1;
}
if ($$key =~ s/(^|;)ENCODING\=QUOTED\-PRINTABLE(;|$)/$2/) {
$encode = 1;
}
my @src = split /(.*?;)/, $src;
foreach (@src) {
if ($encode) {
$_ = decode_qp($_);
}
if ($charset) {
$_ = h2z(Encode::decode($charset, $_));
}
push @dst, $_;
}
return join('', @dst);
}
sub h2z {
local $_ = shift;
s/ヴ/ヴ/g;
s/ガ/ガ/g;
s/ギ/ギ/g;
s/グ/グ/g;
s/ゲ/ゲ/g;
s/ゴ/ゴ/g;
s/ザ/ザ/g;
s/ジ/ジ/g;
s/ズ/ズ/g;
s/ゼ/ゼ/g;
s/ゾ/ゾ/g;
s/ダ/ダ/g;
s/ヂ/ヂ/g;
s/ヅ/ヅ/g;
s/デ/デ/g;
s/ド/ド/g;
s/バ/バ/g;
s/ビ/ビ/g;
s/ブ/ブ/g;
s/ベ/ベ/g;
s/ボ/ボ/g;
s/パ/パ/g;
s/ピ/ピ/g;
s/プ/プ/g;
s/ペ/ペ/g;
s/ポ/ポ/g;
tr[ァィゥェォッャュョアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲン゛゜ー、。・「」\x{ff5e}\x{2225}\x{ff0d}\x{ffe0}\x{ffe1}\x{ffe2}]
[ァィゥェォッャュョアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲン゛゜ー、。・「」\x{301c}\x{2016}\x{2212}\x{00a2}\x{00a3}\x{00ac}];
$_;
}
| Permalink | トラックバック ( 0 ) | コメント ( 0 / 0 ) | すぎた / 2009-08-27 22:05:48 |