Node.jsは基本的にUTF8のみをサポートしています.
そのため、Shift_JISを始めとする別の文字コードにを扱うには,別途ライブラリを導入する必要があります.
1.利用するライブラリ
node-iconv: 文字コードの変換に利用します.
node-icu-charset-detector: 文字コードの判別に利用します.
これらを用いて文字コードをUTF8へ変換することでNode.jsでも利用可能なようにします.
2.インストール
node-iconvは簡単です.
1 |
% npm install node-iconv |
node-icu-charset-detectorはlibicuに依存しているので、先にこれをインストールする必要があります.
インストール方法は環境ごとに分かれています.
この手順に従ってNode.jsを動かしている場合(=portsがインストールされている環境)は以下のようにインストールします.
1 2 3 |
% cd ~/usr/ports/devel/icu % make install |
その他の環境については公式サイトから引用します.
Linux
- Debian (Ubuntu)
apt-get install libicu-dev
- Gentoo
emerge icu
- Fedora/CentOS
yum install libicu-devel
OSX
- MacPorts
port install icu +devel
- Homebrew
12brew install icu4cbrew link icu4c --force
If experiencing issues with ‘homebrew’ installing version 50.1 of icu4c, try the following:
123456brew search icu4cbrew tap homebrew/versionsbrew versions icu4c<span class="pl-s3">cd</span> <span class="pl-s1"><span class="pl-pds">$(</span>brew --prefix<span class="pl-pds">)</span></span> <span class="pl-k">&&</span> git pull --rebasegit checkout c25fd2f <span class="pl-s1"><span class="pl-pds">$(</span>brew --prefix<span class="pl-pds">)</span></span>/Library/Formula/icu4c.rbbrew install icu4c - From source
12345678curl -O http://download.icu-project.org/files/icu4c/52.1/icu4c-52_1-src.tgztar xzvf icu4c-4_4_2-src.tgz<span class="pl-s3">cd</span> icu/sourcechmod +x runConfigureICU configure install-sh./runConfigureICU MacOSXmakesudo make installxcode-<span class="pl-k">select</span> <span class="pl-vo">--install</span>
icuのインストールが出来たら、npmでインストールします.
1 |
% npm install node-icu-charset-detector |
3. 文字コードの判別・変換
文字コードの判別・変換のためのコードは単純です.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<span class="pl-k">function</span> <span class="pl-en">bufferToString</span>(<span class="pl-smi">buffer</span>) { <span class="pl-k">var</span> charsetDetector <span class="pl-k">=</span> <span class="pl-c1">require</span>(<span class="pl-s"><span class="pl-pds">"</span>node-icu-charset-detector<span class="pl-pds">"</span></span>); //文字コード判別用ライブラリのロード <span class="pl-k">var</span> charset <span class="pl-k">=</span> charsetDetector.detectCharset(buffer).<span class="pl-c1">toString</span>(); //バッファの文字コードを判定し,Iconvに渡せるよう文字列に変換 <span class="pl-k">try</span> { <span class="pl-k">return</span> buffer.<span class="pl-c1">toString</span>(charset); // 単純に文字コード指定のtoStringで変換できるか試す. } <span class="pl-k">catch</span> (x) { <span class="pl-k">var</span> Iconv <span class="pl-k">=</span> <span class="pl-c1">require</span>(<span class="pl-s"><span class="pl-pds">"</span>iconv<span class="pl-pds">"</span></span>).Iconv; //エラーが発生したら文字コード変換用ライブラリをロード. <span class="pl-k">var</span> charsetConverter <span class="pl-k">=</span> <span class="pl-k">new</span> <span class="pl-en">Iconv</span>(charset, <span class="pl-s"><span class="pl-pds">"</span>utf8<span class="pl-pds">"</span></span>); //変換元をとして判定した文字コード,変換先としてutf8を指定 <span class="pl-k">return</span> charsetConverter.convert(buffer).<span class="pl-c1">toString</span>(); } } // ファイルを読込み文字列として扱う例. <span class="pl-k">var</span> buffer <span class="pl-k">=</span> fs.readFileSync(<span class="pl-s"><span class="pl-pds">"</span>/path/to/the/file<span class="pl-pds">"</span></span>); <span class="pl-k">var</span> bufferString <span class="pl-k">=</span> bufferToString(buffer); |