このブログを検索

違うコードが全角にされる問題と対策

Google日本語入力は、文字グループ別に半角か全角かをプロパティで設定することになっている。あくまでも変換後の文字がこの設定の対象なので、ローマ字テーブルで異なるキーにこれらの文字を割り付けるたとしても、プロパティでの設定通りに半角や全角の文字にされる

全角コードとは

ここで言う全角コードとは、(ユニコードの番号で0x0020〜0x007Eの)半角コードと同じ字体だが幅が異なる英数字と記号の事で、全角英数とも呼ばれる。半角コードに0xFEE0を加えた番号が全角コードの番号になる。

しかし、この全角コードが存在する意味を私は知らない(縦書きを意識して日本語システム用に作られたフォント、だと思うが。)し、使おうとも思わない。だからキーを押せば半角コードが出るようにしたい。

尤も、住所の入力などに全角コードを要求する入力フォームが存在するけれど、そういう場合には日本語入力の半角全角変換で全角コードが得られるからローマ字テーブルで全角コードを定義する必要もない

問題の4つのコード

処で、下記の表に載せた4つのコードでは、全角とされるべきコードとは別のコードが全角コードの扱いを受けていて問題になる。
名称半角A: 全角B: 全角にされるコード出力は、
チルダ~0x007E0xFF5E 0x301C 波ダッシュAのコード
ハイフンマイナス-0x002D0xFF0D 0x2212 マイナス符号Aのコード
アポストロフィ'0x00270xFF07 0x2019 右シングル引用符Bのコード
ダブル引用符"0x00220xFF02 0x201D 右ダブル引用符Bのコード

これらの全角コードはプロパティの設定の影響を受け、ローマ字テーブルの定義に関わらず半角のコードや全角のコードで出力される(のは仕方が無い)が、全角コードではない表のB:に当たるコードはローマ字テーブルの定義通りに出力されるべきだ。

ところが、これらのコードをローマ字テーブルで定義しても 実際に出力されるコードは
  • その「名称」のプロパティが半角の場合…半角のコード
  • その「名称」のプロパティが全角の場合…「出力は、」のコード
にされてしまう。

その影響で、プロパティは半角に設定し、キーを1回押すと半角のコード、キーを2回押すと全角にされるコードを出力するようなローマ字テーブルを作ったが、プロパティの影響を受けてどちらも半角のコードが出力されてしまう。

問題の所在

取り違えられたコードの字体はそれぞれ似ている。特に全角チルダと波ダッシュの字体は瓜二つである。しかし、字体が似ているからOKという訳には行かない。

例えば、昔のタイプライターのようにアルファベットの l、O と数字の 1、0 の字体が似ているから兼用したとして、それでマトモに計算出来るはずも無いと分かるだろう。

同じ事が問題の4つのコードにも言える。コードの持つ意味が異なるのだから字体が似ているからといって兼用する事は出来ないのだ。

しかし、本来の全角コードだけを半角にする対象とすれば良いのに、なぜ別のコードにも手を出すのか?

波ダッシュ問題: 波ダッシュの字体が過去に間違ってユニコードに登録されていた事に対し、Windowsは字体が本来の波ダッシュと似ている全角チルダをその代わりに使うようにシステムを作ってしまった。

実は、Google日本語入力のデフォルトのローマ字テーブルでも波ダッシュが定義されているのだが、得られるコードは波ダッシュではなく全角チルダに(Windowsが悪さして)すり替えられている。

ハイフンマイナス: ハイフンマイナスというコードは、その名の通りにハイフンとマイナスの両方の働きを兼用させたものだから問題が生じる。マイナスの字体は当然プラスの字体とバランスが取れている必要があるはずだが、現実は -+ のようにチグハグなのだ。しかし、ユニコードに定義されているマイナス符号のコードを使えば、−+ のようにバランスが取れる。

しかし、マイナス符号をローマ字テーブルで定義しようともハイフンマイナスの全角コードに変えられてしまうので使うことが出来ない。(何故、こんなことをするのかは不明だが、Windowsの仕業らしい。)

