閉じる
閉じる
×
Emacsの文字コード関連でちょっとハマった問題だったので、この記事で整理します。
(2015/03/09追記)国際会議の動向について付け加えました。
U+FF5Eは全角チルダです。チルノじゃないですよ!チルダ「~」の全角版ということだそうです。チルダはスペイン語などで文字の上に置いて鼻音など特定の音声を示すのに使われる記号です。UNIX系OSではホームディレクトリーの省略記号としても使われています。本来日本語表記とは関係ない記号であり、チルダを全角にした文字なんかShift_JISには存在しませんでした。ところがUnicodeが策定されたとき、なぜか全角チルダが用意されました。全角アルファベットがあるなら全角チルダがあってもよくね?ということだったのでしょうか……
![]()
図1 Windows版Google日本語入力の例。「から」で変換すると候補に全角の波ダッシュが現れています。しかしこれで入力すると実際には全角チルダが入力されます。なお「z-」と入力しても波ダッシュの変換候補が現れますが、こちらも実際に入力されるのは全角チルダです。
当然のことながらMacなどの他のOSでは、Shift_JISの波ダッシュはUnicodeに変換しても波ダッシュですし、波ダッシュと全角チルダは別々に入力できます。これらのOSでは全角チルダはあまり使われません。これが本来のあり方であり、マイクロソフトはなんというめちゃくちゃなことをしてるんだ! と怒りたくなりますが、マイクロソフトばかりを責められない事情がありました。
」になっています。これは仕様書の字形を編集した人の凡ミスだったようです。マイクロソフトはWindows XPの日本語フォントで仕様書通りの間違った字形の波ダッシュを採用したものの、「何か違くね?」との違和感をどうしても捨てきれず、結果、本来の字形に似た全角チルダに一本化しようという本末転倒な措置を取りました。この点、アップルなどは「Unicode馬っ鹿じゃねーの」と言わんばかりに波ダッシュの字形をUnicodeの仕様書に違反して正しい字形にしました。この時点でUnicodeの仕様書に忠実だったのはマイクロソフトのほうだったのです。
Windows Vistaを世に出した頃にはマイクロソフトも垢抜けて、日本語フォントの波ダッシュの字形を正しい(Unicodeの仕様書には違反する)字形にちゃっかり直しています。ですが、全角チルダで代用するという方針は変えてません。文字コードに関しては一度決めた事を変えるのは大変なんだと思います。
文字コードの由来を考えると波ダッシュこそ使う文字であって、実際Windows以外では波ダッシュのほうが自然に入力されます。最近はスマホの普及で、Windowsユーザーでも他のOSに触れる機会が多くなっているので、同じ文字を入力したつもりでも、入力時の環境によって文字コードが違っているということが頻繁に起こりうる事態となっています。
見た目が似ているからといっても、アプリケーションやフォントによっては両者が微妙に違うように表示されることがあります。また、検索の時にうまくいかないという問題が発生します。こんなによく使う文字が混乱の元になりかねない状況というのは本当に残念ですね。
と思っていたら、ようやくUnicode側がこの問題に対処するようです。
文字コード規格を審議する国際会議において、「波ダッシュの字形を本来の字形に変更する」ことが「勧告」として承認されました。Internet Watchの以下の記事に経緯が詳細に書かれています。
UnicodeのWAVE DASH例示字形が、25年ぶりに修正された理由(Internet Watch)
これによると、私も愛用するGoogle日本語入力の担当エンジニアが軽いノリでこの問題の修正を提案してみたらあっさり通っちゃった、ということです。おいおい・・・
記事によると近い将来、この勧告内容はUnicodeの規格に取り入れられるそうです。
ただし、2つ問題が残ります。1つは全角チルダが残っているので、見た目が同じ字形の文字コードが2つも存在することになります。もう1つは、マイクロソフトが全角チルダへの変換をやめるのかどうか、です。
余計にややこしいことにならないことを切に願います。
ここからはWindows上のEmacsの話になります。
Shift_JISでファイルを保存しようとすると、次のようなエラー・メッセージがでて、別の文字コードの指定を促すプロンプトが表示されることがあります。
「japanese-shift-jis-dos cannot encode these: ~」
これはファイル中に全角チルダを入力した場合に発生します。元々のShift_JISには全角チルダなんか存在しないので、エンコードできないと叱られたのです。Windowsでは波ダッシュを入力したつもりでも実際には全角チルダが入力されてしまうので、このようなことが起こります。
EmacsにはShift_JIS関連の文字コードとしてshift_jis(japanese-shift-jis)かcp932(japanese-cp932)を指定することができます。shift_jisは素のShift_JISです。cp932はShift_JISにWindows独自のマッピングを加えたものです。
cp932のファイルについて、Windows上のEmacsは次のような動作をします。
ただし、cp932を使うと、org-modeでHTML出力をする場合はHTML文書のcharsetに間違った文字コードが指定されるという問題があります。この問題は「(setq org-export-html-coding-system 'utf-8)」という設定をorg-load-hookにからめて設定してしのいでいます。
(2015/03/09追記)国際会議の動向について付け加えました。
1.実は文字コードが違っている
「〜」と「~」の2つの文字は見た目は同じですが、文字コードが違います。前者はUnicodeでU+301Cです。後者はUnicodeでU+FF5Eです。文字コードが違うなら2つは違うんだろ、で終わりそうな話ですが、なんとWindowsでは2つが同じ扱いになってたりします。まったく奇々怪々な話でありますが、そもそも何で似たような形の文字が2つもあるのでしょうか。2.波ダッシュと全角チルダ
U+301Cは波ダッシュと呼ばれています。波ダッシュは「から」を意味する日本語表記です。漢字変換でも「から」で変換できます。「東京〜上野」とあれば東京から上野までという意味です。似たような表記に「―」があります。これは単にダッシュといいます。最近では波ダッシュを長音符に使うことも多いです。「いけずぅ〜」とか。波ダッシュは基本的な日本語表記なのでShift_JISにも存在しています(Shift_JISでの文字コードは0x8160)。U+FF5Eは全角チルダです。チルノじゃないですよ!チルダ「~」の全角版ということだそうです。チルダはスペイン語などで文字の上に置いて鼻音など特定の音声を示すのに使われる記号です。UNIX系OSではホームディレクトリーの省略記号としても使われています。本来日本語表記とは関係ない記号であり、チルダを全角にした文字なんかShift_JISには存在しませんでした。ところがUnicodeが策定されたとき、なぜか全角チルダが用意されました。全角アルファベットがあるなら全角チルダがあってもよくね?ということだったのでしょうか……
3.波ダッシュが使えない!?
由来を調べると波ダッシュだけ使えばいいじゃないかと思います。ところがマイクロソフトが奇妙なことをやりだします。なんとWindowsでは波ダッシュは全角チルダに代用されると決めてしまったんです。Shift_JISのテキストをUnicodeのテキストに変換すると波ダッシュは全角チルダに変換されます。波ダッシュを入力しようとすると実際には全角チルダが入力されます。「東京~上野」と日本語入力して「東京から上野」と書いたつもりが、文字コード的には「東京 音声記号 上野」と訳のわからないものになっているのです。図1 Windows版Google日本語入力の例。「から」で変換すると候補に全角の波ダッシュが現れています。しかしこれで入力すると実際には全角チルダが入力されます。なお「z-」と入力しても波ダッシュの変換候補が現れますが、こちらも実際に入力されるのは全角チルダです。
当然のことながらMacなどの他のOSでは、Shift_JISの波ダッシュはUnicodeに変換しても波ダッシュですし、波ダッシュと全角チルダは別々に入力できます。これらのOSでは全角チルダはあまり使われません。これが本来のあり方であり、マイクロソフトはなんというめちゃくちゃなことをしてるんだ! と怒りたくなりますが、マイクロソフトばかりを責められない事情がありました。
4.Unicode馬っ鹿じゃねーの
実はUnicodeの波ダッシュとして登録された文字の字形が間違った字形だったのです。本来の波の形は上がって下がってですが、Unicodeの仕様書では下がって上がって「Windows Vistaを世に出した頃にはマイクロソフトも垢抜けて、日本語フォントの波ダッシュの字形を正しい(Unicodeの仕様書には違反する)字形にちゃっかり直しています。ですが、全角チルダで代用するという方針は変えてません。文字コードに関しては一度決めた事を変えるのは大変なんだと思います。
文字コードの由来を考えると波ダッシュこそ使う文字であって、実際Windows以外では波ダッシュのほうが自然に入力されます。最近はスマホの普及で、Windowsユーザーでも他のOSに触れる機会が多くなっているので、同じ文字を入力したつもりでも、入力時の環境によって文字コードが違っているということが頻繁に起こりうる事態となっています。
見た目が似ているからといっても、アプリケーションやフォントによっては両者が微妙に違うように表示されることがあります。また、検索の時にうまくいかないという問題が発生します。こんなによく使う文字が混乱の元になりかねない状況というのは本当に残念ですね。
と思っていたら、ようやくUnicode側がこの問題に対処するようです。
5. 波ダッシュ問題が解決?〔追記〕
文字コード規格を審議する国際会議において、「波ダッシュの字形を本来の字形に変更する」ことが「勧告」として承認されました。Internet Watchの以下の記事に経緯が詳細に書かれています。
UnicodeのWAVE DASH例示字形が、25年ぶりに修正された理由(Internet Watch)
これによると、私も愛用するGoogle日本語入力の担当エンジニアが軽いノリでこの問題の修正を提案してみたらあっさり通っちゃった、ということです。おいおい・・・
記事によると近い将来、この勧告内容はUnicodeの規格に取り入れられるそうです。
ただし、2つ問題が残ります。1つは全角チルダが残っているので、見た目が同じ字形の文字コードが2つも存在することになります。もう1つは、マイクロソフトが全角チルダへの変換をやめるのかどうか、です。
余計にややこしいことにならないことを切に願います。
ここからはWindows上のEmacsの話になります。
Shift_JISでファイルを保存しようとすると、次のようなエラー・メッセージがでて、別の文字コードの指定を促すプロンプトが表示されることがあります。
「japanese-shift-jis-dos cannot encode these: ~」
これはファイル中に全角チルダを入力した場合に発生します。元々のShift_JISには全角チルダなんか存在しないので、エンコードできないと叱られたのです。Windowsでは波ダッシュを入力したつもりでも実際には全角チルダが入力されてしまうので、このようなことが起こります。
EmacsにはShift_JIS関連の文字コードとしてshift_jis(japanese-shift-jis)かcp932(japanese-cp932)を指定することができます。shift_jisは素のShift_JISです。cp932はShift_JISにWindows独自のマッピングを加えたものです。
cp932のファイルについて、Windows上のEmacsは次のような動作をします。
- ファイルに含まれる波ダッシュはEmacsのバッファ上では全角チルダに変換されます。
- Emacsのバッファ上の全角チルダをファイルに保存するときは波ダッシュに変換されます。
ただし、cp932を使うと、org-modeでHTML出力をする場合はHTML文書のcharsetに間違った文字コードが指定されるという問題があります。この問題は「(setq org-export-html-coding-system 'utf-8)」という設定をorg-load-hookにからめて設定してしのいでいます。
広告