Emacs における日本語文字コードの設定
今回は Emacs における日本語の文字コードおよび改行コードの設定についての記事です。
文字コードの設定は基本的なものであれば、簡単なのですが、
Windows でデフォルトを UTF-8 にしようとしたりすると少し複雑になります。
ただし、逆に言えば Emacs では細かな設定まで可能ということでもあります。
その細かな設定までできるように解説してみたいと思います。
言語環境の設定
まず、文字コードの設定で最初に行うのは、言語環境を日本語(Japanese)に設定することです。 「何故、文字コードの設定で言語環境を設定するか」というと、 言語環境を設定すれば最低限の文字コードの設定が行われるからです。言語環境の設定は init.el などの設定ファイルに set-language-environment で指定します。
(set-language-environment "Japanese")言語環境は [Options(オプション)] メニューからも設定できます。 オプションの設定を変えた場合は [Save Options(オプションの保存)]を忘れないようにして下さい。
[Options] → [Multilingual Environment] → [Set Language Environment] → [Javanese] ([オプション] → [言語] → [言語環境の設定] → [日本語])言語環境を日本語に設定すれば、環境に合わせた日本語文字コードが設定されます。 Windows では Shift-JIS 、 Unix 系では EUC-JP などユーザーが環境として選んでいる文字コードです。
その設定で良ければ、これで文字コードの設定は完了です。
しかし、 より細かな設定をするためにはこの後に文字コードの設定を追加していくことになります。
なお、文字コードも変わるため、必ず 言語環境の設定した後に文字コードの設定を記述しなければなりません。
オプションのメニューでの設定はカスタマイズの場合と同じでデフォルトでは設定ファイルの最後に追加されます。 set-language-environment 関数を使うかカスタマイズ用の別ファイルにしてロードするようにして下さい。
文字コードのシンボル
文字コードはシンボルを使って指定します。よく使うものを以下の表にまとめました。これ以外にもありますが、そちらは M-x list-coding-systems で確認してください。
シンボル | 文字コード |
---|---|
shift_jis | Shift-JIS |
cp932 | コードページ932 (Windows では正確にはこちら) |
euc-jp | EUC-JP |
utf-8 | UTF-8 (BOM なし) |
utf-8-with-signature | BOM 付き UTF-8 |
また、改行コードは指定がなければシステムに合わせたものになります。 これを変えたい場合は shift_jis-unix のように以下のキーワードと合わせたシンボルを指定します。
キーワード | 説明 |
---|---|
dos | CR + NL |
mac | CR |
unix | NL |
対象別の文字コード指定
デフォルトの文字コードを設定する場合には prefer-coding-system を使います。(prefer-coding-system 'utf-8)同じような関数に set-default-coding-systems というのもあります。 ただし、ヘルプによれば prefer-coding-system の方は改行コードとのセットのシンボルも使えるようですので、 こちらを覚えておいた方がいいでしょう。
この設定によって指定される文字コードは以下の項目です。
- ファイルを新規作成した場合のデフォルト
- サブプロセスでの IO
- 他の項目が指定されていない場合のデフォルト値
設定関数 | 対象 |
---|---|
set-file-name-coding-system | ファイル名 |
set-keyboard-coding-system | キーボード |
set-terminal-coding-system | ターミナル(コンソール) |
例えば、 Windows ではファイル名やキーボードは Shift-JIS(cp932) ですので、 prefer-coding-system で Shift-JIS 以外を指定した場合はこれらの変更は必須となります。
ターミナルの設定は Windows ではあまり使うことはないと思いますが、 GUI ではなく、ターミナルで Emacs を使う場合に必要となります。
(prefer-coding-system 'utf-8) (set-file-name-coding-system 'cp932) (set-keyboard-coding-system 'cp932) (set-terminal-coding-system 'cp932)ここで注意点は prefer-coding-system では BOM 付きの UTF-8 (utf-8-with-signature) を指定してはいけないということです。
サブプロセスでの文字コードも変わってしまうため、 grep やコンパイルなどで外部プログラムをちゃんと呼び出せなくなります。
この対応としては default-process-coding-system 変数でプロセスの文字コードを変えればいいのですが、 それよりもデフォルトをシフトJISにしてファイルのデフォルトを変えた方が早いでしょう。
ファイルのデフォルトの文字コード指定
開いているバッファーのファイルの文字コードを変更する場合には set-buffer-file-coding-system (C-x RET f)を使います。しかし、これを設定で書いても意味がありません。 バッファーごとの文字コード(buffer-file-coding-system) はバッファーローカルな値なので、 ロードしているバッファーの文字コードが変わるだけです。
新規作成時のファイルのデフォルトを変える場合には set-default 関数を使って buffer-file-coding-system のデフォルト値を変更します。
(set-default 'buffer-file-coding-system 'utf-8-with-signature)以前はファイルのデフォルトの文字コード指定には default-buffer-file-coding-system 変数を使う方法もありました。 しかし、 Ver. 23.2 にから非推奨(obsolete)になったため、 buffer-file-coding-system を
set-default
で変更した方がよいでしょう。
ファイルの種別ごとの文字コード指定
文字コードは最近では UTF-8 が使われるのが主流になってきました。 UTF-8 は日本語が冷遇されているので不満はありますが、 文字コードが統一されるのはいいことだと思います。しかし、残念ながら文字コードは統一されていません。 UTF-8 でも 「BOM 付き派」と 「BOM なし派」とがあるためです。 状況はよりやっかいになったとも言えます。
Microsoft 製品では BOM 付きでなければちゃんと動かないことがあります。 一方、 Unix や Java 系のツールや言語では BOM なし派です。
VS 用には BOM 付きがいいですが、 Java など JVM 言語では BOM なしでなければなりません。
そんな中 Emacs ではファイル種別ごとに文字コードを指定することができます。
ただし、この設定は Emacs の文字コード判定よりも優先されるため、 JVM 言語のように BOM なし UTF-8 以外はうけつけないようなソースに限った方がいいと思います。
ファイル種別ごとの文字コードを指定する場合は modify-coding-system-alist で設定します。
(modify-coding-system-alist 'file "\\.java\\'" 'utf-8) ;; Java (modify-coding-system-alist 'file "\\.clj\\'" 'utf-8) ;; Clojure (modify-coding-system-alist 'file "\\.\\(scala\\|sbt\\)\\'" 'utf-8) ;; Scala (modify-coding-system-alist 'file "\\.[eh]rl\\'" 'utf-8) ;; Erlang (modify-coding-system-alist 'file "\\.exs?\\'" 'utf-8) ;; Elixirなお、 Scala の scala-mode2 の場合はパッケージをインストールすると自動的にこの設定が追加されます。 この設定をカスタマイズで行う場合には file-coding-system-alist の変数を変更します。
- M-x customize-option [RET] file-coding-system-alist
ペアでの指定はエンコード、デコードをそれぞれ指定しているものです。 一つだけ指定すれば、両方共に同じものが使われます。
Windows での設定
最後に参考として Windows での私の設定をあげておきます。;; ベースは Shift-JIS のまま (set-language-environment "Japanese") ;; ファイルのデフォルトを HTML や C++ 用に BOM 付き UTF-8 (set-default 'buffer-file-coding-system 'utf-8-with-signature) ;; BOM なし UTF-8 でなければならない言語 (modify-coding-system-alist 'file "\\.clj\\'" 'utf-8) ;; Clojure (modify-coding-system-alist 'file "\\.exs?\\'" 'utf-8) ;; Elixir ; ...ただし、実際には私はカスタマイズやオプションの方を使って設定するので、 これはコピペしやすいようにコードに直したものです。
Facebook コメント
コメント
No title
buffer-file-coding-systemはバッファを保存するときに使うそうです。
あと改行コードの表が意味不明です…dos CR + LF mac CR unix LFではないですか?
とはいえ、こういう情報をまとめてもらえるのはありがたいですね。
Re: No title
> M-x describe-variable default-buffer-file-coding-systemによると、buffer-file-coding-systemの方がいいらしいよ。
> buffer-file-coding-systemはバッファを保存するときに使うそうです。
確かに default-buffer-file-coding-system は obsolete とになっていました。
ただ、単に buffer-file-coding-system 置き換えただけでは上手くいかないはずです。記事を更新しましたので、そちらを参考にしてみてください。
> あと改行コードの表が意味不明です…dos CR + LF mac CR unix LFではないですか?
書き間違えてました。こちらもあわせて修正しています。
No title
好みの問題だけどね。
ところで*scratch*をutf-8にしたいときはどうなんだろうね。
newly created bufferなのか?
No title
それで正しいかはともかく。