機種依存文字とUnicode

導入

機種依存文字と呼ばれる文字があります。 例えばWindowsでは、 大文字のローマ数字(ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ)、 小文字のローマ数字(ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹ)、 丸囲み数字(①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳)、 丸囲み文字(㊤㊥㊦㊧㊨)、 カタカナ表記の単位(㍉㍍㌔㌘㌧㌦㍑㌫㌢)、 単位記号(㎝㎏㎡)、 複数のアルファベットを合成した文字(㏍℡№)、 元号(㍻㍼㍽㍾)、 会社名等で用いられる括弧囲み文字(㈱㈲㈹)等が機種依存文字と呼ばれています。

機種依存文字は一般的に、異機種間でデータの交換を行った場合、 例えばWindowsで作成したテキストファイルをMacintoshで表示した場合に文字化けしてしまうので、 これら異機種でデータ交換することを前提としたインターネットでは利用するべきではないと言われています。

しかし、これらは機種依存文字と呼ばれているものの、 その意味はある意味間違ってはいませんが、ある意味では間違っています。 そのため、文字化けを起こさずにこれらの文字を交換することが可能です。

機種依存文字は何故文字化けするのか?

WindowsもMacintoshもShift_JISという同じ文字コードが使われていることは有名です。 同じ文字コードでデータ交換を行うのであれば文字化けは発生しないはずです。 では何故、異機種間でデータを交換すると文字化けするのでしょうか?

実は、これらの文字はShift_JISでは扱えない文字である、というところに問題があります。 これらの文字はShift_JISで文字が定義されていないコードに無理矢理文字を割り当てて、 取り扱えるようにしたものなのです。 ローマ数字(大文字)の場合、Windowsでは以下のコードが割り当てられています(各行、最初の16進数)。

0x8754	0x2160	#ROMAN NUMERAL ONE
0x8755	0x2161	#ROMAN NUMERAL TWO
0x8756	0x2162	#ROMAN NUMERAL THREE
0x8757	0x2163	#ROMAN NUMERAL FOUR
0x8758	0x2164	#ROMAN NUMERAL FIVE
0x8759	0x2165	#ROMAN NUMERAL SIX
0x875A	0x2166	#ROMAN NUMERAL SEVEN
0x875B	0x2167	#ROMAN NUMERAL EIGHT
0x875C	0x2168	#ROMAN NUMERAL NINE
0x875D	0x2169	#ROMAN NUMERAL TEN

このような拡張文字があることから、Microsoftが拡張したShift_JISは一般的にはCP932と呼ばれます(CPはコードページの略)。

このコードがMacintoshのShift_JISでは何に割り当てられているのかを調べてみると、 次のようになっています。

0x8754	0x3235	# PARENTHESIZED IDEOGRAPH SPECIAL
0x8755	0x323C	# PARENTHESIZED IDEOGRAPH SUPERVISE
0x8756	0x323D	# PARENTHESIZED IDEOGRAPH ENTERPRISE
0x8757	0x323F	# PARENTHESIZED IDEOGRAPH ALLIANCE
0x8758	0x3238	# PARENTHESIZED IDEOGRAPH LABOR

にあたる0x8754から、にあたる0x8758は別の文字に割り当てられているのが分かりますし、 0x8759以降は文字が割り当てられてすらいないようです。

では、Macintoshでローマ数字は使えないのかというと、そういうわけでもなく、 以下のようにまた別のコードにローマ数字が割り当てられていることがわかります。

0x859F	0x2160	# ROMAN NUMERAL ONE
0x85A0	0x2161	# ROMAN NUMERAL TWO
0x85A1	0x2162	# ROMAN NUMERAL THREE
0x85A2	0x2163	# ROMAN NUMERAL FOUR
0x85A3	0x2164	# ROMAN NUMERAL FIVE
0x85A4	0x2165	# ROMAN NUMERAL SIX
0x85A5	0x2166	# ROMAN NUMERAL SEVEN
0x85A6	0x2167	# ROMAN NUMERAL EIGHT
0x85A7	0x2168	# ROMAN NUMERAL NINE
0x85A8	0x2169	# ROMAN NUMERAL TEN

ちなみに、Windowsで(CP932に)これらのコードには何の文字も割り当てられていません。

このように、データ交換の際に文字化けを引き起こす機種依存文字と呼ばれる文字が存在することは確かであると言えます。

機種依存文字という名称は適切ではない

