• ベストアンサー

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

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

noname#43437
noname#43437

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

  • ベストアンサー
  • 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

  • シフトJIS/7ビットJISの変換ライブラリについて

    C/C++で使える漢字コード変換のライブラリを探しています。 以下の条件に当てはまるライブラリ等ご存じでしたら、教えていただけないでしょうか? 1.C/C++で使用可(VisualC++, BorlandC++Builderなど、Windows環境) 2.シフトJISと7ビットJISコードの変換が可能(sjis -> jis, jis -> sjis) 3.SI/SO方式(0x0E/0x0F)でカタカナ/アルファベットを切り替えている7ビットJISコードからシフトJISへの変換が可能。また、同様に、シフトJISからSI/SO方式の7ビットJISコードへの変換が可能 4.ソースコードがあれば尚良い。 特に、3.のSI/SO方式で変換可能ライブラリを探しているのですが、なかなか見つかりません。 「ESC(I」「ESC(J」「ESC$B」を使用してアルファベット/カタカナの変換はどのライブラリでもできているのですが、上記のSI/SO方式での変換ができません。 現在までに評価して駄目だったものをリストにしてみます。 これ以外にご存じの方、もしくは、このリストに載っているものでも可能だよ!、というご意見などいただければ幸いです。 ・nkf for windows http://www.vector.co.jp/soft/win95/util/se295331.html ・babel http://tricklib.com/cxx/ex/babel/ ・漢字コード変換ライブラリ http://www.vector.co.jp/soft/win95/prog/se087586.html ・ack http://hp.vector.co.jp/authors/VA004474/win/ack.txt ・SJET http://www.vector.co.jp/soft/dl/dos/util/se018396.html

  • gcc で シフトJISを通す方法をお教えください

    gcc で linux のソフトの開発をやっております。いろいろな都合でWindowsとソースの共通化をするため日本語はシフトjisを使っているのですが、たとえば"ソ"などで\をつけないといけません。しかし、これだと今度はWindowsで通らなくなります。私はゲーム機の開発もやってるのですが、私が使っているゲーム機用のgccは、なにかパッチがあててあるのか、LANG=C-SJIS と環境変数を定義しておけばシフトjisを通してくれます。linuxの普通のgccでも同じようなことをできるようにするパッチはないでしょうか?

  • シフトJISからUTF-8に変換

    UNIX系OSのC言語で文字列をシフトJISからUTF-8に変換する方法をご存知の方がいらっしゃいましたらご教授下さい。 なにとぞ宜しくお願いいたします。

  • メールヘッダのMIMEエンコードについて

    今、CGIでメールを送信するフォームを作成しているます。 日本語のsubjectを使う場合はMIMEエンコードをしなければいけないと聞いてmime_plsというライブラリで試してみたのですが、受信した結果、「1月1日」→「1 月 1 日」のように半角数字と全角文字の間にスペースが入ってしまいます。 これはどうしたらよいのでしょうか。 コードは以下のように書いています。 $mon = substr($reserveday, 4, 2); $day = substr($reserveday, 6, 2); $subject = sprintf("%d月%d日の件について", $mon, $day); &Jcode::convert(\$subject, 'jis'); $from = &mimeencode($from); $to = &mimeencode($to); $subject = &mimeencode($subject); $contents .= "本文"; &Jcode::convert(\$contents, 'jis'); my $send_buf=''; $send_buf .= "From: $from\n"; $send_buf .= "To: $to\n"; $send_buf .= "Subject: $subject\n"; $send_buf .= "Content-Type: text/plain; charset=iso-2022-jp\n"; $send_buf .= "Content-Transfer-Encoding: 7bit\n"; $send_buf .= "Mime-Version: 1.0\n"; $send_buf .= "\n"; $send_buf .= $contents; # メール送信 open(MAIL,"| $sendmail -t -i -f $from"); print MAIL $send_buf; close(MAIL); よろしくお願いします。

    • ベストアンサー
    • Perl
  • IEでエンコードでJISを指定したいのに選択できないのは何故?(再掲載)

    別ジャンルで掲載していたのですが、数日返事がいただけていないので、ジャンルを変えて再度書き込みしました。 IEを使ってインターネットのページを眺めているときに、まれにエンコードを解釈できなくて文字化けをすることがあります。 通常、エンコードで「日本語自動選択」「日本語(シフトJIS)」「日本語(EUC)」が選択できますが、JISの選択ができません。 要するに、Shift-JIS or EUC-JP or ISO-2022-JP(JIS) という選択が用意されていて当然だと思うのにないのが何故だろうという疑問です。 現在までの最新版にも存在していないと思うのですが、皆さんはこの手でみることができないページに遭遇した場合にはどのようにされているのでしょうか? (オペラでみるとかいう他のブラウザでというのは私も行っている方法ですが…) また、このようになっている理由をご存知の方はお教えいただけると嬉しいです。

  • mail()の文字化けについて

    HPでPHP3のmail()を使って利用者にmailを出しているのですが、 かなりの頻度で文字化けしてしまっています。 コンピュータ同士の相性の問題なのでしょうか? それともプログラムに不備(あるいはこうすれば解消する) があるのでしょうか。 是非是非とも御教授のほどお願いいたします。 OSはUNIX(Irixv6.5.1)でwebサーバはAppach、phpは4でなく3(そのためnkfでエンコードしてます)、文字コードはEUCでUPしています。 $to="(formで入力された利用者のアドレス)"; $subject="(固定)"; $body="(formで利用者が入力されたものあり)"; $header="Content-Type: Text/Plain;charset=iso-2022-jp\nFrom: office@○○○×××.com\n"; $pp=popen("echo '$subject' | /usr/local/bin/nkf -j","r"); while(!feof($pp)){ $jis_sub=$jis_sub.fgets($pp,1024); } $base64_sub=base64_encode($jis_sub); $mime_sub="=?ISO-2022-JP?B?".$base64_sub."=?="; $pp=popen("echo '$body' | /usr/local/bin/nkf -j","r"); while(!feof($pp)){ $jis_body=$jis_body.fgets($pp,1024); } mail($to,$mime_sub,$jis_body,$header);

    • ベストアンサー
    • PHP
  • インターネットヘッダ内の日本語のエンコード/デコード

    電子メールの件名やあて先など、日本語を使うと、 インターネットヘッダ内では、例えば以下のような ASCII文字にエンコードされていますが、 =?iso-2022-jp?Q?=1B$BEE;R%a!<%k$N7oL>?= これはどんな規則でエンコードされているのでしょうか。 つまり、メーラを使わずに手操作でデコードしたいのですが、 どのような手続きをとれば、日本語(シフトJISなど)に 変換できるのでしょうか? あるいは、フリーの変換ソフトなどがあれば、教えていただきたく 思っています。

  • C++でURLのエンコード

    文字列をShift-JisとUTF-8とEUCにエンコードしたいのですが、エンコードしてくれる関数とかC++でないですかね? やっぱり1バイトずつ調べて自分で変換するしかないのでしょうか? どなたかご教授お願いします。

  • gccとmakefileの基礎

    makefileの作り方を1から紹介している 書籍はあるでしょうか? 現在、 a.cとb.hとc.a をgccでコンパイルしたいのですが わかりません(汗 gcc -o test a.c b.h c.a じゃだめみたいです。 要するに1つのcファイルと1つのヘッダファイルと1つのライブラリ(静的or動的)を コンパイルする方法が知りたいのです。 ご教授お願い致しますm(____)m

  • gccに関する質問

    gccを実行するときの引数に関する質問です。 gccでコンパイルするときはヘッダーファイルのパスや、ライブラリ(拡張子が、.soのやつ)を指定しますがヘッダーファイルの方は、ソースファイルでもインクルードしているくらいだし、なんとか探してパスを指定すればよいのですが、ライブラリの場合はヘッダファイルと違ってインクルードする物ではないので、名前わからないし検討もつきません。 ヘッダファイルに該当するライブラリを探す方法はあるのでしょうか?