ページタイトルにSJISで表現できない文字の使用をやめた

はてなブックマーク – http://bmky.net の新着エントリー

このページを見てもらうと、暴満館の後に続く»が?なり妙な四角で表示されているのがわかると思う。

»はSJISでは表現できない文字のため、そのままコピーして非Unicodeな環境を経由してブックマークされた結果、このような文字化けが発生したと思われる。

ブックマークされてる身としては、なんだか妙に気持ち悪いので、この際だからSJISで表現できない記号を使うのをやめた。

せっかくなんで、XML上では文字参照で表すことを推奨されてる文字や、コード上で怒られそうな文字を禁止。大なり(>)、小なり(<)、クオート(")、アンパサンド(&)などなど。これを踏まえて・・・

暴満館 - 適当なタイトル
暴満館 | 適当なタイトル
暴満館 + 適当なタイトル
暴満館 @ 適当なタイトル
[暴満館] 適当なタイトル
{暴満館} 適当なタイトル
*暴満館* 適当なタイトル
暴満館☆適当なタイトル
☆暴満館 適当なタイトル
★暴満館(0d10) 適当なタイトル

・・・無難にパイプかブラケットでいいか。

今になって思えば、「暴」の字はダメ文字だわ波ダッシュは爆弾抱えてるわ、とんでもない名前だったんだな。

あー、全ページ再生成するのめんど。

非SJIS文字のコピペ

非SJIS文字をコピーして、非Unicode環境に貼り付けた場合、文字によってはWindows側が自動的にUnicodeからSJISの適当な文字へ変換してくれる。試しに「»」をコピーしてTerapadに貼り付ければ「≫」に変換されるのがわかると思う。

だが、それは意図した動作ではないと思われるので、Unicodeに対応したソフトウェアを使うとよい。テキストエディタならAlpha萌ディタが対応している。両者ともJavaScript等によるマクロの記述が可能。

俺の場合Alphaに以下のスクリプトを用いることで文字と数値文字参照を相互に変換できるようにしている。

//文字列を数値文字参照に
function main( args ) {
    var sel = Ambient.activeBuffer.editor.selection;
    if( !sel.Empty )
        sel.replace(
            sel.Text
            .replace( /&#x([\da-f]{2,4});/gi,
            function( $0, $1 ) { return String.fromCharCode( "0x" + $1 ) } )
            .replace( /./g,
            function( $0 ) { return "&#x" + $0.charCodeAt( ).toString( 16 ).toUpperCase( ) + ";" } )
        );
    return 0;
}

//数値文字参照を文字列に
function main( args ) {
    var sel = Ambient.activeBuffer.editor.selection;
    if( !sel.Empty )
        sel.replace(
            sel.Text.replace( /&#x([\da-f]{2,4});/gi,
            function( $0, $1 ) { return String.fromCharCode( "0x" + $1 ) } )
        );
    return 0;
}

これなら実際にHTML上で表現したい場合も一発で数値文字参照に変換できるので非常に楽。スクリプトを少し弄れば萌ディタ等でも利用可能だろう。

書いといてなんだけど、そもそも数値文字参照自体あんま使わねーよなー。携帯用絵文字を外字登録してて、検索とかに不便だからって変換したり、Greasemonkey内で日本語を含む文字列使いたいけどインストール時に化けるから、しかたなく変換したりとか。パッと思いついたのはこれぐらい?

参考