はてな on Safariで半角\は表示できないのか?その対策は...
「半角¥は、半角\に置き換える必要あり。」
- 上記文言は、このブログにコードを掲載する度に添えてきた一文である。いい加減、こんな面倒臭いことやめたいと思い始めた。
- そもそも、なぜ上記文言が必要になるのかと言えば、半角\が半角¥として表示されてしまうからなのだ。
- 但し、この日記をSafariで閲覧する場合のみ。(もう少し拡張して考えれば、この日記 < はてな < EUC-JPなページ、となる)
実験してみる
- 各ブラウザで、記事を書くテキストエリアに、半角\¥を入力して、プレビューを確認してみると、以下の結果になった。(表中では結果は全角)
編集(入力) | プレビュー | |
---|---|---|
Safari | ¥¥ | ¥¥ |
Firefox・Chrome | \¥ | \\ |
Opera | \¥ | \¥ |
- なんと、Safariでは半角\を入力すると半角¥になってしまい、入力すら出来ない。
- それでは、入力できないなら文字コード指定ではどうかと思い、以下のように入力してみた。(表中では結果は全角)
- \¥ → \¥
編集(入力) | プレビュー | |
---|---|---|
Safari | \¥ | ¥¥ |
Firefox・Chrome | \¥ | \¥ |
Opera | \¥ | \¥ |
これは非常に悲しい結果で、Safariでは書きたいことを正確に書けないという事態になってしまっているのだ。ある意味、表現の自由を奪われている気分だ。
一文字くらい、半角がダメなら全角で表現すれば良いじゃないかという考えもあるが、プログラムコードにとっては致命的で、たった一文字の違いで動作しなくなってしまう可能性があるのだ。特に半角\については、多くのプログラミング言語で次の文字と合わせて特殊な意味を持つので、多くの場合、コードをコピー&ペーストしても正常に動作しない事態になる。
ことの経過
それでは、何故このような事態になってしまったのか?いろいろな所で語り尽くされているようだが、自分の場合は以下のページを参考に理解した。(素晴らしいページに感謝です!)
- 0x5cの表示に関するSafariの謎な仕様 - Mac OS Xの文字コード問題に関するメモ
- YEN SIGN問題縁起 - yasuoka の日記
- 円記号問題とウェブブラウザ - はてなるせだいあり
『UNIX Programmer's Manual, Seventh Edition』(1979年1月)に「ascii」の項が載って以来、UNIX環境下では0x00−0x7FはASCII決め打ち、というタテマエだからです。UNIXでは、たとえ0x5Cが「\」に見えたとしても、それは端末が腐っているのであって、あくまでbackslashとして扱うのが正解、ということになります。
YEN SIGN問題縁起 | yasuokaの日記 | スラド
なるほど...
対策0: Safariを使わない
- Firefox・Chrome・Opera等ならEUC-JPなページの半角\も表示してくれるので書いてしまったが、これは対策とは言えないかもしれない...。
- この日記にアクセスして頂いているブラウザの、最近の傾向を見ると、SafariとFirefoxが2トップになっている。(IEは離されて3番手)
Safariを利用した、次の対策を考える必要がある。
対策1: テキストエンコーディングを変更する
- 問題はEUC-JPなページをSafariで閲覧する時に発生するので、テキストエンコーディングをEUC-JP以外に指定してみた。
- 半角のみのコード部分については、ちゃんと半角\が表示されるようになった。但し、当然だが全角部分は文字化けする...。
Shift_JIS | UTF-8 | EUC-JP |
---|---|---|
- 文字化けしたブログなんて誰も読みたくないはず。
- また、コードをコピーする時だけテキストエンコーディングを変更するなら、半角¥を半角\に置き換える方がまだマシな気がする。
対策2:ダウンロード リンクにする
- さきほど「表現の自由を奪われている気分」なんて大袈裟に書いてしまったが、半角\くらいで、そんなにむきになる必要はないはず。
半角\を表示するという主題からはズレてしまうが...
- 自分の場合の問題の本質は、コピー&ペーストしたコードが正常に動かないことにある。
- 正常に動けば、良しとしよう。また、取得する方法はコピー&ペーストでなくても良い。
- 以上のことを考えると、どこかにファイルを置いて、ダウンロードできるようにすれば良いことに気付く。簡単な話だった。
では、どこにコードのファイルを置くか...
はてな
- ファイルをはてなに保存するなら、はてなダイアリープラス(有料)だと思って、試しに申し込んでみた。
- 申し込みが完了すると、写真をアップロードする感覚で、ファイルも扱えるようになった。
- 必要なファイルを素早くアップロード、そして素早くそのダウンロードリンクを生成できる、利点はある。
- でも、コードの保管が目的ならどこか無料のサービスでも良い訳で、プラスにする必要性はないと思った。
対策3: AppleScriptエディタで開く
- この日記では、AppleScriptネタも多く、よくAppleScriptコードを掲載している。
- ダウンロードリンクは便利なんだが、ファイルを探したり、zip解凍の手間もある。
そんな状況も踏まえて...
- Mac環境ではapplescriptプロトコルによって、AppleScriptエディタにコードを書き込んで開いてくれるという機能がある。
applescript://com.apple.scripteditor?action=new&script=display%20dialog%20%22hello!!%22
- ちなみに、script=以降は、urlエンコードされたAppleScriptである。
- 試しに、上記コードをコピーして、SafariのURL入力欄にペーストすれば、以下の内容でAppleScriptエディタが開くはずである。
- AppleScriptを利用する時に便利なことに違いないが、AppleScriptエディタで開く言語がRubyやC言語であっても問題はないはずである。
- で、applescriptプロトコルなURLのリンクを生成すれば、そのリンクをクリックするだけで、目指すコードがAppleScriptエディタで開かれることになる。
- ...はずであったが、どうやら、はてなダイアリーはapplescriptプロトコルを許してくれないようだ。
- 気を取り直してJavaScriptでやってみたが、それも制限されている...。開かない...。寂し過ぎる...。
- それでも、諦められずに試行錯誤していると、解決策が見つかった!
- さっき申し込んだ はてなダイアリープラスに以下のファイルをアップロードする。
<HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=UTF-8"> <META NAME="GENERATOR" CONTENT="mi"> <TITLE> </HEAD> <BODY> <script language="JavaScript"> <!-- location.href="applescript://com.apple.scripteditor?action=new&script=display%20dialog%20%22hello!!%22" setTimeout('window.close();', 1000); //--> </script> </BODY> </HTML>
- すると、以下のリンクが生成されるので、クリックしてみると...
- AppleScriptエディタが開いた!
つまり...(そもそも、当然のことなのかもしれないが)
- ダウンロードリンクをクリックすれば、それがブラウザが解釈できる形式のファイルであれば、ブラウザでレンダリングしてくれる。
- ファイルがhtml形式で、JavaScriptが含まれていれば忠実にそれを実行し、AppleScriptプロトコルが含まれていればそれも実行される。
- また、アップロードしたファイルのテキストエンコーディングはUTF-8なので、半角\についても問題なく処理してくれるはず。
結論
- EUC-JPなページをSafariで表示する時、半角\を表示する手段はない。(Firefox・Chrome・Operaなら表示できる)
- たとえ0x5Cが半角¥に見えたとしても、それはSafariが腐っているのであって、あくまで半角\として扱うのが正解!
- そうは言っても、コピー&ペーストしたコードの半角\が半角¥に置き換わって問題になる。
- その問題は、プログラムコードをUTF-8で別ファイルに保存して、ダウンロードリンクを生成して対処する。
- ダウンロード先のファイルがhtml形式なら、その内容はブラウザで解釈され、JavaScriptもAppleScriptプロトコルも実行される。
結果として...
- ブログを書く人は、さらに面倒になる。
- 決まり文句の「半角¥は、半角\に置き換える必要あり。」と書いていた時の方が楽だ。
- ブログを読む方々は、たぶん快適になる。
- ワンクリックでAppleScriptエディタに正確コードが書き込まれて、開くのだから。
ところで、
- ブログを書く人は一人、
- ブログを読む方々はおそらく数百人・時には数千人にいるのだから、
- もし苦労と快適が相殺されるのなら、以下のような計算が出来そう。
- 苦労×1 + 快適×1000 = 快適×999
一人の苦労で千人が快適になるのなら、ダウンロードリンクを出来る限り作ろうと、決意したのであった...。
AppleScriptをurlに変換する
- AppleScriptをURLエンコードして、javascriptで呼び出すページに仕上げるのは、とっても面倒だ。
- そんな一連の手順は、AppleScript自身にやってもらうのがベスト。以下のスクリプトを作ってみた。
-
-
- applescript_url_by_javascript.html (AppleScriptエディタで開く by はてなプラス)
- applescript_url_by_javascript.scpt (gist.githubで開く)
-
tell application "AppleScript Editor"
activate
set myString to contents of document 1
set beforeList to {"%", ASCII character (9), ASCII character (13), ASCII character (13), ASCII character (32), ASCII character (34), "&", "<", ">", "\\", "\""} set afterList to {"%25", "%09", "%0a", "%0a", "%20", "%22", "%26", "%3c", "%3e", "\\\\", "\\\""} set html1 to "<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n</head>\n<body>\n\n<script language=\"JavaScript\">\n<!--\nlocation.href=\""
set html2 to "\"\nsetTimeout('window.close();', 1000);\n//-->\n</script>\n\n</body>\n</html>\n"
set oldDel to text item delimiters of AppleScript
set i to 1
repeat with x in beforeList
set text item delimiters of AppleScript to x
set mylist to every text item of myString
set text item delimiters of AppleScript to item i of afterList
set myString to mylist as string
set i to i + 1
end repeat
set text item delimiters of AppleScript to oldDel
set myString to html1 & "applescript://com.apple.scripteditor?action=new&script=" & myString & html2
set the clipboard to myString
end tell
my message("クリップボード", "AppleScriptをURLに変換して、セットしました。")
on message(title, msg) try
do shell script "/usr/local/bin/growlnotify " & title & " -m " & quoted form of msg
on error
activate
display alert msg giving up after 1
end try
end message
使い方
- URLエンコードしたいコードをAppleScriptエディタで開く。
- スクリプトメニューから上記スクリプトを実行する。
- クリップボードに html + JavaScript + URLエンコードしたAppleScript が書き込まれる。
- テキストエディタにペーストして、htmlファイルとして保存する。
- そのhtmlファイルをはてなプラスにアップロードすれば...
- ダウンロードリンクをクリックした時にAppleScriptエディタにコードが展開されるのだ!
MobileMe
- ちなみに、対策3の仕組みは、はてなプラスに限らず、MobileMeでも実現可能。
-
- applescript_url_by_javascript.html (AppleScriptエディタで開く by MobileMe)
-
- htmlファイルは、iDiskのSitesフォルダ以下に保存しておく。
- ファイルパスとURLは、以下のように対応する。
- /iDisk/Sites/xxxxxx.html
- http://homepage.mac.com/MobileMeユーザー名/xxxxxx.html
- はてなプラスのリンクは、「ダイアリーに戻る」をクリックして、元の日記に戻る必要がある。
- MobileMeのリンクは、AppleScriptエディタを起動すると、自動的に閉じて、元の日記に戻る。
- はてなプラスも、自動的に元の日記に戻るように出来るのだろうか?