English page もどる

文字幅問題 (2001-04-30)

最新版を参照してください!

コンピュータは、ヨーロッパやアメリカと同様、 中日韓においても昔から使われてきました。 中日韓の人々がコンピュータで漢字を使い始めた当初から、 漢字はターミナルベースの (GUI ではない) ソフトウェアやハードウェアにおいて 2 カラムを占有してきました。 従って、1 カラムの (日本語で「半角」) 文字と 2 カラムの (日本語で「全角」) 文字があります。(少なくとも日本では) 文字幅を決めた公的な規格は存在しませんが、半角・全角の概念は 中日韓の世界において非常に強いデファクトスタンダードとなっています。

中日韓のエンコーディング群においては、 ある文字が半角か全角かを判別するのは非常に簡単です。 ISO 646 (ASCII、JIS X 0201 ローマ字、などなど) と JIS X 0201 カナに属する文字は半角、それ以外は全角です。 中日韓の人々は何十年もこのデファクトスタンダードに従って 生活しているので、私の意見では、このデファクトスタンダードは 重大な欠陥を抱えていないことが実績によって証明されています。 したがって、Unicode とその変換表は、 私が以下で述べる問題に対処する責任があると思います。

Unicode Consortium は、 この中日韓のデファクトスタンダードに対応すべく、 Unicode Standard Annex #11 EAST ASIAN WIDTH (UAX#11、以前には UTR#11) を提供しています。この文書は、Unicode 文字をいくつかのカテゴリに 分類しています。「N」「A」「H」「W」「F」「Na」です。

訳注: 「Na」は narrow、「H」は half width で、半角です。 「W」は wide、「F」は full width で、全角です。 「N」は not asian で、中日韓の文字集合に現れない文字です。 「A」は ambiguous で、文脈依存の意味です。

中日韓のデファクトスタンダードを保持するためには、 ISO 646 (ASCII、JIS X 0201 ローマ字、などなど) と JIS X 0201 カナに属する文字は「Na」または「H」、中日韓エンコーディングに 現れるその他の文字は「W」「F」「A」のいずれかとなるべきです。 さらに、「N」の出現は UAX#11 のバグとみなすべきです。

訳注: なぜ「A」が許されるかというと、「A」はロシア文字やギリシャ文字のように、 JIS X 0208 に含まれるけれども本来は半角であるべき文字に適用されて いるからです。

私はスクリプトを用いて EastAsianWidth.txt をチェックし、 以下の問題を見付けました。