アポストロフィとダブル引用符: 引用符として使う場合は左右の引用符を1つのコードで兼用している事で問題が生じる。こちらは全角のコードとして左右兼用型ではなく、右引用符を採用しているのが問題である。(これも、Windowsの仕業らしい。)

こちらは、使いたいコードが全角コードとして出力されるのでプロパティを全角とすれば使えるのだが、そうするとローマ字テーブルで如何なるキーに定義しようとも半角コードの入力が出来なくなる。(IMEをOFFする以外は。)

しかし、(IMEがONの状態で)キーを1回押した時には半角コードを入力出来るのが希望なのである。それにはプロパティは半角にするしかない。しかし、そうすると今度は右引用符が(半角コードに変換されてしまって)入力出来なくなってしまう。

問題の対策

Windowsの問題と言っても、それはローマ字かな変換部分だけの問題らしい。コピペではコードがすり替えられる事は無いし、かな漢字変換の部分でも大丈夫だ。

そこで、かな漢字変換で問題のコードが出せるようにして見た。プロパティは半角にする。キーを1回押せば半角コードが得られる。変換キーを押してその半角コードを変換すれば欲しい「全角コードにされた」コードが得られる、という仕掛けである。

そうすると、シングル・ダブル引用符で右側と対になる左側のシングル・ダブル引用符についても(コードの問題は無いのだが) キーを押した時点ではキーの半角コード、変換キーを押した時に左シングル・ダブル引用符が得られるようにする。この方が右側と同じ扱いなので紛らわしく無い。
押すキー変換後の出力
~チルダ 0x301C 波ダッシュ
-ハイフンマイナス 0x2212 マイナス符号
'アポストロフィ 0x2019 右シングル引用符
"ダブル引用符 0x201D 右ダブル引用符
;セミコロン 0x2018 左シングル引用符
:コロン 0x201C 左ダブル引用符

しかし、そのままでは欲しいコードは沢山ある変換候補の内の1つに過ぎない。だから、問題修正用の辞書を作ってGoogle日本語入力のユーザー辞書として登録し、欲しいコードが変換候補の筆頭になるように、かつその他の候補を抑制するようにする。それを「こぶり辞書」(← ここをクリックしてダウンロード)と名付けた。

Google日本語入力の辞書ツールで新規辞書としてインポートして使う。

辞書の内容は下記。
こぶりじしょバージョン 1.1短縮よみ辞書バージョン情報
~記号波ダッシュ
-記号マイナス符号
'記号右シングル引用符
"記号右ダブル引用符
;記号左シングル引用符
:記号左ダブル引用符
~~抑制単語半角
~抑制単語全角チルダ
~抑制単語オーバーライン
--抑制単語半角
-抑制単語全角ハイフン
-抑制単語全角ダッシュ
-抑制単語長音符
-抑制単語全角ダッシュ長め
-~抑制単語半角
-抑制単語全角チルダ
''抑制単語半角
'抑制単語左シングル引用符
'´抑制単語アキュートアクセント
'"抑制単語半角
'抑制単語左ダブル引用符
'抑制単語右ダブル引用符
'抑制単語半濁点
'抑制単語シングルクウォート
'抑制単語シングルクウォート
""抑制単語半角
"抑制単語左ダブル引用符
"抑制単語濁点
"抑制単語左シングル引用符
"'抑制単語半角
"抑制単語右シングル引用符
"抑制単語ダブルクウォート
"抑制単語ダブルクウォート
;;抑制単語半角
;抑制単語全角セミコロン
::抑制単語半角
:抑制単語全角コロン
:抑制単語三点リーダー縦
:抑制単語二点リーダー縦

左シングル・ダブル引用符に割り当てるキーの話

左シングル引用符は「;」、左ダブル引用符は「:」を入力キーとして割り当てた。これは、USキーボードに於いて「下 ' 、上 "」のキーの左隣りのキーが「下 ; 、上 :」であるというだけの理由である。
日本語キーボードでも、左から 「L]、「;」、「:」 と並んでいるので、違和感は少ないのではないかと思っている。