はてな on Safariで半角\は表示できないのか?その対策は...

「半角¥は、半角\に置き換える必要あり。」

  • 上記文言は、このブログにコードを掲載する度に添えてきた一文である。いい加減、こんな面倒臭いことやめたいと思い始めた。
  • そもそも、なぜ上記文言が必要になるのかと言えば、半角\が半角¥として表示されてしまうからなのだ。
  • 但し、この日記Safariで閲覧する場合のみ。(もう少し拡張して考えれば、この日記はてなEUC-JPなページ、となる)

実験してみる

  • 各ブラウザで、記事を書くテキストエリアに、半角\¥を入力して、プレビューを確認してみると、以下の結果になった。(表中では結果は全角)
編集(入力) プレビュー
Safari ¥¥ ¥¥
FirefoxChrome \¥ \\
Opera \¥ \¥
  • なんと、Safariでは半角\を入力すると半角¥になってしまい、入力すら出来ない。
  • それでは、入力できないなら文字コード指定ではどうかと思い、以下のように入力してみた。(表中では結果は全角)
    • \¥  →  \¥
編集(入力) プレビュー
Safari \¥ ¥¥
FirefoxChrome \¥ \¥
Opera \¥ \¥


      • SafariChromeWebKitを利用しているはずなのに、なぜこの結果?
      • SafariChromeのように処理してくれれば良いのに...。
  • Safariでは、どうあがいても\を表示してくれない。
  • 他のブラウザは、文字コード指定すれば、表示してくれた。

これは非常に悲しい結果で、Safariでは書きたいことを正確に書けないという事態になってしまっているのだ。ある意味、表現の自由を奪われている気分だ。
一文字くらい、半角がダメなら全角で表現すれば良いじゃないかという考えもあるが、プログラムコードにとっては致命的で、たった一文字の違いで動作しなくなってしまう可能性があるのだ。特に半角\については、多くのプログラミング言語で次の文字と合わせて特殊な意味を持つので、多くの場合、コードをコピー&ペーストしても正常に動作しない事態になる。

ことの経過

それでは、何故このような事態になってしまったのか?いろいろな所で語り尽くされているようだが、自分の場合は以下のページを参考に理解した。(素晴らしいページに感謝です!)

UNIX Programmer's Manual, Seventh Edition』(1979年1月)に「ascii」の項が載って以来、UNIX環境下では0x00−0x7FはASCII決め打ち、というタテマエだからです。UNIXでは、たとえ0x5Cが「\」に見えたとしても、それは端末が腐っているのであって、あくまでbackslashとして扱うのが正解、ということになります。

YEN SIGN問題縁起 | yasuokaの日記 | スラド

なるほど...

  • OSXUNIXである。
  • 故に、たとえ0x5Cが「\」に見えたとしても、それはSafariが腐っているのであって、あくまでbackslashとして扱うのが正解!

対策0: Safariを使わない

  • FirefoxChromeOpera等ならEUC-JPなページの半角\も表示してくれるので書いてしまったが、これは対策とは言えないかもしれない...。
  • この日記にアクセスして頂いているブラウザの、最近の傾向を見ると、SafariFirefoxが2トップになっている。(IEは離されて3番手)
  • やはり、多数派のブラウザを使わないでください、という選択は対策とは言えない。
  • iPhoneiPadでは、実質Safariしかないのだし。(最近はOperaも認可されたが)

Safariを利用した、次の対策を考える必要がある。

対策1: テキストエンコーディングを変更する

  • 問題はEUC-JPなページをSafariで閲覧する時に発生するので、テキストエンコーディングEUC-JP以外に指定してみた。
  • 半角のみのコード部分については、ちゃんと半角\が表示されるようになった。但し、当然だが全角部分は文字化けする...。
Shift_JIS UTF-8 EUC-JP
  • はてなダイアリーが、UTF-8なんかでサービスしてくれたら即、幸せになれるのだが、まあ、そんなことはまずないだろう...。
  • 文字化けしたブログなんて誰も読みたくないはず。
  • また、コードをコピーする時だけテキストエンコーディングを変更するなら、半角¥を半角\に置き換える方がまだマシな気がする。


テキストエンコーディングEUC-JPのままでOKな、次の対策を考える必要がある。

対策2:ダウンロード リンクにする

  • さきほど「表現の自由を奪われている気分」なんて大袈裟に書いてしまったが、半角\くらいで、そんなにむきになる必要はないはず。

半角\を表示するという主題からはズレてしまうが...

  • 自分の場合の問題の本質は、コピー&ペーストしたコードが正常に動かないことにある。
  • 正常に動けば、良しとしよう。また、取得する方法はコピー&ペーストでなくても良い。
  • 以上のことを考えると、どこかにファイルを置いて、ダウンロードできるようにすれば良いことに気付く。簡単な話だった。


