node.js今日は、このとろころ、暑いくらいだったり、寒かったりとの気温の変化に息子達や自分もついていけずに、長男の通院や、次男の通院で午前休を消費している@kjunichiです。背景WindowsでCビルド環境が入っていない環境下でnode.jsでSMTPを受けるサーバーを書いていた。世界で活躍するエンジニアと違い、自分は日本語を含むメールしか扱わないため、iso-2022-jpでエンコードされている文字コードをUTF-8にしてコンソールに表示する必要があった。node.js向けのiconvパッケージがいくつか見るかるも、パフォーマンス重視しているようで、libiconvのCでのバインドだった。この為、使えなかった。sjisをutf-8に変換するjsピュア実装はあるも、JISをUTF-8にする実装は見つけることが出来なかった。Emscriptenでやってみるか!別環境でlibiconvをemscriptenでビルドテスト用のSMPTサーバーを動かす環境はビルドツールの類がないので、cloud9のIDEのターミナル越しに某所のOSXマシンにsshして作業を進めた。emconfigure時に--enable-staticを付けるだけで行けた。ちなみに、静的ライブラリにしておかないと、後の作業でつくるラッパーをemccでリンク出来ない。makeうまくいけば、./lib/.lib/libiconv.aが作られる。(xml.js)jsから呼びやすい関数にしておくnodeでrequire('libiconv.a')なんてできれば便利なのだが、それは出来ないようで、ラッパーを作る必要がある。今回はテストで使う一時的なものなので、mallocしてメモリーリーク問題(jsで使うから関係ないかもw)を避けるべく、4096バイトの上限を設けて処理することにした。"iconv.h"としてローカルのヘッダを参照するようなコードにしておき、以下の作業を進める。以下のコマンドで、libiconv.aを含めたjsファイルを生成する。require('fs');eval(fs.readFileSync('./jis2utf8lib.js'));jsでchar*を渡すには呼び出し先で参照のみの文字列を渡す場合Module.cwrapで'string'を指定すれば、文字列を渡すこが出来る。呼び出し先に編集して貰うchar*を渡すにはModule.cwrapで'number'を指定し、Module._mallocで必要な領域を確保して渡せば、js化したC言語の関数内で処理した結果を受け取ることが可能。nBuf.toString('utf8');}まとめこの記事書き終わろうとしている頃、sjisをutf-8に変換するjsピュア実装のリンクを貼ろうとググったらjconvがあっさり見つかった。11:53Tweet広告を非表示にする関連記事2017-11-29公式のOpenCVでWASM版OpenCV.jsがビルドできたのでnode.jsで動かそうとした件おはようございます。先週なんとなく、熱っぽいことがあった次...2015-10-022015年第3四半期振り返りおはようございます。iPhone6sを手に入れた次の日は長男の習い...2014-09-302014年第3四半期振り返りおはようございます。週末は、奥さん仕事で不在だったので、二...2014-04-17jsdo.itでEmscriptenを動かすときのメモおはようございます。次男が数歩あるいた@kjunichiです。»プロフィールid:kjw_junichiブログ名の通りです。(51)はてなブログをはじめよう!kjw_junichiさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。