@kyanny's blog

My life. Opinions are my own.

Macのバックスラッシュと円マークの違いの洗礼を受けた

知識として知ってはいたけど、JISキーボードを使ってないせいもあっていままでハマらなかったが、今日ついにMacのバックスラッシュと円マークの違いの洗礼を受けた。

細かいことはここなどに詳しい。

7 | 2004/06/06 05:02:40 | 確認待ち | 保留 | 中 | 重大 | 未定

これには複雑な事情があります。

まず、Macでのクリップボードとのやりとりには、UTF-16またはMacJapaneseが使わ
れます。
Emacsの場合はMacJapaneseです。

MacJapaneseとUnicodeでは、次のような変換が行われます。
\x5C |0 # YEN SIGN
\x7E |0 # TILDE # Apple change from standard Shift-JIS
\x80 |0 # REVERSE SOLIDUS # Apple addition; changes mapping
of 0x815F
\x81\x8F |0 # FULLWIDTH YEN SIGN

一方、Emacsはクリップボードと内部コードとの変換をclipboard-coding-systemに
従って行います。
ECCSでは'sjis-macに設定されており、これはCRで改行された'japanese-sjisを意味
します。
このため、次のような文字化けが発生します。

CarbonEmacs -> TextEdit:
REVERSE SOLIDUS -> YEN SIGN
YEN SIGN -> FULLWIDTH YEN SIGN

TextEdit -> CarbonEmacs:
REVERSE SOLIDUS -> 不正な文字(\80)
YEN SIGN -> REVERSE SOLIDUS

そんなわけで、Emacsの動作がMac的に間違っているのが直接の原因です。
MacJapaneseを扱えるcoding-systemを作るか、クリップボードとのやりとりに
Unicodeを使えば「正しく」なります。

しかし、Unicode化は比較的簡単で、トラブルもMacOSに責任転嫁できますが、
またしてもローカルパッチを当てることになります。coding-sysemを作るのは
elispだけで出来ますが、簡単ではなさそうです。

そもそも、TextEditはECCSの事情にそぐわない面があります。
例えば、REVERSE SOLIDUSを含むファイルを保存すると、
「日本語(MacOS)」ならMacJapaneseの\x80に、
「日本語(Shift JIS)」ならJISの「\」になります。
僕はこれを推します。
mkdir /Applications/NotRecommendedForECCS
mv /Applications/TextEdit.app /Applications/NotRecommendedForECCS

http://133.11.45.238/BTS/2004/Fink/28.html

とある Javascript を生成する Perl スクリプトを書いていて、生成された js のコードを Firebug で実行すると、 \n が 円マークn になってしまって、 textarea の中にスクリプトが書き込むデータが改行されなかった。

実験してみたところ、クリップボードにコピーした時点で化ける?という言い方は不適切か、バックスラッシュが円マークに変換されてしまっていた。で、上のような事情について、改めて理解を深めた、という次第。

結局、ペーストした js の中の円マークをバックスラッシュに手で書き直してやれば普通に動いた。