• ベストアンサー

シフトJIS⇒MIMEエンコード(RFC2047)

シフトJISの文字列をMIMEエンコード(RFC2047) (メールのヘッダに使うような、=?ISO-2022-JP?B?・・・というようなヤツ) に変換する、unix系gcc(C++ではなくてC)でコンパイルできるライブラリ、 ないでしょうか。。? 途中まで作りかけたのですが、 あまりに複雑でギブアップしてしまいまして。。 また、用途上、nkfなどの外部プログラムは呼び出せないのです。

質問者が選んだベストアンサー

  • ベストアンサー
  • rentahero
  • ベストアンサー率53% (182/342)
回答No.4

iso-2022-jpのmimeですよねえ。 SJIS→JISのコンバートとbase64のエンコードはできたものとして、説明します。 確かに少し難しいですが、行カウントを工夫すれば可能ですよ。要は、 1. ASCII→JISのタイミングで16文字のヘッダが入る 2. base64エンコードでは、元のJIS文字列(エスケープシーケンス含む)のバイト長さ(3+文字数*2+3)/3*4がbase64のバイト長なので毎回計算して比較する 3. JIS→ASCIIのタイミング(行末も)では2文字のトレーラが入る この3点をカウントの際に条件づけるだけです。 簡単に計算すると、一度"=?iso..."とMIMEエンコードに入ると最低でも16+(3+1*2+3)/3*4+2=30バイトなければ抜けられない。 ASCII・JISを1文字単位でバッファリングして行内の文字列をカウントして条件をコントロールすれば大丈夫です。 どうでしょ?

noname#43437
質問者

お礼

さらに・・ 4.base64エンコードの1行は最大76文字まで。 5.エンコード後文字列は1行ずつ独立してデコードできなくてはならない。(すなわち、KANJI-In/Outが1行ごとに必要。全角文字やエスケープシーケンスが行をまたぐのはもってのほか) このへんの条件が、非常にやっかいだったりします。。 でも、1文字ずつバッファリングしながら条件をコントロールしていけば、 無理ではなさそうですね。頭の中整理して、再挑戦してみます。 ありがとうございました!

その他の回答 (4)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.5

#2です。 nkfなどが呼び出せないとのことだったので、コード変換が問題になっているのかと勘違いしていました。 Unix系のGCCで使えるMIMEのライブラリがあればいいんですね。 それなら、TcllibのTCL MIMEはいかがでしょうか? Tclが必要になりますが、Cからライブラリとして使えますし、扱いも非常に簡単です。

参考URL:
http://tcllib.sourceforge.net/doc/mime-README.html
noname#43437
質問者

お礼

Tclのライブラリを簡単に使うこともできるのですね。 調べてみようと思います。ありがとうございました。

  • uyama33
  • ベストアンサー率30% (137/450)
回答No.3

blat.cpp の中から、 shiftjis2...... に関連するサブルーチンだけを 抜き出して 一つのファイルにすれば よいとおもいます。

noname#43437
質問者

お礼

ありがとうございます。 ソース、見ましたが・・関数の依存関係が非常に広範囲にわたっている上に、C++ですので・・・ 開発環境が、Cオンリー、しかもmalloc使用不可という状況なので、 これを移植するのは相当大変そうです。。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

libiconvを使うことはできませんか?

参考URL:
http://www.gnu.org/software/libiconv/
noname#43437
質問者

お礼

ありがとうございます。 ドキュメントを読んでみましたが、残念ながら・・MIMEエンコードは、できないようですね。。 MIMEエンコードが絡んでくると、単純なShiftJIS⇒JISエンコードでは うまくいかなくなってしまうので、悩んでいます。。 (エンコード結果の行の折り返が関係してくるので・・)

  • uyama33
  • ベストアンサー率30% (137/450)
回答No.1

blatj で検索すると、 メールソフトのソースコードが見つかります。 この中に shiftjis2iso2022jp() という関数があります。 これを良く読めば 理解できると思います。

noname#43437
質問者

お礼

原理も、エンコードの仕様もわかるのですが、 あまりに複雑で、困っておりまして。 なにか、便利なライブラリがないかなと思っているのですが。。

関連するQ&A