2015-06-08

日本語IMでASCIIコード0x08(BS)を入力する方法

OS X Yosemite 10.10.3 の日本語IMでASCIIコードBS(0x08)をデータとして入力する方法を発見したのでメモしておく。

  1. テキストエディットで新規書類を作成する。
  2. 入力メニューで入力ソース「英字」を選択する。
  3. 数字「1」を入力する。
  4. 入力メニューで入力ソース「ひらがな」を選択する。
  5. ローマ字でko=「こ」と入力する。「こ」以外でもひらがな1文字ならなんでもよい。
  6. スペースバーを押して変換する。
  7. 変換中の状態を維持したまま(確定しないで)deleteキーを押す(変換中の文字は消えない)。
  8. もう一度deleteキーを押す(変換中の文字が消える)。
  9. さらに、もう一度deleteキーを押す(最初に入力した1が消えるはずだが消えない)。

おかしな挙動である。 消えないだけならいいのだが、手順8の状態(変換中の文字が消えた直後)でファイル名 sample.txt として保存し16進数でダンプしてみると、

$ hexdump sample.txt
0000000 31 08                                          
0000002

数字"1"を表すASCIIコード0x31の後ろに、0x08という謎のデータが入力されているのが分かる。 0x08はASCIIコードでBS(Back Space)を意味する制御コードである。たぶん、誰もBSなんか入力したくはないが、入力可能である。 しかも、入力されるが目には見えないので厄介だ(バイナリーを表示できるエディターなら見ることができるが)。

この記事ではテキストエディットを使って手順を説明したが、テキストエディットでなくても日本語テキストが入力できるアプリケーションであれば、おおむね再現可能と思われる(アプリケーションによってはクラッシュするので、重要な書類を編集中に試さないようにしましょう)。

おバカなTipsとして仲間内のネタとして楽しめるだけならいいのだが、実際問題として困るのは、こういう妙なキャラクター(制御コード)が、プログラムのソースコードなんかに紛れ込んでしまうとコンパイル時にエラーを引き起こすことがある点だ。 例えば LaTeX では次のようなメッセージが表示されて処理が止まってしまう。

! Package inputenc Error: Keyboard character used is undefined
(inputenc)                in inputencoding `utf8'.

See the inputenc package documentation for explanation.
Type  H   for immediate help.
 ...                                              
                                                  
l.7 ASCIIコードBS(0x08) '^^H
                            ' が含まれている文書の例
? 

C/C++のソースでも紛れ込む場所によってはエラーになる。しかもエラーメッセージから、入力できるはずがない制御コードが原因であると突き止めるのは難しい(初心者にはまず不可能)。

アップルには報告しておいたので、そのうち修正されるだろう。

0 件のコメント:

コメントを投稿