Fork me on GitHub

Palm Os+3.xでの名刺交換

  • Jun 02, 2006

categoryプラグインは存在しません。

OS 3.x で名刺交換などに用いる vCard を出力する際、サンプルにあるように ImcUtils の ImcWriteQuotedPrintable などを用いると、以下のような問題がある。

  • 英語版の機種の場合、TITLE, ORG, NOTE フィールドに CHARSET= という不正なプロパティが追加されてしまう。
  • QUOTED-PRINTABLE 処理が完全ではなく、8bit 文字がそのまま出力されてしまう。
  • 改行のない文書があった場合、1行が非常に長いデータができてしまう。

OS 4.0 以降の機種では PDI ライブラリを使えば、このような問題は起きない。

Addrex では、以下のような方法でこれを回避した。

  • CHARSET は ISO-8859-1 に固定。
  • 8bit 文字は全て QUOTE し、1行の文字数を制限した QUOTED-PRINTABLE 処理を自前で用意。

自前で用意した QUOTED-PRINTABLE は以下のような非常に簡単な処理。

char HexDigits[] = "0123456789ABCDEF";

static void PrvWriteQuotedPrintable(void *stream, PutStringF outputFunc, const Char *str) \{
 Char *ptr;
 Char buf[5];
 int column;

 outputFunc(stream, ";CHARSET=ISO-8859-1");
 outputFunc(stream, ";ENCODING=QUOTED-PRINTABLE:");
 column = 99;
 for (ptr = str; *ptr != nullChr; ptr ++) \{
   if (column > 72) \{
     buf[0] = '=';
     buf[1] = nullChr;
     outputFunc(stream, buf);
     outputFunc(stream, imcLineSeparatorString);
     column = 0;
   \}
   if ((*ptr >= '0' && *ptr <= '9') || (*ptr >= 'A' && *ptr <= 'Z') || (*ptr >= 'a' && *ptr <= 'z') /*TxtGlueCharIsAlNum(*ptr) は正しく動作しない*/
     || StrChr(" ,./-_()[]<>!|", *ptr)) \{ /* ここはもう少しまじめに用意したほうが良いかもしれない */
     buf[0] = *ptr;
     buf[1] = nullChr;
     outputFunc(stream, buf);
     column ++;
   \} else \{
     buf[0] = '=';
     buf[1] = *(((*ptr >> 4) & 0xf) + HexDigits);
     buf[2] = *((*ptr & 0xf) + HexDigits);
     buf[3] = nullChr;
     outputFunc(stream, buf);
     column += 3;
   \}
 \}
\}

commentプラグインは存在しません。

目次