FILE JIS0208.TXT------
0x2140  U+005C  Na  # REVERSE SOLIDUS
0x215D  U+2212  N  # MINUS SIGN
0x2171  U+00A2  Na  # CENT SIGN
0x2172  U+00A3  Na  # POUND SIGN
0x224C  U+00AC  Na  # NOT SIGN
FILE JIS0212.TXT------
0x2234  U+00AF  Na  # MACRON
0x2237  U+007E  Na  # TILDE
0x2238  U+0384  N  # GREEK TONOS
0x2239  U+0385  N  # GREEK DIALYTIKA TONOS
0x2243  U+00A6  Na  # BROKEN BAR
0x226D  U+00A9  N  # COPYRIGHT SIGN
0x226E  U+00AE  N  # REGISTERED SIGN
0x2271  U+2116  N  # NUMERO SIGN
0x2661  U+0386  N  # GREEK CAPITAL LETTER ALPHA WITH TONOS
0x2662  U+0388  N  # GREEK CAPITAL LETTER EPSILON WITH TONOS
0x2663  U+0389  N  # GREEK CAPITAL LETTER ETA WITH TONOS
0x2664  U+038A  N  # GREEK CAPITAL LETTER IOTA WITH TONOS
0x2665  U+03AA  N  # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
0x2667  U+038C  N  # GREEK CAPITAL LETTER OMICRON WITH TONOS
0x2669  U+038E  N  # GREEK CAPITAL LETTER UPSILON WITH TONOS
0x266A  U+03AB  N  # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
0x266C  U+038F  N  # GREEK CAPITAL LETTER OMEGA WITH TONOS
0x2671  U+03AC  N  # GREEK SMALL LETTER ALPHA WITH TONOS
0x2672  U+03AD  N  # GREEK SMALL LETTER EPSILON WITH TONOS
0x2673  U+03AE  N  # GREEK SMALL LETTER ETA WITH TONOS
0x2674  U+03AF  N  # GREEK SMALL LETTER IOTA WITH TONOS
0x2675  U+03CA  N  # GREEK SMALL LETTER IOTA WITH DIALYTIKA
0x2676  U+0390  N  # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
0x2677  U+03CC  N  # GREEK SMALL LETTER OMICRON WITH TONOS
0x2678  U+03C2  N  # GREEK SMALL LETTER FINAL SIGMA
0x2679  U+03CD  N  # GREEK SMALL LETTER UPSILON WITH TONOS
0x267A  U+03CB  N  # GREEK SMALL LETTER UPSILON WITH DIALYTIKA
0x267B  U+03B0  N  # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
0x267C  U+03CE  N  # GREEK SMALL LETTER OMEGA WITH TONOS
0x2742  U+0402  N  # CYRILLIC CAPITAL LETTER DJE
0x2743  U+0403  N  # CYRILLIC CAPITAL LETTER GJE
0x2744  U+0404  N  # CYRILLIC CAPITAL LETTER UKRAINIAN IE
0x2745  U+0405  N  # CYRILLIC CAPITAL LETTER DZE
0x2746  U+0406  N  # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
0x2747  U+0407  N  # CYRILLIC CAPITAL LETTER YI
0x2748  U+0408  N  # CYRILLIC CAPITAL LETTER JE
0x2749  U+0409  N  # CYRILLIC CAPITAL LETTER LJE
0x274A  U+040A  N  # CYRILLIC CAPITAL LETTER NJE
0x274B  U+040B  N  # CYRILLIC CAPITAL LETTER TSHE
0x274C  U+040C  N  # CYRILLIC CAPITAL LETTER KJE
0x274D  U+040E  N  # CYRILLIC CAPITAL LETTER SHORT U
0x274E  U+040F  N  # CYRILLIC CAPITAL LETTER DZHE
0x2772  U+0452  N  # CYRILLIC SMALL LETTER DJE
0x2773  U+0453  N  # CYRILLIC SMALL LETTER GJE
0x2774  U+0454  N  # CYRILLIC SMALL LETTER UKRAINIAN IE
0x2775  U+0455  N  # CYRILLIC SMALL LETTER DZE
0x2776  U+0456  N  # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
0x2777  U+0457  N  # CYRILLIC SMALL LETTER YI
0x2778  U+0458  N  # CYRILLIC SMALL LETTER JE
0x2779  U+0459  N  # CYRILLIC SMALL LETTER LJE
0x277A  U+045A  N  # CYRILLIC SMALL LETTER NJE
0x277B  U+045B  N  # CYRILLIC SMALL LETTER TSHE
0x277C  U+045C  N  # CYRILLIC SMALL LETTER KJE
0x277D  U+045E  N  # CYRILLIC SMALL LETTER SHORT U
0x277E  U+045F  N  # CYRILLIC SMALL LETTER DZHE
0x2922  U+0110  N  # LATIN CAPITAL LETTER D WITH STROKE
0x294B  U+014B  N  # LATIN SMALL LETTER ENG
0x2A21  U+00C1  N  # LATIN CAPITAL LETTER A WITH ACUTE
0x2A22  U+00C0  N  # LATIN CAPITAL LETTER A WITH GRAVE
0x2A23  U+00C4  N  # LATIN CAPITAL LETTER A WITH DIAERESIS
0x2A24  U+00C2  N  # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
0x2A25  U+0102  N  # LATIN CAPITAL LETTER A WITH BREVE
0x2A26  U+01CD  N  # LATIN CAPITAL LETTER A WITH CARON
0x2A27  U+0100  N  # LATIN CAPITAL LETTER A WITH MACRON
0x2A28  U+0104  N  # LATIN CAPITAL LETTER A WITH OGONEK
0x2A29  U+00C5  N  # LATIN CAPITAL LETTER A WITH RING ABOVE
0x2A2A  U+00C3  N  # LATIN CAPITAL LETTER A WITH TILDE
0x2A2B  U+0106  N  # LATIN CAPITAL LETTER C WITH ACUTE
0x2A2C  U+0108  N  # LATIN CAPITAL LETTER C WITH CIRCUMFLEX
0x2A2D  U+010C  N  # LATIN CAPITAL LETTER C WITH CARON
0x2A2E  U+00C7  N  # LATIN CAPITAL LETTER C WITH CEDILLA
0x2A2F  U+010A  N  # LATIN CAPITAL LETTER C WITH DOT ABOVE
0x2A30  U+010E  N  # LATIN CAPITAL LETTER D WITH CARON
0x2A31  U+00C9  N  # LATIN CAPITAL LETTER E WITH ACUTE
0x2A32  U+00C8  N  # LATIN CAPITAL LETTER E WITH GRAVE
0x2A33  U+00CB  N  # LATIN CAPITAL LETTER E WITH DIAERESIS
0x2A34  U+00CA  N  # LATIN CAPITAL LETTER E WITH CIRCUMFLEX
0x2A35  U+011A  N  # LATIN CAPITAL LETTER E WITH CARON
0x2A36  U+0116  N  # LATIN CAPITAL LETTER E WITH DOT ABOVE
0x2A37  U+0112  N  # LATIN CAPITAL LETTER E WITH MACRON
0x2A38  U+0118  N  # LATIN CAPITAL LETTER E WITH OGONEK
0x2A3A  U+011C  N  # LATIN CAPITAL LETTER G WITH CIRCUMFLEX
0x2A3B  U+011E  N  # LATIN CAPITAL LETTER G WITH BREVE
0x2A3C  U+0122  N  # LATIN CAPITAL LETTER G WITH CEDILLA
0x2A3D  U+0120  N  # LATIN CAPITAL LETTER G WITH DOT ABOVE
0x2A3E  U+0124  N  # LATIN CAPITAL LETTER H WITH CIRCUMFLEX
0x2A3F  U+00CD  N  # LATIN CAPITAL LETTER I WITH ACUTE
0x2A40  U+00CC  N  # LATIN CAPITAL LETTER I WITH GRAVE
0x2A41  U+00CF  N  # LATIN CAPITAL LETTER I WITH DIAERESIS
0x2A42  U+00CE  N  # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
0x2A43  U+01CF  N  # LATIN CAPITAL LETTER I WITH CARON
0x2A44  U+0130  N  # LATIN CAPITAL LETTER I WITH DOT ABOVE
0x2A45  U+012A  N  # LATIN CAPITAL LETTER I WITH MACRON
0x2A46  U+012E  N  # LATIN CAPITAL LETTER I WITH OGONEK
0x2A47  U+0128  N  # LATIN CAPITAL LETTER I WITH TILDE
0x2A48  U+0134  N  # LATIN CAPITAL LETTER J WITH CIRCUMFLEX
0x2A49  U+0136  N  # LATIN CAPITAL LETTER K WITH CEDILLA
0x2A4A  U+0139  N  # LATIN CAPITAL LETTER L WITH ACUTE
0x2A4B  U+013D  N  # LATIN CAPITAL LETTER L WITH CARON
0x2A4C  U+013B  N  # LATIN CAPITAL LETTER L WITH CEDILLA
0x2A4D  U+0143  N  # LATIN CAPITAL LETTER N WITH ACUTE
0x2A4E  U+0147  N  # LATIN CAPITAL LETTER N WITH CARON
0x2A4F  U+0145  N  # LATIN CAPITAL LETTER N WITH CEDILLA
0x2A50  U+00D1  N  # LATIN CAPITAL LETTER N WITH TILDE
0x2A51  U+00D3  N  # LATIN CAPITAL LETTER O WITH ACUTE
0x2A52  U+00D2  N  # LATIN CAPITAL LETTER O WITH GRAVE
0x2A53  U+00D6  N  # LATIN CAPITAL LETTER O WITH DIAERESIS
0x2A54  U+00D4  N  # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
0x2A55  U+01D1  N  # LATIN CAPITAL LETTER O WITH CARON
0x2A56  U+0150  N  # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
0x2A57  U+014C  N  # LATIN CAPITAL LETTER O WITH MACRON
0x2A58  U+00D5  N  # LATIN CAPITAL LETTER O WITH TILDE
0x2A59  U+0154  N  # LATIN CAPITAL LETTER R WITH ACUTE
0x2A5A  U+0158  N  # LATIN CAPITAL LETTER R WITH CARON
0x2A5B  U+0156  N  # LATIN CAPITAL LETTER R WITH CEDILLA
0x2A5C  U+015A  N  # LATIN CAPITAL LETTER S WITH ACUTE
0x2A5D  U+015C  N  # LATIN CAPITAL LETTER S WITH CIRCUMFLEX
0x2A5E  U+0160  N  # LATIN CAPITAL LETTER S WITH CARON
0x2A5F  U+015E  N  # LATIN CAPITAL LETTER S WITH CEDILLA
0x2A60  U+0164  N  # LATIN CAPITAL LETTER T WITH CARON
0x2A61  U+0162  N  # LATIN CAPITAL LETTER T WITH CEDILLA
0x2A62  U+00DA  N  # LATIN CAPITAL LETTER U WITH ACUTE
0x2A63  U+00D9  N  # LATIN CAPITAL LETTER U WITH GRAVE
0x2A64  U+00DC  N  # LATIN CAPITAL LETTER U WITH DIAERESIS
0x2A65  U+00DB  N  # LATIN CAPITAL LETTER U WITH CIRCUMFLEX
0x2A66  U+016C  N  # LATIN CAPITAL LETTER U WITH BREVE
0x2A67  U+01D3  N  # LATIN CAPITAL LETTER U WITH CARON
0x2A68  U+0170  N  # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
0x2A69  U+016A  N  # LATIN CAPITAL LETTER U WITH MACRON
0x2A6A  U+0172  N  # LATIN CAPITAL LETTER U WITH OGONEK
0x2A6B  U+016E  N  # LATIN CAPITAL LETTER U WITH RING ABOVE
0x2A6C  U+0168  N  # LATIN CAPITAL LETTER U WITH TILDE
0x2A6D  U+01D7  N  # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
0x2A6E  U+01DB  N  # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE
0x2A6F  U+01D9  N  # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON
0x2A70  U+01D5  N  # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON
0x2A71  U+0174  N  # LATIN CAPITAL LETTER W WITH CIRCUMFLEX
0x2A72  U+00DD  N  # LATIN CAPITAL LETTER Y WITH ACUTE
0x2A73  U+0178  N  # LATIN CAPITAL LETTER Y WITH DIAERESIS
0x2A74  U+0176  N  # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
0x2A75  U+0179  N  # LATIN CAPITAL LETTER Z WITH ACUTE
0x2A76  U+017D  N  # LATIN CAPITAL LETTER Z WITH CARON
0x2A77  U+017B  N  # LATIN CAPITAL LETTER Z WITH DOT ABOVE
0x2B23  U+00E4  N  # LATIN SMALL LETTER A WITH DIAERESIS
0x2B24  U+00E2  N  # LATIN SMALL LETTER A WITH CIRCUMFLEX
0x2B25  U+0103  N  # LATIN SMALL LETTER A WITH BREVE
0x2B28  U+0105  N  # LATIN SMALL LETTER A WITH OGONEK
0x2B29  U+00E5  N  # LATIN SMALL LETTER A WITH RING ABOVE
0x2B2A  U+00E3  N  # LATIN SMALL LETTER A WITH TILDE
0x2B2B  U+0107  N  # LATIN SMALL LETTER C WITH ACUTE
0x2B2C  U+0109  N  # LATIN SMALL LETTER C WITH CIRCUMFLEX
0x2B2D  U+010D  N  # LATIN SMALL LETTER C WITH CARON
0x2B2E  U+00E7  N  # LATIN SMALL LETTER C WITH CEDILLA
0x2B2F  U+010B  N  # LATIN SMALL LETTER C WITH DOT ABOVE
0x2B30  U+010F  N  # LATIN SMALL LETTER D WITH CARON
0x2B33  U+00EB  N  # LATIN SMALL LETTER E WITH DIAERESIS
0x2B36  U+0117  N  # LATIN SMALL LETTER E WITH DOT ABOVE
0x2B38  U+0119  N  # LATIN SMALL LETTER E WITH OGONEK
0x2B39  U+01F5  N  # LATIN SMALL LETTER G WITH ACUTE
0x2B3A  U+011D  N  # LATIN SMALL LETTER G WITH CIRCUMFLEX
0x2B3B  U+011F  N  # LATIN SMALL LETTER G WITH BREVE
0x2B3D  U+0121  N  # LATIN SMALL LETTER G WITH DOT ABOVE
0x2B3E  U+0125  N  # LATIN SMALL LETTER H WITH CIRCUMFLEX
0x2B41  U+00EF  N  # LATIN SMALL LETTER I WITH DIAERESIS
0x2B42  U+00EE  N  # LATIN SMALL LETTER I WITH CIRCUMFLEX
0x2B46  U+012F  N  # LATIN SMALL LETTER I WITH OGONEK
0x2B47  U+0129  N  # LATIN SMALL LETTER I WITH TILDE
0x2B48  U+0135  N  # LATIN SMALL LETTER J WITH CIRCUMFLEX
0x2B49  U+0137  N  # LATIN SMALL LETTER K WITH CEDILLA
0x2B4A  U+013A  N  # LATIN SMALL LETTER L WITH ACUTE
0x2B4B  U+013E  N  # LATIN SMALL LETTER L WITH CARON
0x2B4C  U+013C  N  # LATIN SMALL LETTER L WITH CEDILLA
0x2B4F  U+0146  N  # LATIN SMALL LETTER N WITH CEDILLA
0x2B50  U+00F1  N  # LATIN SMALL LETTER N WITH TILDE
0x2B53  U+00F6  N  # LATIN SMALL LETTER O WITH DIAERESIS
0x2B54  U+00F4  N  # LATIN SMALL LETTER O WITH CIRCUMFLEX
0x2B56  U+0151  N  # LATIN SMALL LETTER O WITH DOUBLE ACUTE
0x2B58  U+00F5  N  # LATIN SMALL LETTER O WITH TILDE
0x2B59  U+0155  N  # LATIN SMALL LETTER R WITH ACUTE
0x2B5A  U+0159  N  # LATIN SMALL LETTER R WITH CARON
0x2B5B  U+0157  N  # LATIN SMALL LETTER R WITH CEDILLA
0x2B5C  U+015B  N  # LATIN SMALL LETTER S WITH ACUTE
0x2B5D  U+015D  N  # LATIN SMALL LETTER S WITH CIRCUMFLEX
0x2B5E  U+0161  N  # LATIN SMALL LETTER S WITH CARON
0x2B5F  U+015F  N  # LATIN SMALL LETTER S WITH CEDILLA
0x2B60  U+0165  N  # LATIN SMALL LETTER T WITH CARON
0x2B61  U+0163  N  # LATIN SMALL LETTER T WITH CEDILLA
0x2B65  U+00FB  N  # LATIN SMALL LETTER U WITH CIRCUMFLEX
0x2B66  U+016D  N  # LATIN SMALL LETTER U WITH BREVE
0x2B68  U+0171  N  # LATIN SMALL LETTER U WITH DOUBLE ACUTE
0x2B6A  U+0173  N  # LATIN SMALL LETTER U WITH OGONEK
0x2B6B  U+016F  N  # LATIN SMALL LETTER U WITH RING ABOVE
0x2B6C  U+0169  N  # LATIN SMALL LETTER U WITH TILDE
0x2B71  U+0175  N  # LATIN SMALL LETTER W WITH CIRCUMFLEX
0x2B72  U+00FD  N  # LATIN SMALL LETTER Y WITH ACUTE
0x2B73  U+00FF  N  # LATIN SMALL LETTER Y WITH DIAERESIS
0x2B74  U+0177  N  # LATIN SMALL LETTER Y WITH CIRCUMFLEX
0x2B75  U+017A  N  # LATIN SMALL LETTER Z WITH ACUTE
0x2B76  U+017E  N  # LATIN SMALL LETTER Z WITH CARON
0x2B77  U+017C  N  # LATIN SMALL LETTER Z WITH DOT ABOVE
FILE SHIFTJIS.TXT------
0x7E  U+203E  N  # OVERLINE
0x815F  U+005C  Na  # REVERSE SOLIDUS
0x817C  U+2212  N  # MINUS SIGN
0x8191  U+00A2  Na  # CENT SIGN
0x8192  U+00A3  Na  # POUND SIGN
0x81CA  U+00AC  Na  # NOT SIGN
FILE CP932.TXT------
0x8782  U+2116  N  #NUMERO SIGN
0xFA59  U+2116  N  #NUMERO SIGN
FILE JAPANESE.TXT------
FILE GB2312.TXT------
0x216D  U+2116  N  # NUMERO SIGN
FILE CHINSIMP.TXT------
FILE BIG5.TXT------
0xA145  U+2022  N  # BULLET
0xA14E  U+FF64  H  # HALFWIDTH IDEOGRAPHIC COMMA
0xA1C2  U+203E  N  # OVERLINE
0xA1F2  U+2641  N  # EARTH
0xA244  U+00A5  Na  # YEN SIGN
0xA246  U+00A2  Na  # CENT SIGN
0xA247  U+00A3  Na  # POUND SIGN
FILE CHINTRAD.TXT------
FILE KSX1001.TXT------
FILE KOREAN.TXT------
チェックに用いたスクリプトは以下の通りです。
#!/usr/bin/perl

