Emacs における日本語文字コードの設定

今回は Emacs における日本語の文字コードおよび改行コードの設定についての記事です。
文字コードの設定は基本的なものであれば、簡単なのですが、 Windows でデフォルトを UTF-8 にしようとしたりすると少し複雑になります。 ただし、逆に言えば Emacs では細かな設定まで可能ということでもあります。 その細かな設定までできるように解説してみたいと思います。

なお、今回は設定についてなので、開いているファイルの文字コードの変更については以下の記事をご覧下さい。 また、環境設定に必要な Emacs Lisp の知識については以前の記事を参考にして下さい。

言語環境の設定

まず、文字コードの設定で最初に行うのは、言語環境を日本語(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 の方は改行コードとのセットのシンボルも使えるようですので、 こちらを覚えておいた方がいいでしょう。


この設定によって指定される文字コードは以下の項目です。
  1. ファイルを新規作成した場合のデフォルト
  2. サブプロセスでの IO
  3. 他の項目が指定されていない場合のデフォルト値
3 番目にあげている他の項目とその個別の設定関数は次のものです。
設定関数 対象
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-systemset-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
emacs_jacode.png


ペアでの指定はエンコード、デコードをそれぞれ指定しているものです。 一つだけ指定すれば、両方共に同じものが使われます。

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
; ...
ただし、実際には私はカスタマイズやオプションの方を使って設定するので、 これはコピペしやすいようにコードに直したものです。



関連記事
Prev.    Category    Next 

Facebook コメント


コメント

No title

M-x describe-variable default-buffer-file-coding-systemによると、buffer-file-coding-systemの方がいいらしいよ。
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

setq-defaultでもいいよ。
好みの問題だけどね。

ところで*scratch*をutf-8にしたいときはどうなんだろうね。
newly created bufferなのか?

No title

単純にinit.elで(set-buffer-file-coding-system 'utf-8)すればいいみたいだ。
それで正しいかはともかく。

No title

*scratch*バッファをutf-8でperlに渡したいだけなので、正しくはset-default-coding-systems/prefer-coding-systemでdefault coding system for subprocess I/Oを変える必要があった。

管理人のみ閲覧できます

このコメントは管理人のみ閲覧できます

コメントの投稿

Font & Icon
非公開コメント

このページをシェア
アクセスカウンター
アクセスランキング
[ジャンルランキング]
コンピュータ
101位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
16位
アクセスランキングを見る>>
カレンダー(アーカイブ)
プルダウン 降順 昇順 年別

12月 | 2025年01月 | 02月
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 -


はてな新着記事
はてな人気記事
ブロとも申請フォーム
プロフィール

yohshiy

Author:yohshiy
職業プログラマー。
仕事は主に C++ ですが、軽い言語マニアなので、色々使っています。

はてブ:yohshiy のブックマーク
Twitter:@yohshiy

サイト紹介
プログラミング好きのブログです。プログラミング関連の話題や公開ソフトの開発記などを雑多に書いてます。ただ、たまに英語やネット系の話になることも。