Skip to content

Instantly share code, notes, and snippets.

@Enchan1207
Created August 29, 2021 05:53
Show Gist options
  • Save Enchan1207/a15150027c6caa0f99038a87b90200d6 to your computer and use it in GitHub Desktop.
Save Enchan1207/a15150027c6caa0f99038a87b90200d6 to your computer and use it in GitHub Desktop.
vCard(連絡先カード)についてまとめる

vCardについて

Overview

vCardは、連絡先情報を共有するための文字列表現形式(およびそのテキストフォーマット)の一種。 スマートフォンからPDAまで幅広い端末が対応しているが、それゆえに表記揺れや独自規格も多く、 データの移行、特にOSをまたぐような移行においては問題が発生することがある。

Description

vCard形式のファイルには .vcf という拡張子が付くことが多い (以降vcfファイルと呼称する)。 vcfファイルには複数のvCardデータを含めることができる。つまり、複数人の連絡先をひとつのvcfファイルに格納することが可能。

vCardフォーマットには「バージョン」の概念がある。これは各vCardごとに定義することができ、 単一vcfファイル中で複数バージョンのvCardが共存していても問題はない。

現時点では 2.1, 3.0, 4.0 の三種類を確認している。 バージョン4.0ではvCard内にバージョン情報を必ず埋め込まなければならないと規定されている。

バージョン間の違いは主に文字列のエンコーディングである。バージョン2.1ではquoted-printableしか許容されていない(実装が多い)が、 3.0, 4.0ではutf-8等の現在一般的なエンコーディングで情報を直接記述することができる。

Definition

vCardの使用はRFC6350に定義されている。 (日本語訳版も存在する)

Format

vCard

vCardのフォーマットを以下に示す。

vCard
 │
 ├── group
 │    ├── property
 │    │    ├── value
 │    │    ├── parameter
 │    │    └── parameter
 │    └── property
 │         ├── value
 │         ├── parameter
 │         └── parameter
 ├── property
 │    ├── value
 │    ├── parameter
 │    └── parameter
 └── property
      └── value

vCardは複数のpropertyを持ち、propertyは一つのvalueおよび複数のpatameterを持つ。 propertyはvCardの持つ情報 (フルネーム、メールアドレス、電話番号など) を扱い、 parameterはその詳細 (メールアドレスの種類や、電話番号が携帯のものか固定電話のものなのか など) を扱う。 propertyは複数まとめてgroupとして扱われることもある。

vcf-file

バージョン3.0のvCardを一つ格納したvcfファイルのフォーマットを以下に示す。

BEGIN:VCARD
VERSION:3.0
PRODID:-//Apple Inc.//iPhone OS //EN
FN:鈴木 一朗
X-PHONETIC-FIRST-NAME: イチロウ
X-PHONETIC-LAST-NAME: スズキ
item1.EMAIL;type=INTERNET;type=pref: ichirou@example.com
item1.X-ABLabel: 携帯
item2.EMAIL;type=INTERNET: mariners_ichirou@example.com
item2.X-ABLabel: Seattle Mariners
TEL;type=CELL;type=VOICE;type=PREF:000 0000 0000
item4.URL;type=pref: https://example.com
item4.X-ABLabel: homepage
BDAY:1973-10-22
N:鈴木;一朗;;;
END:VCARD

各プロパティの詳細はここでは省略する。ここでは概要として

BEGIN:VCARD

で始まり、

(プロパティグループ名).(プロパティ名);(パラメータ名)=(値): (プロパティ値)

という形式でフォーマットが列挙され、

END:VCARD

で終わるということを示しておく。

プロパティのグループ化

vCard 3.0 以降(要検証)では複数のプロパティを「グループ化」することができる。 グループ化することで単一のプロパティ同士に関連を持たせることができるため、パラメータでは示しきれない情報を付加する等の用途を想定していると思われる。

筆者が確認した限りでは、 icloud連絡先をエクスポートすると 「メールアドレスの種別」を付加するための手段としてグループ化が用いられていた:

item1.EMAIL;type=INTERNET: 00001@example.com
item1.X-ABLabel:_$!<School>!$_

この場合、グループ"item1"は

  • INTERNET 用のメールアドレス 00001@example.com
  • メールアドレスの X-ABLabel (Address-Book Label?) は _$!<School>!$_

という二つのプロパティを包括して持っていることになる。 _$!<School>!$_はicloud連絡先上では 学校 と置き換わる(ロケールを想定している?)。

過去のバージョンとの互換性

ほとんどのプロパティはバージョンを跨いで利用できるが、アプリケーション側ではその限りではない。

例えばAndroidの「連絡先」からデータをエクスポートするとvCard 2.1形式のvcfファイルが出力されるが、 icloud連絡先はvCard 3.0以前には対応していない。そのため、単純にvcfファイルを移動するだけでは移行できない。

どうやらvCard 3.0ではquoted-printableに対応していないようで、

  • 移行元のバージョンをv2.1からv3.0に変更
  • quoted-printable でエンコードされた非ASCII文字をUTF-8等でデコードし、 CHARSET パラメータにUTF-8を含めて元のプロパティに付加する

という処置が必要になる。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment