<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!-- <base href = "http://localhost/~ckhung/"> -->

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <meta name="generator" content=
  "HTML Tidy for Linux/x86 (vers 6 November 2007), see www.w3.org" />
  <?php include "../../iu/meta.php" ?>

  <title>vcf2csv 與 csv2vcf: 試算表與 Android
  通訊錄互相轉換檔案格式</title>
</head>

<body>
  <?php include "../../iu/header.php" ?>

  <div id="content">
    <h1>vcf2csv 與 csv2vcf: 試算表與 Android
    通訊錄互相轉換檔案格式</h1>

    <p>(<a href="index.en.php">English version</a>)</p>

    <p>還好老婆買的新手機是 HTC Aria 而不是 iPhone。
    所以我決定值得花一些時間,
    幫她把試算表檔案裡面的通訊錄轉換到她的智慧手機上面。
    在這裡分享三支小程式, 方便大家將通訊錄在 .vcf 與 .csv
    兩個格式之間互轉。 前者是 Android 的格式;
    後者方便電腦上試算表軟體編輯。 快速使用指南: 將 <a href=
    "download.php">即時打包檔</a> 解壓縮, 然後就可以在 linux
    電腦上:</p>

    <ol>
      <li>產生可編輯的檔案: <code>./qp28bit &lt; contacts.vcf |
      ./vcf2csv &gt; editable.csv</code></li>

      <li>用 oocalc 編輯 editable.csv</li>

      <li>將它轉回 vcf 檔讓 Android 匯入: <code>./csv2vcf &lt;
      editable.csv &gt; new-contacts.vcf</code></li>
    </ol>

    <p>以下是詳細解說:</p>

    <ol>
      <li><a href="qp28bit">qp28bit</a> 把 .vcf 檔案裡面每一個
      (可能跨越數列的) quoted-printable 編碼字串改成全部放在同一列的
      8-bit 編碼字串。 例如: <code>./qp28bit <a href=
      "contacts.vcf">contacts.vcf</a> &gt; contacts-8bit.vcf</code>
      會將解碼完的字串放入新的檔案 contacts-8bit.vcf 當中,
      方便你使用任何純文字編輯器閱讀/編修。 對於 Android 所匯出的檔案,
      有時我必須如此解碼兩次。</li>

      <li><a href="vcf2csv">vcf2csv</a> 把 <em>不含跨列欄位的</em>
      Android 的通訊錄格式 .vcf 轉成試算表格式 .csv。 更精確地說, (1)
      請先用 qp28bit 處理過您的 .vcf 檔, 再餵給 vcf2csv 吃 (2) PHOTO
      欄位會默默地消失。 例如: <code>./vcf2csv <a href=
      "contacts-8bit.vcf">contacts-8bit.vcf</a> &gt;
      editable.csv</code> 將 contacts-8bit.vcf 轉成 calc (OO.o
      的試算表軟體) 可以讀取的 editable.csv。 若在命令列上指定 -d,
      則可更改分隔符號 (原本是 ",")。 例如: <code>./csv2vcf -d '#'
      contacts.vcf &gt; editable.csv</code> 所產生 csv
      檔採用井號而非逗號作為分隔符號。</li>

      <li><a href="csv2vcf">csv2vcf</a> 把試算表檔案轉成 Android
      的通訊錄格式。 例如: <code>./csv2vcf <a href=
      "editable.csv">editable.csv</a> &gt; new-contacts.vcf</code> 將
      editable.csv 轉成 new-contacts.vcf .
      如果您的輸入檔案所採用的分隔符號不是逗號, 也可在命令列上指定 -d
      選項。</li>
    </ol>

    <p>這些程式碼超級精簡, 只能處理最普通的檔案, 而且沒有防錯機制。
    更明確地說:</p>

    <ol>
      <li>這些程式不處理引號。 也就是說, 您的資料內不可含有逗號; 或者,
      若一定要用逗號, 那麼您就必須用 -d 指定不同的分隔符號。</li>

      <li>這些程式都假設入資料採用 utf8 字元集。 如果你查看 qp28bit
      的原始碼就會明顯地看到這個假設。 若您的試算表軟體匯出檔案時,
      採用其他字元集 (例如 big5, gb2312, ...), 則需要先用 iconv
      指令轉檔。</li>

      <li>csv2vcs 採用比較簡單的 8-bit encoding 而不是原來比較複雜的
      quoted-printable encoding。 總之 Android 可以接受就好了。</li>

      <li>三支程式的輸出格式都採用 Linux 格式的換列 -- 換列字元是 LF
      單獨一個, 而非 CR LF 兩個字元。</li>
    </ol>

    <p>好吧, excel 也可以讀寫 csv 檔啦。 但是下次請給 OO.o 一個機會,
    好嗎? 就當做是對我的回饋吧。</p>

    <h2>不同廠牌手機及應用軟體的注意事項</h2>

    <p>不同廠牌的智慧手機, 或不同的應用軟體,
    所採用的欄位名稱可能略有出入。
    以下列出我所知道的手機及軟體的注意事項:</p>

    <ol>
      <li>欲匯入 vcf 檔至 gmail, 應先將所有的 "EMAIL;INTERNET" 改為
      "EMAIL;HOME", 變成 <a href="gmail.vcf">像這樣</a>。</li>

      <li>欲匯入 csv 檔至 zimbra, 應先將欄位名稱改為: "firstName",
      "lastName", "fullName", "homePhone", "mobilePhone", "workPhone",
      "email", "email2",... 等等, 變成 <a href=
      "zimbra.csv">像這樣</a>。</li>
    </ol>

    <h2>留言/討論?</h2>

    <p>您有使用上的問題嗎? 請到 <a href=
    "http://newtoypia.blogspot.com/2010/08/vcf2csv-csv2vcf-android.html">
    這帖部落格</a> 留言。</p>

    <h2>歷史</h2>

    <ul>
      <li>2011/02/07: 完全重寫。
      用三個比較模組化的指令取代原先兩個雜亂、 有 bug 的指令。</li>

      <li>2010/08/18: 初版</li>
    </ul><?php include "footer.php" ?>
  </div><?php include "$top[fs]/iu/navigator.php" ?>
</body>
</html>
