“芸能はやはり最強”  Shift_JIS だめ文字

中村ゆり写真集 『 made in…? 』

ひさしぶりにスクリプトを書いていてハマった問題についてメモ.こんな基本的な問題を把握していなかったのが悔しいので,さらなる注意喚起.

Shift_JISに「だめ文字」という不具合があることは聞いていたが,自分がそれに直面していると気づくのに時間がかかった.同じ轍を踏まぬよう,覚えられない数の文字種類ではないので,覚えちゃえばいいと思う.例えば“芸能”は両方ともだめ文字.

具体的な文字

―ソЫ噂浬欺圭構蚕十申曾箪貼能表暴予禄兔喀媾彌拿杤歃濬畚秉綵臀藹觸軆鐔饅鷭
−ポл榎掛弓芸鋼旨楯酢掃竹倒培怖翻慾處嘶斈忿掟桍毫烟痞窩縹艚蛞諫轎閖驂黥

※この他にも,はてなに表示できないためココに掲載できない字があります.

Shift_JIS だめ文字

Shift_JISの2byte目が0x5Cと0x7Cであるのが特徴.ASCIIコードにおける制御文字である\と|に相当する.0x5C(\)のほうを「ソ系だめ文字」,0x7C(|)のほうを「ポ系だめ文字」と呼ぶこともある.

これらの文字が含まれている文章を実行する場合,特に外部ライブラリを呼び出しているようなソフトウェアで正しく実行ができないことがある.わたしは今回ソ系・ポ系の両方にハマった.

回避策(従来法)

○ソ系だめ文字の後に'\'を追記する ⇒ これによりだめ文字が正しく表示される場合がある.しかし,うまくいかない場合も多い.
EUCUnicodeなどの別の文字コードを使う ⇒ そもそもShift_JISしか対応しないソフトウェアにはこの方法は無意味.

このため,外部ライブラリを使用しなければならない場合には,根本的な回避策が存在しない場合がある.そこで,

回避策(提案法)

しかたないので,「だめ文字を平仮名に置換して,別途だめ文字であるため置き換えたことを強調する」という手法を選んだ.間抜けで美しくないのは分かっているけれど.
いっそのこと,置き換え方を統一したらどうだろう.例えば下記みたいに.

  • 圭→けい (※けいは佳の旁
  • 構→こう (※こうは木偏に冓
  • 蚕→かいこ (※かいこは天に虫
  • 十→じゅう (※じゅうは漢数字の10
  • 申→しん (※しんは伸の旁
  • 貼→てん (※てんは貝偏に占
  • 能→のう (※のうは熊の上部
  • 表→ひょう (※ひょうは俵の旁
  • 暴→ぼう (※ぼうは爆の旁
  • 予→よ (※よは預の偏
  • 禄→ろく (※ろくは示偏に緑の旁
  • 榎→え (※えは木偏に夏
  • 掛→かけ (※かけは手篇に卦
  • 弓→ゆみ (※ゆみは弥の偏
  • 芸→げい (※げいは草冠に云
  • 鋼→はがね (※はがねは金偏に岡
  • 旨→むね (※むねは指の旁
  • 酢→す (※すは酉偏に乍
  • 掃→そう (※そうは手偏に帚
  • 竹→たけ (※たけは植物のたけ
  • 倒→とう (※とうは人偏に到
  • 培→ばい (※ばいは土偏に咅
  • 怖→ふ (※ふは立心篇に布
  • 諫→いさ (※いさは言篇に柬