macにnkfコマンドがないだと！？じゃあ入れよう！


# nkfコマンドって何よ？
端的には『文字コード変換ツール』だ。
今回やりたかったのは改行コードの変更だったので```tr```コマンドでよかったのだけど、```nkf```コマンドの素敵具合を思い出して、過去のshell資産などを使えるかなぁと実行しようとしたら、

```
bash: ./hogehoge.sh: /bin/sh^M: bad interpreter: No such file or directory
```
こんなエラーが出て悲しくなった。
悲しくなったので楽しいことをしようと考えた。
ただそれだけだ。
尚、macに```tr```コマンドは入ってる。
___
# じゃあインストールだ！
わたくしは何を血迷ったかmacportでパッケージ管理してるので、

```
$ port search nkf
nkf @2.1.3_3 (textproc, japanese)
    Network Kanji code conversion Filter

p5-nkf @2.130.0 (perl, textproc, japanese)
    A perl extension module to use nkf.

p5.8-nkf @2.130.0 (perl, textproc, japanese)
    A perl extension module to use nkf.

p5.10-nkf @2.130.0 (perl, textproc, japanese)
    A perl extension module to use nkf.

p5.12-nkf @2.130.0 (perl, textproc, japanese)
    A perl extension module to use nkf.

p5.14-nkf @2.130.0 (perl, textproc, japanese)
    A perl extension module to use nkf.

p5.16-nkf @2.130.0 (perl, textproc, japanese)
    A perl extension module to use nkf.

Found 7 ports.
$ sudo port install nkf
--->  Fetching archive for nkf
--->  Attempting to fetch nkf-2.1.3_3.darwin_13.x86_64.tbz2 from http://jog.id.packages.macports.org/macports/packages/nkf
--->  Attempting to fetch nkf-2.1.3_3.darwin_13.x86_64.tbz2.rmd160 from http://jog.id.packages.macports.org/macports/packages/nkf
--->  Installing nkf @2.1.3_3
--->  Activating nkf @2.1.3_3
--->  Cleaning nkf
--->  Updating database of binaries: 100.0%
--->  Scanning binaries for linking errors: 100.0%
--->  No broken files found.
```
でOK

