Gauche:文字カテゴリとケースマッピング
Shiro(2011/07/18 18:09:11 PDT): 内部エンコーディングがutf-8でない場合に、 Unicodeで規定されてるカテゴリやケースマッピングをどう扱うか、についてのメモ。
'none'とcase mapping
--enable-multibyte=none
でコンパイルした場合に0x80-0xffの範囲を
どう扱うべきか。
0.9.1まではユルく、使う側でISO-8859-Xのどれかだと思って使えばいいって感じで 考えていたけど、case mappingをまともにやるなら 0x80-0xffのコードがどの文字に対応するのか決めとかないとならない。 まあ今でもutf-8に変換する時にはそのままスルーしているので、 事実上Latin-1 (ISO-8859-1) とみなしていることになる。 なので、case mappingではLatin-1として扱うことにする。
Latin-1とUnicodeのU+00ffまでの範囲は文字としては一致するんだけど、 2文字だけ、対応する大文字がLatin-1の範囲に収まらない文字があるんで、 そこだけ特別扱いする。
- U+00B5 (MICRO SIGN)
- Latin-1ではそのまま (ケース変換せず)
- Unicodeではupcaseが U+039C (GREEK CAPITAL LETTER MU) にマップされる。
- また、foldcaseは (downcase (upcase ch)) なので、U+03BC (GREEK SMALL LETTER MU) になる。
- U+00FF (LATIN SMALL LETTER Y WITH DIAERESIS)
- Latin-1ではそのまま (ケース変換せず)
- Unicodeではupcaseが U+0178 (LATIN CAPITAL LETTER Y WITH DIAERESIS) にマップ。
euc-jp, sjisでのGeneral Category
euc-jp-2004, sjis-2004には、Unicodeに直接対応しない文字が25個ある。 これらの文字のカテゴリやプロパティはUnicodeで規定されてないので、 適当に決める必要がある。
SJIS | EUC | Unicode | 暫定カテゴリ |
82F5 | A4F7 | U+304B U+309A (か + ゜) | Letter, other (Lo) |
82F6 | A4F8 | U+304D U+309A (き + ゜) | Letter, other (Lo) |
82F7 | A4F9 | U+304F U+309A (く + ゜) | Letter, other (Lo) |
82F8 | A4FA | U+3051 U+309A (け + ゜) | Letter, other (Lo) |
82F9 | A4FB | U+3053 U+309A (こ + ゜) | Letter, other (Lo) |
8397 | A5F7 | U+30AB U+309A (カ + ゜) | Letter, other (Lo) |
8398 | A5F8 | U+30AD U+309A (キ + ゜) | Letter, other (Lo) |
8399 | A5F9 | U+30AF U+309A (ク + ゜) | Letter, other (Lo) |
839A | A5FA | U+30B1 U+309A (ケ + ゜) | Letter, other (Lo) |
839B | A5FB | U+30B3 U+309A (コ + ゜) | Letter, other (Lo) |
839C | A5FC | U+30BB U+309A (セ + ゜) | Letter, other (Lo) |
839D | A5FD | U+30C4 U+309A (ツ + ゜) | Letter, other (Lo) |
839E | A5FE | U+30C8 U+309A (ト + ゜) | Letter, other (Lo) |
83F6 | A6F8 | U+31F7 U+309A (小さいフ + ゜) | Letter, other (Lo) |
8663 | ABC4 | U+00E6 U+0300 (æ + アクサングラーヴ) | Letter, lowercase (Ll) |
8667 | ABC8 | U+0254 U+0300 (ɔ + アクサングラーヴ) | Letter, lowercase (Ll) |
8668 | ABC9 | U+0254 U+0301 (ɔ + アクサンテギュ) | Letter, lowercase (Ll) |
8669 | ABCA | U+028C U+0300 (ʌ + アクサングラーヴ) | Letter, lowercase (Ll) |
866A | ABCB | U+028C U+0301 (ʌ + アクサンテギュ) | Letter, lowercase (Ll) |
866B | ABCC | U+0259 U+0300 (ə + アクサングラーヴ) | Letter, lowercase (Ll) |
866C | ABCD | U+0259 U+0301 (ə + アクサンテギュ) | Letter, lowercase (Ll) |
866D | ABCE | U+025A U+0300 (ɚ + アクサングラーヴ) | Letter, lowercase (Ll) |
866E | ABCF | U+025A U+0301 (ɚ + アクサンテギュ) | Letter, lowercase (Ll) |
8685 | ABE5 | U+02E9 U+02E5 (「/|」みたいな文字) | Symbol, modifier (Sk) |
8686 | ABE6 | U+02E5 U+02E9 (「\|」みたいな文字) | Symbol, modifier (Sk) |
case mappingについて、「æ」、「ɔ」、「ʌ」、「ə」はUnicodeでは 対応する大文字が規定されているが、それら大文字に対応する文字がJISX0213:2004には 存在しないので、case mapping無しって扱いで良いだろう。