ここまでの解説で、機種依存文字というのは、 Shift_JISの未定義領域を各ベンダーが互換を考えずに独自拡張した結果であることが分かるかと思います。 この理屈から考えるなら、これら機種依存文字と呼ばれる文字も、 正式に規格化された文字コードで利用するならば機種依存ではない、という理屈も見えてきます。 つまり、機種依存文字は、ある特定の文字コードで機種依存であるだけで、 全ての文字コードで機種依存という訳ではないのです。 そして実際に、これらの機種依存文字と呼ばれていた文字が定義された文字コードが存在しています。 それはUnicodeです。

UnicodeはWebでは一般的に、UTF-16、もしくはUTF-8、UTF-7のいずれかで利用されています。 これらの文字コードでHTMLファイルを作ると、機種依存文字を問題なく記述することができます

また、Shift_JIS等で記述したファイルであっても、HTMLの数値文字参照を利用すればこれらの文字を利用することができます。

更に、以下の表にあるように、機種依存文字と呼ばれていた文字をさらに拡張し、 Unicodeでのみ扱える文字というのも増えています。 例えば、という文字も0x3299に定義されています。 この文字は需要はあったものの、従来のWindowsのCP932では利用できませんでした(Macintoshでは利用できていました)。

ローマ数字や単位に関する注意

ローマ数字や単位といった、複数の文字を組み合わせて一つの文字になっている場合、 これらを利用する方が良いことがあります。 例えば、ローマ数字の3である、IIIと、について考えてみましょう。 これらは共に、目で見る分には同じ様に見えます。 もともとローマ数字はアルファベットを組み合わせて数字を表現したもののようですので、 それは当然のことかもしれません。 しかし、これらはコンピュータから見ると異なって見えます。

IIIと記述するとIが三つ並んでいますので、 例えば音声読み上げブラウザで読み上げるとあい、あい、あいとなるかもしれません(実情はしりませんが、可能性は高いと思われます)。 それに対してと記述すると、これは明らかに数字の3ですのでさん、もしくはスリーと読み上げられる可能性が高くなります。 これは、視覚にハンデのある方にとってはアクセシビリティに関わる問題です。

また、より多くの人にとって身近なところでは、検索エンジンがあります。 今後も検索エンジンが進化していけば、 例えば3という入力で、 ドラクエⅢも検索結果に含まれることが期待できます。

単位の場合も同様で、一文字の中に複数の文字が入っているこれらの文字は、 それ単独で、意味を持ち合わせているという点で、同義の文字の組み合わせよりも優れています。

実用上の注意

この様に、技術的にはローマ数字や記号を直接利用することは好ましいことです。 しかし、実用に際しては注意も必要です。

例えば、単位の多くは下の実例を見てもらえれば分かるように、 文字が小さくなるので非常に読みにくくなってしまいます。

また、互換性の面では、WindowsやMacintoshには元々機種依存文字として存在していたものの、 他のOSには存在していなかった文字、こういった文字はUnicodeで利用可能となっているとはいえ、 そのOSで表示可能なフォントがあるかどうかは実機でテストしてみなくては分かりません。

現在、様々なシステムはUnicodeをベースとして設計されています。 そのため、Unicodeの利用には問題は無いでしょう。 問題があるとすればフォントですが、これは年々改善していくことが期待できます。 みなさんが率先して利用していけば、フォントの実装改善は、より加速するでしょう。

私は、丸囲み数字や、ローマ数字といった読みにくくない文字に関しては利用を推奨します。 それに対して小さく表示されてしまう単位等の利用は避けるべきではないかと思います。

Unicodeで利用できる文字の例

0x2150から0x219Fまで
01234567 89ABCDEF
0x2150
0x2160
0x2170
0x2180
0x2190
0x2460から0x24EFまで
01234567 89ABCDEF
0x2460
0x2470
0x2480
0x2490
0x24A0
0x24B0
0x24C0
0x24D0
0x24E0
0x2600から0x2660まで
01234567 89ABCDEF
0x2600
0x2610
0x2620
0x2630
0x2640
0x2650
0x2660
0x3220から0x324Fまで
01234567 89ABCDEF
0x3220
0x3230
0x3240
0x3280から0x33FFまで
01234567 89ABCDEF
0x3280
0x3290
0x32A0
0x32B0
0x32C0
0x32D0
0x32E0
0x32F0
0x3300
0x3310
0x3320
0x3330
0x3340
0x3350
0x3360
0x3370
0x3380
0x3390
0x33A0
0x33B0
0x33C0
0x33D0
0x33E0
0x33F0

参考

Unicode Home Page
Code Charts (PDF Version)
Index of /Public/MAPPINGS/VENDORS