galgalgal

Greasemonkey スクリプトで日本語の文字列を埋め込む時、私は vim の "ga" というコマンドを使います。これは、例えば「日」という文字上で実行すると以下のようなメッセージを出力してくれるものです:

<日> 26085, Hex 65e5, Octal 62745

この Hex の値を抜き出して "\u" をくっつけると Unicode エスケープされた文字列の出来上がりです。

ただ、一文字ずつ手作業で書き留めていくのは面倒極まりないので、ちょっと工夫をします。

:redir @a

こうすると、表示されるメッセージが "@" の後の名前のレジスタ (名前付き記憶領域) に転送 (redirect) されていきます。

これを利用して、変換したい文字列上を "galgalgal..." と一気に滑らせていくと ("l" はカーソル右移動です)

:put a

で全部のメッセージを取り出すことができるわけです。

「日本語」だと以下がバッファに吐き出されます:

<日> 26085, Hex 65e5, Octal 62745
<本> 26412, Hex 672c, Octal 63454
<語> 35486, Hex 8a9e, Octal 105236

さて、ここから Hex の値を全て取り出したいわけです。値の桁が綺麗に揃っていることに気付きますね。このブロック部分は「矩形選択」で取り出すことができます (左上の文字 (65e5 の 6) にカーソルを置き、CTRL-V で矩形選択開始 -> カーソルを右下隅まで移動)。

"y" で選択した領域をヤンク (コピー) し、それを

:put "

でペーストです。

すると、以下が出力されます:

65e5
672c
8a9e

今度はこの各行に "\u" を追加したいわけです。

何通りか方法があるんですが、いちばん簡単と思われるのは、上述の矩形選択 (CTRL-V) を使う方法です。

矩形選択をした状態で大文字の "I" を押して文字列を入力すると、選択領域全体の頭 (一つ前の桁) に同じ文字列が追加される、というものです。複数行をコメント・アウトしたい場合なんかに便利な機能です。

ここでは各行の一桁目を選択して "I" を押し、そのまま "\u" を入力すると、エスケープを押した時点で

\u65e5
\u672c
\u8a9e

となります。

あと一歩、これを今度は連結したいわけです。

連結のコマンドは ":join" です。また、"gv" で直前に選択した部分を再選択することが出来ます。ですから、"gv:join" で選択行を連結できるんですが、普通に join すると間にスペースが入ってしまうので、これを防ぐために "!" を付けます (gv:join!)。

やっと、出来上がりました:

\u65e5\u672c\u8a9e

あ、それから、最初に vimエンコーディングutf-8 になっていること (:set enc=utf8) の確認と、用が済んだら ":redir End" するのを忘れてはいけません。

といった感じで、vim ユーザーでない方にはひと苦労と思われるかも知れませんが、vim に習熟していると大した手間とも感じないのが不思議なところです。


最後に、他の方法として、次の記事に紹介されている方法も参考になります (コメント欄にも要注目です):
東京嫉妬 - livedoor Readerからはてなダイアリーにコメントするぐりもん