open(FILE, "EastAsianWidth.txt") || die "Cannot open width file.";
while($a = <FILE>) {
	$a =~ /^([0-9A-F]+);([A-Za-z]+)/;
	$num = $1; $w = $2;
	if ($num eq "") {next;}
	$width{$num} = $w;
}
close(FILE);

sub checkfile($$$$) {
	my($file, $localcolumn, $ucscolumn, $commentcolumn)=@_;
	open(FILE, $file) || die "Cannot open $file";
	print "FILE $file------\n";
	while($a = <FILE>) {
	    if ($a =~ /^\#/) {next;}
	    chomp($a);
	    @list = split(/\t/, $a);
	    $loc = $list[$localcolumn];
	    $ucs = $list[$ucscolumn];
	    if ($ucs < 0x20 || ($ucs >= 0x7f && $ucs <= 0x9f)) {next;}
	    $ucs =~ s/0x//;
	    $width = $width{$ucs};
	    $com = $list[$commentcolumn];
	    if ($loc < 0x100 && 
		($width eq "W" || $width eq "F" || $width eq "A" || $width eq "N")) {
		print "$loc  U+$ucs  $width  $com\n";
	    } elsif ($loc > 0x100 && 
		($width eq "N" || $width eq "H" || $width eq "Na")) {
		print "$loc  U+$ucs  $width  $com\n";
	    }
	    
	}
}

&checkfile("JIS0208.TXT", 1, 2, 3);
&checkfile("JIS0212.TXT", 0, 1, 2);
&checkfile("SHIFTJIS.TXT", 0, 1, 2);
&checkfile("CP932.TXT", 0, 1, 2);
&checkfile("JAPANESE.TXT", 0, 1, 2);
&checkfile("GB2312.TXT", 0, 1, 2);
&checkfile("CHINSIMP.TXT", 0, 1, 2);
&checkfile("BIG5.TXT", 0, 1, 2);
&checkfile("CHINTRAD.TXT", 0, 1, 2);
&checkfile("KSX1001.TXT", 0, 1, 2);
&checkfile("KOREAN.TXT", 0, 1, 2);
注: Unicode Consortium によって提供されている変換表だけしか チェックできない、というこの研究の限界に注意してください。

この結果は、UAX#11 のバグまたは変換表のバグだとみなせます。 が、UAX#11 を変更することによってしかこのバグが修正できない場合があります。 たとえば、

しかし、U+005C 逆スラッシュ (\) については、 私がチェックしたすべてのエンコーディングを満足させるような方法で UAX#11 を変更することができません。なぜなら、 JIS0208.TXT や SHIFTJIS.TXT などの変換表は U+005C が全角であることを要求し、 CP932 などの変換表は U+005C が半角であることを要求するからです。 標準化団体として Unicode には、U+005C を「A」に分類するという 道があります。しかし、中日韓との互換性が必要なときには 「A」に分類された文字を全角と解釈するソフトウェアが出てくることでしょう (つまり、CP932 などは互換性を保てなくなります)。 したがって、変換表を変更することが、唯一の解決法となります。 おそらく、最も穏当な解決法は、U+005C を「Na」に分類し、 JIS0208.TXT と SHIFTJIS.TXT と JIS X 0221 を、 JIS X 0208 の 0x2140 が U+FF3C (\) に変換されるように 変更することだろうと思います。

同様の問題は以下の文字でも生じています。

私は、BIG5.TXT の

0xA14E  U+FF64  H  # HALFWIDTH IDEOGRAPHIC COMMA
はバグだと思います。0xA14E は全角でないといけないのに、 U+FF64 はその定義上「H」でないといけません。 したがって、変換表である BIG5.TXT を変更する必要があります。


Tomohiro KUBOTA <debian at tmail dot plala dot or dot jp>