電子書籍の厳選無料作品が豊富!

シフトJISの文字列をMIMEエンコード(RFC2047)
(メールのヘッダに使うような、=?ISO-2022-JP?B?・・・というようなヤツ)
に変換する、unix系gcc(C++ではなくてC)でコンパイルできるライブラリ、
ないでしょうか。。?

途中まで作りかけたのですが、
あまりに複雑でギブアップしてしまいまして。。
また、用途上、nkfなどの外部プログラムは呼び出せないのです。

A 回答 (5件)

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文字単位でバッファリングして行内の文字列をカウントして条件をコントロールすれば大丈夫です。

どうでしょ?
    • good
    • 0
この回答へのお礼

さらに・・
4.base64エンコードの1行は最大76文字まで。
5.エンコード後文字列は1行ずつ独立してデコードできなくてはならない。(すなわち、KANJI-In/Outが1行ごとに必要。全角文字やエスケープシーケンスが行をまたぐのはもってのほか)

このへんの条件が、非常にやっかいだったりします。。
でも、1文字ずつバッファリングしながら条件をコントロールしていけば、
無理ではなさそうですね。頭の中整理して、再挑戦してみます。
ありがとうございました!

お礼日時:2005/09/29 21:22

#2です。



nkfなどが呼び出せないとのことだったので、コード変換が問題になっているのかと勘違いしていました。

Unix系のGCCで使えるMIMEのライブラリがあればいいんですね。
それなら、TcllibのTCL MIMEはいかがでしょうか? Tclが必要になりますが、Cからライブラリとして使えますし、扱いも非常に簡単です。

参考URL:http://tcllib.sourceforge.net/doc/mime-README.html
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/09/29 21:23

blat.cpp


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

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

お礼日時:2005/09/29 09:17

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



参考URL:http://www.gnu.org/software/libiconv/
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/09/29 01:12

blatj


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

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

お礼日時:2005/09/29 01:08

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!