では、どこにコードのファイルを置くか...

はてな
  • ファイルをはてなに保存するなら、はてなダイアリープラス(有料)だと思って、試しに申し込んでみた。
  • 申し込みが完了すると、写真をアップロードする感覚で、ファイルも扱えるようになった。
  • 必要なファイルを素早くアップロード、そして素早くそのダウンロードリンクを生成できる、利点はある。
  • でも、コードの保管が目的ならどこか無料のサービスでも良い訳で、プラスにする必要性はないと思った。
github・gist
  • freeなコード置き場と言えば、以前から利用させて頂いているgithubが素敵だと思う。
  • バージョン管理ができる。(githubなら差分表示もできる)
  • 言語に合わせて、シンタックスハイライトなコード表示もしてくれる。
  • もちろん、テキストエンコーディングUTF-8なので、半角\も問題なし。


何と、GitXなんていうGUI環境まであるのか!


freeなgithubで十分なんだが、githubでは以下の対策3は無理だと思う。

対策3: AppleScriptエディタで開く

  • この日記では、AppleScriptネタも多く、よくAppleScriptコードを掲載している。
  • ダウンロードリンクは便利なんだが、ファイルを探したり、zip解凍の手間もある。

そんな状況も踏まえて...

applescript://com.apple.scripteditor?action=new&script=display%20dialog%20%22hello!!%22
  • 試しに、上記コードをコピーして、SafariのURL入力欄にペーストすれば、以下の内容でAppleScriptエディタが開くはずである。
    • ちなみに、FirefoxOperaでも開いた。(Operaは、ダイアログでAppleScriptエディタの起動を確認してきた。)
    • Chromeでは開けなかった。(Google検索されてしまった...。)


  • AppleScriptを利用する時に便利なことに違いないが、AppleScriptエディタで開く言語がRubyC言語であっても問題はないはずである。
  • それでも、諦められずに試行錯誤していると、解決策が見つかった!
  • さっき申し込んだ はてなダイアリープラスに以下のファイルをアップロードする。
<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>

つまり...(そもそも、当然のことなのかもしれないが)

  • ダウンロードリンクをクリックすれば、それがブラウザが解釈できる形式のファイルであれば、ブラウザでレンダリングしてくれる。
  • ファイルがhtml形式で、JavaScriptが含まれていれば忠実にそれを実行し、AppleScriptプロトコルが含まれていればそれも実行される。
  • また、アップロードしたファイルのテキストエンコーディングUTF-8なので、半角\についても問題なく処理してくれるはず。

結論

  • EUC-JPなページをSafariで表示する時、半角\を表示する手段はない。(FirefoxChromeOperaなら表示できる)
  • たとえ0x5Cが半角¥に見えたとしても、それはSafariが腐っているのであって、あくまで半角\として扱うのが正解!
  • そうは言っても、コピー&ペーストしたコードの半角\が半角¥に置き換わって問題になる。
  • その問題は、プログラムコードをUTF-8で別ファイルに保存して、ダウンロードリンクを生成して対処する。
  • ダウンロード先のファイルがhtml形式なら、その内容はブラウザで解釈され、JavaScriptAppleScriptプロトコルも実行される。

結果として...

  • ブログを書く人は、さらに面倒になる。
    • 決まり文句の「半角¥は、半角\に置き換える必要あり。」と書いていた時の方が楽だ。
  • ブログを読む方々は、たぶん快適になる。
    • ワンクリックでAppleScriptエディタに正確コードが書き込まれて、開くのだから。

ところで、

  • ブログを書く人は一人、
  • ブログを読む方々はおそらく数百人・時には数千人にいるのだから、
  • もし苦労と快適が相殺されるのなら、以下のような計算が出来そう。
  • 苦労×1 + 快適×1000 = 快適×999


一人の苦労で千人が快適になるのなら、ダウンロードリンクを出来る限り作ろうと、決意したのであった...。

AppleScriptをurlに変換する


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

使い方
  • そのhtmlファイルをはてなプラスにアップロードすれば...
  • ダウンロードリンクをクリックした時にAppleScriptエディタにコードが展開されるのだ!
MobileMe
  • htmlファイルは、iDiskのSitesフォルダ以下に保存しておく。


  • はてなプラスのリンクは、「ダイアリーに戻る」をクリックして、元の日記に戻る必要がある。
  • MobileMeのリンクは、AppleScriptエディタを起動すると、自動的に閉じて、元の日記に戻る。
  • はてなプラスも、自動的に元の日記に戻るように出来るのだろうか?