Homebrewの方は、
[[Mac] nkf を Homebrew でインストール](http://codenote.net/mac/homebrew/1747.html)
ここらを参照。
___
# nkfコマンドの使い方
ついでなので、自分用備忘録にコマンドの使い方をまとめておく。

まずはhelpを見る。
UNIXやLinux、macを触る際の基本だね。
大抵オプションは```-h```か```--help```だ。

```
$ nkf --help
Usage:  nkf -[flags] [--] [in file] .. [out file for -O flag]
 j/s/e/w  Specify output encoding ISO-2022-JP, Shift_JIS, EUC-JP
          UTF options is -w[8[0],{16,32}[{B,L}[0]]]
 J/S/E/W  Specify input encoding ISO-2022-JP, Shift_JIS, EUC-JP
          UTF option is -W[8,[16,32][B,L]]
 m[BQSN0] MIME decode [B:base64,Q:quoted,S:strict,N:nonstrict,0:no decode]
 M[BQ]    MIME encode [B:base64 Q:quoted]
 f/F      Folding: -f60 or -f or -f60-10 (fold margin 10) F preserve nl
 Z[0-4]   Default/0: Convert JISX0208 Alphabet to ASCII
          1: Kankaku to one space  2: to two spaces  3: HTML Entity
          4: JISX0208 Katakana to JISX0201 Katakana
 X,x      Convert Halfwidth Katakana to Fullwidth or preserve it
 O        Output to File (DEFAULT 'nkf.out')
 L[uwm]   Line mode u:LF w:CRLF m:CR (DEFAULT noconversion)
 --ic=<encoding>        Specify the input encoding
 --oc=<encoding>        Specify the output encoding
 --hiragana --katakana  Hiragana/Katakana Conversion
 --katakana-hiragana    Converts each other
 --{cap, url}-input     Convert hex after ':' or '%'
 --numchar-input        Convert Unicode Character Reference
 --fb-{skip, html, xml, perl, java, subchar}
                        Specify unassigned character's replacement
 --in-place[=SUF]       Overwrite original files
 --overwrite[=SUF]      Preserve timestamp of original files
 -g --guess             Guess the input code
 -v --version           Print the version
 --help/-V              Print this help / configuration
Network Kanji Filter Version 2.1.3 (2013-11-22) 
Copyright (C) 1987, FUJITSU LTD. (I.Ichikawa).
Copyright (C) 1996-2013, The nkf Project.
```

## 文字コードチェック
テキストやスクリプトの文字コードを調べたい場合```-g```でOK

```:ex
$ nkf -g hoge.txt
ASCII
```
いやこの例だと意味ないじゃん。ｗ
日本語の文字コードを調べる場合に使うので、```UTF-8```とか```Shift_JIS```とか```EUC-JP```という返り値が返ってくる。
昔からの癖でスクリプト類に２バイト文字使うの嫌いなんだよな……。

## 文字コード変換
とりあえず、Shift_JIS変換、EUC変換、JIS変換、UTF-8変換を記載しておく。
UTF-16は今のところ使ったことがないので省略。

### SJISコードへ変換
Shift_JIS変換は、```-s```
上が元テキストが残る形、下は上書き。

```:ex
$ nkf -s hoge.txt > moga.txt
$ nkf -s --overwrite hoge.txt
```

### EUCコードへ変換
EUC変換は、```-e```
上が元テキストが残る形、下は上書き。

```:ex
$ nkf -e hoge.txt > moga.txt
$ nkf -e --overwrite hoge.txt
```
### JISコードへ変換
JIS変換は、```-j```
上が元テキストが残る形、下は上書き。

```:ex
$ nkf -j hoge.txt > moga.txt
$ nkf -j --overwrite hoge.txt
```
### UTF-8(BOMなし)コードへ変換
UTF-8(BOMなし)変換は、```-w	```
最近、Java周りでxmlファイルにBOMがついてることがあり、その場合エラーが発生するので、この変換で取り去るといいだろう。
上が元テキストが残る形、下は上書き。

```:ex
$ nkf -w hoge.txt > moga.txt
$ nkf -w --overwrite hoge.txt
```
### UTF-8(BOMあり)コードへ変換
UTF-8(BOMあり)変換は、```-w8```
上が元テキストが残る形、下は上書き。

```:ex
$ nkf -w8 hoge.txt > moga.txt
$ nkf -w8 --overwrite hoge.txt
```


## 改行コード変換
改行コードはWindowsがCR+LF、Unix/Linux/macがLFとなる。ちなみに昔のmacはCRで変換の際はWindowsと同様と考えてもらってかまわない。
### Windows > Unix/Linux/mac
上が元テキストが残る形、下は上書き。個人的には元テキストを残した形で後で消すなりなんなりした方がいいと思うが、事前に元テキストのコピーを変換したい場合は```--overwrite```でもよい。

```:ex
$ nkf -Lu win.txt > mac.txt
$ nkf -Lu --overwrite hoge.txt 
```

### Unix/Linux/mac > Windows  
上が元テキストが残る形、下は上書き。

```:ex
$ nkf -Lw mac.txt > win.txt
$ nkf -Lw --overwrite hoge.txt
```

###改行変換は```tr```コマンドでも出来る。
#### Windows > Unix/Linux/mac
```:ex
$ tr -d \\r <win.txt > mac.txt
```

改行変換は、nkfでもtrでもsedでもawkでもperlでもrubyでもpythonでもphpでも出来る。
vimとかemacsでも。

改行コード変換については、[ここ](http://pseudo.ddo.jp/~pseudo/cgi-bin/shop_v50/doc/webmaster.html)が詳しかった。
ちょいと古いけど。