4

VCard 3 フォーマットの RFC 2426 によると、http://www.ietf.org/rfc/rfc2426.txt (セクション 2.4.1)

エンコードされたバイナリ データの長い行は、[MIME-DIR] で定義されている折りたたみ方法を使用して 75 文字に折りたたむ必要があります。

ただし、私が見たすべてのエンコーダーは、MIME 仕様 (つまり、commons、migbase64 など) に従って 76 文字で折りたたまれ、行の長さを指定できることがわかったエンコーダーは、「行の長さは 4 の倍数にする必要があります」と述べています。

75文字で折りたたむことができるJavaライブラリはありますか? そして正直なところ、「MUST」ではなく「SHOULD」について心配する必要がありますか?

4

3 に答える 3

1

base64 エンコーダーを見回した後、rfc に戻り、少し考え直した後、base64 エンコーダーは行を折りたたむ必要はないと思います。

データの base64 エンコーディングについて話すときは、折りたたみについて言及しています。

2.4.1 BINARY
[...]Long lines of encoded binary data SHOULD BE folded to 75 characters
using the folding method defined in [MIME-DIR]

それから 2.6 では、再び折り畳みについて言及しています

2.6 Line Delimiting and Folding
[...]   After generating a content line,
lines longer than 75 characters SHOULD be folded according to the
folding procedure described in [MIME DIR].

コンテンツ行は次のように定義されます

contentline  = [group "."] name *(";" param ) ":" value CRLF

(折りたたまれた値だけでなく、「フルライン」であることが重要です)

2.4.1 を見ると、バイナリ エンコーディングが行を折りたたむ必要があることを意味しますが、コンテンツ行の折りたたみ自体 (2.6) と競合しているようです。

バイナリデータの折り畳みと行の折り畳みの両方が適用された場合、「二重折り畳み」が発生しますが、これは意図されているとは思えません。(一部のやじが例が75文字ではないと言及することを知っているので..ただふりをして..ありがとう)すなわち

PHOTO;ENCODING=b;TYPE=JPEG:MIICajCCAdOgAwIBAgICBEUwDQY <= line folded
MIICajCCAdOgAwI   <=folded at 75 binary chars as per binary folding
kU6NuaJR+E9lJd8ux9JpuV8QS+w3wNThZJ9Tb2HNBr1B+GNO9fi75e  <= line folded
[...]

より合理的な解釈は、意図した出力は次のとおりです。

PHOTO;ENCODING=b;TYPE=JPEG:MIICajCCAdOgAwIBAgICBEUwDQY <=folded as per line folding
MIICajCCAdOgAwIkU6NuaJR+E9lJd8ux9JpuV8QS+w3wNThZJ9Tb2H <=folded as per line folding
NBr1B+GNO9fi75e[...]

2.4.1 は基本的に 2.6 のフォルダー要件を繰り返しているだけだと思います。これが正しければ、75 行の base64 エンコーダーは必要ないことを意味します。これは、vcard 自体の基本的な行の折り畳みによって目的の結果が得られるためです。

したがって、間違っていることが証明されない限り、当面はこの解釈で行きます。

于 2012-07-31T21:26:49.603 に答える
0

XML-RPC クライアント用の base64 エンコード/デコードを作成しました。githubで見つけることができます。MIT の下でライセンスされているため、このクラスを取り出してプロジェクトで使用することができます。行幅を調整するには、行 111を編集するだけです。

行の長さに固執しなければならないか、固執すべきかはわかりませんが、固執できるので、私はそうします:)

于 2012-07-27T09:28:45.577 に答える
0

折り線の長さは大した問題ではないと思います。おそらく、行をまったく折りたたまなくても済むでしょう。ただし、仕様では推奨されているため、回線が折りたたまれることを期待するアプリケーションが存在する可能性があります。

デフォルトの 75 文字を使用したくない場合は、ez-vcardを使用して各行の最大長を手動で定義できます。

VCard vcard = new VCard();

byte[] photoBytes = ...
PhotoType photo = new PhotoType(photoBytes, ImageTypeParameter.JPEG);
vcard.addPhoto(photo);

Writer writer = ...
VCardVersion version = VCardVersion.V3_0;
FoldingScheme foldingScheme = new FoldingScheme(76, " ");
VCardWriter vcr = new VCardWriter(writer, version, foldingScheme);
vcr.write(vcard);
vcr.close();

あなたが言及した「二重折り」については、あなたの仮定は正しいです。これは、バイナリ データが折り畳まれる方法ではありません。まず、バイナリ データが base64 に変換され、次に base64 文字列が折りたたまれます。

また、折りたたまれた行はすべて、少なくとも 1 つの空白文字で始まる必要があることに注意してください。以下の例では、2 行目と 3 行目がスペースで始まっていることに注目してください。

PHOTO;ENCODING=b;TYPE=JPEG:MIICajCCAdOgAwIBAgICBEUwDQY
 MIICajCCAdOgAwIkU6NuaJR+E9lJd8ux9JpuV8QS+w3wNThZJ9Tb2
 NBr1B+GNO9fi75e
于 2012-11-01T23:47:09.283 に答える