今回は、AWS Lambdaで文字コードを変換する方法を紹介。
iconv のネイティヴビルド問題
普通にAWS LambdaのNode.js で文字コードを変換しようと思うと、おそらくnode-iconv を利用すると思うが、これはネイティヴビルドを要するためかなり煩雑なやり方でパッケージングしなければならない。下記のようなやり方でやればできる模様。
AWS Lambda FunctionをNative Moduleを含んだ形で作成してみた | Developers.IO
ただこれをするには、わざわざAmazon Linuxを用意しなければならないし、iconvとnpm install でうまく関連付ける必要などもあって、正直なところよくわからなかった。
てことで他の方法を模索した。
コマンドを直接実行
以下の記事で、非常に興味深い調査結果がある。
なんと、標準でiconvがbinの中に入っている模様。てことは外部プログラムでiconvを実行すればいけそう! てことで以下のようなコードを書いた。
var filepath = "/tmp/aaaa"; var content = "Shift-JIS の文字列"; try { fs.writeFileSync(filepath, content); // change shif-jis to utf8 var exec = require('child_process').exec; var cmd = "iconv -f sjis -t utf-8 " + filepath; var child = exec(cmd, function(err, stdout, stderr) { if (err) callback(err); callback(null, stdout); }); } catch (err) { callback(err); }
結果は見事大成功。これができなかったら、本当に諦めるところだった。助かりました。
まだまだ AWS Lambda の知見が少ないから、これを使っての実装はかなりのスリルさを味わえる。これも新しい技術の醍醐味ってやつかな。
2018/01/13 追記
Node.js の iconv-lite
ってのを使えば簡単に変換できるようになっていた。
jschardet = require('jschardet'); iconv = require('iconv-lite'); var body = "some string...."; var detectResult = jschardet.detect(body); var buf = new Buffer(body, 'binary'); var convertedString = iconv.decode(buf, detectResult.encoding);