Λάδι Βιώσας

http://profile.hatena.ne.jp/kenkitii/

vCard をいじるサンプル

今年になって Android 携帯からガラケーに戻したんですが、そこで困ったのがアドレス帳の移行。ガラケーからスマフォにする人の例はネットのあちこちに情報があるものの、その逆はみつからず(まぁそりゃそうか)。いろいろ考えて、vCard形式でエクスポートして直にいじってガラケーにインポートするのが一番はやいという結論に達し、rubyスクリプト書いたときの備忘録です。

頭こんがらがるのでまず整理

  vCard 文字コード 改行コード
自分の携帯 2.1 Shift-JIS CRLF
Google コンタクト 3.0 UTF8 CRLF
作業用 Mac - UTF8 CR

準備

vPim: vCard形式などを扱えるモジュール。
Moji: 全角半角などの文字種変換するモジュール。便利!

gem install vpim
gem install moji

vCard の dump (2.1/3.0どちらでもおk)

#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
require 'rubygems'
require 'vpim/vcard'

ARGV.each do |file|
  cards = Vpim::Vcard.decode(open(file))
  cards.each do |card|
    begin
      puts "#{card.name.fullname}"
    rescue
      puts "! failed to decode name!"
    end

    card.each do |field|
      puts " group=#{field.group}" if field.group
      puts "..#{field.name.capitalize}=#{field.value.inspect}"
    end
    puts "---"
  end
end

vCard(2.1形式)作成

API を直に呼んだほうがよいっぽい

require 'nkf'
require 'rubygems'
require 'vpim/vcard'

card = Vpim::DirectoryInfo.create(
  [Vpim::DirectoryInfo::Field.create('VERSION', '2.1')], 'VCARD')
card << Vpim::DirectoryInfo::Field.create('N', 'Licca Kayama', 'CHARSET' => 'SHIFT_JIS')
card << Vpim::DirectoryInfo::Field.create('SOUND', 'カヤマリカ', 'CHARSET' => 'SHIFT_JIS', 'TYPE' => 'X-IRMC-N')
card << Vpim::DirectoryInfo::Field.create('TEL', '0336042000', 'TYPE' => 'VOICE')
card << Vpim::DirectoryInfo::Field.create('EMAIL', 'hoge@example.com', 'TYPE' => 'INTERNET')
card << Vpim::DirectoryInfo::Field.create('ADR', '東京都葛飾区立石7丁目9-10', 'CHARSET' => 'SHIFT_JIS', 'TYPE' => 'WORK')

puts NKF.nkf('-sxm0', card.to_s.gsub("\n", "\r\n")) # shiftjis + CRLFに変換

ガラケーのフリガナは

SOUND;X-IRMC-N;CHARSET=SHIFT_JIS:カヤマリカ

という感じだけど Google コンタクトでは

X-PHONETIC-FIRST-NAME:リカ
X-PHONETIC-LAST-NAME:カヤマ

な感じになってます。

はまりポインツ

String#toutf8 すると、半角カナって自動で全角カナになってしまうのね、知らなかった。半角カナを ShiftJIS に変換するときは、明示的に入力テキストの文字コードを指定するか、もしくは NKF でやるのを忘れずに。