| line | stmt | bran | cond | sub | pod | time | code | 
| 1 |  |  |  |  |  |  | package Unicode::CharName; | 
| 2 |  |  |  |  |  |  |  | 
| 3 |  |  |  |  |  |  | =head1 NAME | 
| 4 |  |  |  |  |  |  |  | 
| 5 |  |  |  |  |  |  | Unicode::CharName - Look up Unicode character names | 
| 6 |  |  |  |  |  |  |  | 
| 7 |  |  |  |  |  |  | =head1 SYNOPSIS | 
| 8 |  |  |  |  |  |  |  | 
| 9 |  |  |  |  |  |  | use Unicode::CharName qw(uname ublock); | 
| 10 |  |  |  |  |  |  | print uname(ord('%')), "\n"; | 
| 11 |  |  |  |  |  |  | print ublock(0x0300), "\n"; | 
| 12 |  |  |  |  |  |  |  | 
| 13 |  |  |  |  |  |  | =head1 DESCRIPTION | 
| 14 |  |  |  |  |  |  |  | 
| 15 |  |  |  |  |  |  | This module provide a two functions named uname() and ublock().  The | 
| 16 |  |  |  |  |  |  | uname() function will return the Unicode character name for the given | 
| 17 |  |  |  |  |  |  | code (a number between 0 and 0x10FFFF).  Unicode character names are | 
| 18 |  |  |  |  |  |  | written in upper-case ASCII letters, and are strings like: | 
| 19 |  |  |  |  |  |  |  | 
| 20 |  |  |  |  |  |  | LATIN CAPITAL LETTER A | 
| 21 |  |  |  |  |  |  | LATIN SMALL LETTER A WITH RING ABOVE | 
| 22 |  |  |  |  |  |  | CJK UNIFIED IDEOGRAPH 7C80 | 
| 23 |  |  |  |  |  |  | HANGUL SYLLABLE PWILH | 
| 24 |  |  |  |  |  |  |  | 
| 25 |  |  |  |  |  |  | The ublock() will return the name of the Unicode | 
| 26 |  |  |  |  |  |  | character block that the given character belongs to. | 
| 27 |  |  |  |  |  |  |  | 
| 28 |  |  |  |  |  |  | =head1 SEE ALSO | 
| 29 |  |  |  |  |  |  |  | 
| 30 |  |  |  |  |  |  | L | 
| 31 |  |  |  |  |  |  |  | 
| 32 |  |  |  |  |  |  | =head1 COPYRIGHT | 
| 33 |  |  |  |  |  |  |  | 
| 34 |  |  |  |  |  |  | Copyright 1997,2005 Gisle Aas. | 
| 35 |  |  |  |  |  |  |  | 
| 36 |  |  |  |  |  |  | This library is free software; you can redistribute it and/or | 
| 37 |  |  |  |  |  |  | modify it under the same terms as Perl itself. | 
| 38 |  |  |  |  |  |  |  | 
| 39 |  |  |  |  |  |  | Name table extracted from the Unicode 4.1 Character | 
| 40 |  |  |  |  |  |  | Database. Copyright (c) 1991-2005 Unicode, Inc. All Rights reserved. | 
| 41 |  |  |  |  |  |  |  | 
| 42 |  |  |  |  |  |  | =cut | 
| 43 |  |  |  |  |  |  |  | 
| 44 |  |  |  |  |  |  | require Exporter; | 
| 45 |  |  |  |  |  |  | @ISA=qw(Exporter); | 
| 46 |  |  |  |  |  |  | @EXPORT_OK = qw(uname ublock); | 
| 47 |  |  |  |  |  |  | $VERSION = sprintf("%d.%02d", q$Revision: 1.7 $ =~ /(\d+)\.(\d+)/); | 
| 48 |  |  |  |  |  |  |  | 
| 49 | 1 |  |  | 1 |  | 3462 | use strict; | 
|  | 1 |  |  |  |  | 3 |  | 
|  | 1 |  |  |  |  | 57 |  | 
| 50 | 1 |  |  | 1 |  | 6 | use vars qw(%JAMO_SHORT_NAME %NAMES @BLOCKS); | 
|  | 1 |  |  |  |  | 1 |  | 
|  | 1 |  |  |  |  | 1640 |  | 
| 51 |  |  |  |  |  |  |  | 
| 52 |  |  |  |  |  |  | sub uname { | 
| 53 | 9 |  |  | 9 | 0 | 72 | my $code = shift; | 
| 54 | 9 | 100 |  |  |  | 24 | if ($code >= 0x4E00) { | 
| 55 | 5 | 100 | 66 |  |  | 51 | if ($code <= 0x9FFF || ($code >= 0xF900 && $code <= 0xFAFF)) { | 
|  |  | 100 | 66 |  |  |  |  | 
|  |  | 100 | 100 |  |  |  |  | 
|  |  |  | 66 |  |  |  |  | 
| 56 |  |  |  |  |  |  | # CJK Ideographs | 
| 57 | 1 |  |  |  |  | 9 | return sprintf "CJK UNIFIED IDEOGRAPH %04X", $code; | 
| 58 |  |  |  |  |  |  | } elsif ($code >= 0xD800 && $code <= 0xF8FF) { | 
| 59 |  |  |  |  |  |  | # Surrogate and private | 
| 60 | 2 | 100 |  |  |  | 6 | if ($code <= 0xDFFF) { | 
| 61 | 1 |  |  |  |  | 4 | return ""; | 
| 62 |  |  |  |  |  |  | } else { | 
| 63 | 1 |  |  |  |  | 4 | return ""; | 
| 64 |  |  |  |  |  |  | } | 
| 65 |  |  |  |  |  |  | } elsif ($code >= 0xAC00 && $code <= 0xD7A3) { | 
| 66 |  |  |  |  |  |  | # Hangul Syllables | 
| 67 | 1 |  |  |  |  | 3 | my $sindex = $code - 0xAC00; | 
| 68 | 1 |  |  |  |  | 6 | my $l = 0x1100 + int($sindex / (21*28)); | 
| 69 | 1 |  |  |  |  | 4 | my $v = 0x1161 + int(($sindex % (21*28)) / 28); | 
| 70 | 1 |  |  |  |  | 2 | my $t = 0x11A7 + $sindex % 28; | 
| 71 | 1 |  |  |  |  | 3 | my @s = ($l, $v, $t); | 
| 72 | 1 | 50 |  |  |  | 5 | pop(@s) if $t == 0x11A7; | 
| 73 | 3 |  |  |  |  | 7 | @s = map { | 
| 74 | 1 |  |  |  |  | 4 | $_ = sprintf("%04X", $_); | 
| 75 | 3 | 50 |  |  |  | 16 | $JAMO_SHORT_NAME{$_} || " U+$_ "; | 
| 76 |  |  |  |  |  |  | } @s; | 
| 77 | 1 |  |  |  |  | 6 | return join("", "HANGUL SYLLABLE ", @s) | 
| 78 |  |  |  |  |  |  | } | 
| 79 |  |  |  |  |  |  | } | 
| 80 | 5 | 100 |  |  |  | 18 | _init_names() unless defined %NAMES; | 
| 81 | 5 |  |  |  |  | 49 | $NAMES{sprintf("%04X",$code)} | 
| 82 |  |  |  |  |  |  | } | 
| 83 |  |  |  |  |  |  |  | 
| 84 |  |  |  |  |  |  | sub ublock | 
| 85 |  |  |  |  |  |  | { | 
| 86 | 5 |  |  | 5 | 0 | 27 | my $code = shift; | 
| 87 |  |  |  |  |  |  | # XXX: could use a binary search, but I am too lazy today... | 
| 88 | 5 |  |  |  |  | 6 | my $block; | 
| 89 | 5 |  |  |  |  | 9 | for $block (@BLOCKS) { | 
| 90 | 389 | 100 | 100 |  |  | 1365 | return $block->[2] if $block->[0] <= $code && $block->[1] >= $code; | 
| 91 |  |  |  |  |  |  | } | 
| 92 | 1 |  |  |  |  | 13 | undef; | 
| 93 |  |  |  |  |  |  | } | 
| 94 |  |  |  |  |  |  |  | 
| 95 |  |  |  |  |  |  | @BLOCKS = ( | 
| 96 |  |  |  |  |  |  | #  start   end        block name | 
| 97 |  |  |  |  |  |  | [0x0000, 0x007F => 'Basic Latin'], | 
| 98 |  |  |  |  |  |  | [0x0080, 0x00FF => 'Latin-1 Supplement'], | 
| 99 |  |  |  |  |  |  | [0x0100, 0x017F => 'Latin Extended-A'], | 
| 100 |  |  |  |  |  |  | [0x0180, 0x024F => 'Latin Extended-B'], | 
| 101 |  |  |  |  |  |  | [0x0250, 0x02AF => 'IPA Extensions'], | 
| 102 |  |  |  |  |  |  | [0x02B0, 0x02FF => 'Spacing Modifier Letters'], | 
| 103 |  |  |  |  |  |  | [0x0300, 0x036F => 'Combining Diacritical Marks'], | 
| 104 |  |  |  |  |  |  | [0x0370, 0x03FF => 'Greek and Coptic'], | 
| 105 |  |  |  |  |  |  | [0x0400, 0x04FF => 'Cyrillic'], | 
| 106 |  |  |  |  |  |  | [0x0500, 0x052F => 'Cyrillic Supplement'], | 
| 107 |  |  |  |  |  |  | [0x0530, 0x058F => 'Armenian'], | 
| 108 |  |  |  |  |  |  | [0x0590, 0x05FF => 'Hebrew'], | 
| 109 |  |  |  |  |  |  | [0x0600, 0x06FF => 'Arabic'], | 
| 110 |  |  |  |  |  |  | [0x0700, 0x074F => 'Syriac'], | 
| 111 |  |  |  |  |  |  | [0x0750, 0x077F => 'Arabic Supplement'], | 
| 112 |  |  |  |  |  |  | [0x0780, 0x07BF => 'Thaana'], | 
| 113 |  |  |  |  |  |  | [0x0900, 0x097F => 'Devanagari'], | 
| 114 |  |  |  |  |  |  | [0x0980, 0x09FF => 'Bengali'], | 
| 115 |  |  |  |  |  |  | [0x0A00, 0x0A7F => 'Gurmukhi'], | 
| 116 |  |  |  |  |  |  | [0x0A80, 0x0AFF => 'Gujarati'], | 
| 117 |  |  |  |  |  |  | [0x0B00, 0x0B7F => 'Oriya'], | 
| 118 |  |  |  |  |  |  | [0x0B80, 0x0BFF => 'Tamil'], | 
| 119 |  |  |  |  |  |  | [0x0C00, 0x0C7F => 'Telugu'], | 
| 120 |  |  |  |  |  |  | [0x0C80, 0x0CFF => 'Kannada'], | 
| 121 |  |  |  |  |  |  | [0x0D00, 0x0D7F => 'Malayalam'], | 
| 122 |  |  |  |  |  |  | [0x0D80, 0x0DFF => 'Sinhala'], | 
| 123 |  |  |  |  |  |  | [0x0E00, 0x0E7F => 'Thai'], | 
| 124 |  |  |  |  |  |  | [0x0E80, 0x0EFF => 'Lao'], | 
| 125 |  |  |  |  |  |  | [0x0F00, 0x0FFF => 'Tibetan'], | 
| 126 |  |  |  |  |  |  | [0x1000, 0x109F => 'Myanmar'], | 
| 127 |  |  |  |  |  |  | [0x10A0, 0x10FF => 'Georgian'], | 
| 128 |  |  |  |  |  |  | [0x1100, 0x11FF => 'Hangul Jamo'], | 
| 129 |  |  |  |  |  |  | [0x1200, 0x137F => 'Ethiopic'], | 
| 130 |  |  |  |  |  |  | [0x1380, 0x139F => 'Ethiopic Supplement'], | 
| 131 |  |  |  |  |  |  | [0x13A0, 0x13FF => 'Cherokee'], | 
| 132 |  |  |  |  |  |  | [0x1400, 0x167F => 'Unified Canadian Aboriginal Syllabics'], | 
| 133 |  |  |  |  |  |  | [0x1680, 0x169F => 'Ogham'], | 
| 134 |  |  |  |  |  |  | [0x16A0, 0x16FF => 'Runic'], | 
| 135 |  |  |  |  |  |  | [0x1700, 0x171F => 'Tagalog'], | 
| 136 |  |  |  |  |  |  | [0x1720, 0x173F => 'Hanunoo'], | 
| 137 |  |  |  |  |  |  | [0x1740, 0x175F => 'Buhid'], | 
| 138 |  |  |  |  |  |  | [0x1760, 0x177F => 'Tagbanwa'], | 
| 139 |  |  |  |  |  |  | [0x1780, 0x17FF => 'Khmer'], | 
| 140 |  |  |  |  |  |  | [0x1800, 0x18AF => 'Mongolian'], | 
| 141 |  |  |  |  |  |  | [0x1900, 0x194F => 'Limbu'], | 
| 142 |  |  |  |  |  |  | [0x1950, 0x197F => 'Tai Le'], | 
| 143 |  |  |  |  |  |  | [0x1980, 0x19DF => 'New Tai Lue'], | 
| 144 |  |  |  |  |  |  | [0x19E0, 0x19FF => 'Khmer Symbols'], | 
| 145 |  |  |  |  |  |  | [0x1A00, 0x1A1F => 'Buginese'], | 
| 146 |  |  |  |  |  |  | [0x1D00, 0x1D7F => 'Phonetic Extensions'], | 
| 147 |  |  |  |  |  |  | [0x1D80, 0x1DBF => 'Phonetic Extensions Supplement'], | 
| 148 |  |  |  |  |  |  | [0x1DC0, 0x1DFF => 'Combining Diacritical Marks Supplement'], | 
| 149 |  |  |  |  |  |  | [0x1E00, 0x1EFF => 'Latin Extended Additional'], | 
| 150 |  |  |  |  |  |  | [0x1F00, 0x1FFF => 'Greek Extended'], | 
| 151 |  |  |  |  |  |  | [0x2000, 0x206F => 'General Punctuation'], | 
| 152 |  |  |  |  |  |  | [0x2070, 0x209F => 'Superscripts and Subscripts'], | 
| 153 |  |  |  |  |  |  | [0x20A0, 0x20CF => 'Currency Symbols'], | 
| 154 |  |  |  |  |  |  | [0x20D0, 0x20FF => 'Combining Diacritical Marks for Symbols'], | 
| 155 |  |  |  |  |  |  | [0x2100, 0x214F => 'Letterlike Symbols'], | 
| 156 |  |  |  |  |  |  | [0x2150, 0x218F => 'Number Forms'], | 
| 157 |  |  |  |  |  |  | [0x2190, 0x21FF => 'Arrows'], | 
| 158 |  |  |  |  |  |  | [0x2200, 0x22FF => 'Mathematical Operators'], | 
| 159 |  |  |  |  |  |  | [0x2300, 0x23FF => 'Miscellaneous Technical'], | 
| 160 |  |  |  |  |  |  | [0x2400, 0x243F => 'Control Pictures'], | 
| 161 |  |  |  |  |  |  | [0x2440, 0x245F => 'Optical Character Recognition'], | 
| 162 |  |  |  |  |  |  | [0x2460, 0x24FF => 'Enclosed Alphanumerics'], | 
| 163 |  |  |  |  |  |  | [0x2500, 0x257F => 'Box Drawing'], | 
| 164 |  |  |  |  |  |  | [0x2580, 0x259F => 'Block Elements'], | 
| 165 |  |  |  |  |  |  | [0x25A0, 0x25FF => 'Geometric Shapes'], | 
| 166 |  |  |  |  |  |  | [0x2600, 0x26FF => 'Miscellaneous Symbols'], | 
| 167 |  |  |  |  |  |  | [0x2700, 0x27BF => 'Dingbats'], | 
| 168 |  |  |  |  |  |  | [0x27C0, 0x27EF => 'Miscellaneous Mathematical Symbols-A'], | 
| 169 |  |  |  |  |  |  | [0x27F0, 0x27FF => 'Supplemental Arrows-A'], | 
| 170 |  |  |  |  |  |  | [0x2800, 0x28FF => 'Braille Patterns'], | 
| 171 |  |  |  |  |  |  | [0x2900, 0x297F => 'Supplemental Arrows-B'], | 
| 172 |  |  |  |  |  |  | [0x2980, 0x29FF => 'Miscellaneous Mathematical Symbols-B'], | 
| 173 |  |  |  |  |  |  | [0x2A00, 0x2AFF => 'Supplemental Mathematical Operators'], | 
| 174 |  |  |  |  |  |  | [0x2B00, 0x2BFF => 'Miscellaneous Symbols and Arrows'], | 
| 175 |  |  |  |  |  |  | [0x2C00, 0x2C5F => 'Glagolitic'], | 
| 176 |  |  |  |  |  |  | [0x2C80, 0x2CFF => 'Coptic'], | 
| 177 |  |  |  |  |  |  | [0x2D00, 0x2D2F => 'Georgian Supplement'], | 
| 178 |  |  |  |  |  |  | [0x2D30, 0x2D7F => 'Tifinagh'], | 
| 179 |  |  |  |  |  |  | [0x2D80, 0x2DDF => 'Ethiopic Extended'], | 
| 180 |  |  |  |  |  |  | [0x2E00, 0x2E7F => 'Supplemental Punctuation'], | 
| 181 |  |  |  |  |  |  | [0x2E80, 0x2EFF => 'CJK Radicals Supplement'], | 
| 182 |  |  |  |  |  |  | [0x2F00, 0x2FDF => 'Kangxi Radicals'], | 
| 183 |  |  |  |  |  |  | [0x2FF0, 0x2FFF => 'Ideographic Description Characters'], | 
| 184 |  |  |  |  |  |  | [0x3000, 0x303F => 'CJK Symbols and Punctuation'], | 
| 185 |  |  |  |  |  |  | [0x3040, 0x309F => 'Hiragana'], | 
| 186 |  |  |  |  |  |  | [0x30A0, 0x30FF => 'Katakana'], | 
| 187 |  |  |  |  |  |  | [0x3100, 0x312F => 'Bopomofo'], | 
| 188 |  |  |  |  |  |  | [0x3130, 0x318F => 'Hangul Compatibility Jamo'], | 
| 189 |  |  |  |  |  |  | [0x3190, 0x319F => 'Kanbun'], | 
| 190 |  |  |  |  |  |  | [0x31A0, 0x31BF => 'Bopomofo Extended'], | 
| 191 |  |  |  |  |  |  | [0x31C0, 0x31EF => 'CJK Strokes'], | 
| 192 |  |  |  |  |  |  | [0x31F0, 0x31FF => 'Katakana Phonetic Extensions'], | 
| 193 |  |  |  |  |  |  | [0x3200, 0x32FF => 'Enclosed CJK Letters and Months'], | 
| 194 |  |  |  |  |  |  | [0x3300, 0x33FF => 'CJK Compatibility'], | 
| 195 |  |  |  |  |  |  | [0x3400, 0x4DBF => 'CJK Unified Ideographs Extension A'], | 
| 196 |  |  |  |  |  |  | [0x4DC0, 0x4DFF => 'Yijing Hexagram Symbols'], | 
| 197 |  |  |  |  |  |  | [0x4E00, 0x9FFF => 'CJK Unified Ideographs'], | 
| 198 |  |  |  |  |  |  | [0xA000, 0xA48F => 'Yi Syllables'], | 
| 199 |  |  |  |  |  |  | [0xA490, 0xA4CF => 'Yi Radicals'], | 
| 200 |  |  |  |  |  |  | [0xA700, 0xA71F => 'Modifier Tone Letters'], | 
| 201 |  |  |  |  |  |  | [0xA800, 0xA82F => 'Syloti Nagri'], | 
| 202 |  |  |  |  |  |  | [0xAC00, 0xD7AF => 'Hangul Syllables'], | 
| 203 |  |  |  |  |  |  | [0xD800, 0xDB7F => 'High Surrogates'], | 
| 204 |  |  |  |  |  |  | [0xDB80, 0xDBFF => 'High Private Use Surrogates'], | 
| 205 |  |  |  |  |  |  | [0xDC00, 0xDFFF => 'Low Surrogates'], | 
| 206 |  |  |  |  |  |  | [0xE000, 0xF8FF => 'Private Use Area'], | 
| 207 |  |  |  |  |  |  | [0xF900, 0xFAFF => 'CJK Compatibility Ideographs'], | 
| 208 |  |  |  |  |  |  | [0xFB00, 0xFB4F => 'Alphabetic Presentation Forms'], | 
| 209 |  |  |  |  |  |  | [0xFB50, 0xFDFF => 'Arabic Presentation Forms-A'], | 
| 210 |  |  |  |  |  |  | [0xFE00, 0xFE0F => 'Variation Selectors'], | 
| 211 |  |  |  |  |  |  | [0xFE10, 0xFE1F => 'Vertical Forms'], | 
| 212 |  |  |  |  |  |  | [0xFE20, 0xFE2F => 'Combining Half Marks'], | 
| 213 |  |  |  |  |  |  | [0xFE30, 0xFE4F => 'CJK Compatibility Forms'], | 
| 214 |  |  |  |  |  |  | [0xFE50, 0xFE6F => 'Small Form Variants'], | 
| 215 |  |  |  |  |  |  | [0xFE70, 0xFEFF => 'Arabic Presentation Forms-B'], | 
| 216 |  |  |  |  |  |  | [0xFF00, 0xFFEF => 'Halfwidth and Fullwidth Forms'], | 
| 217 |  |  |  |  |  |  | [0xFFF0, 0xFFFF => 'Specials'], | 
| 218 |  |  |  |  |  |  | [0x10000, 0x1007F => 'Linear B Syllabary'], | 
| 219 |  |  |  |  |  |  | [0x10080, 0x100FF => 'Linear B Ideograms'], | 
| 220 |  |  |  |  |  |  | [0x10100, 0x1013F => 'Aegean Numbers'], | 
| 221 |  |  |  |  |  |  | [0x10140, 0x1018F => 'Ancient Greek Numbers'], | 
| 222 |  |  |  |  |  |  | [0x10300, 0x1032F => 'Old Italic'], | 
| 223 |  |  |  |  |  |  | [0x10330, 0x1034F => 'Gothic'], | 
| 224 |  |  |  |  |  |  | [0x10380, 0x1039F => 'Ugaritic'], | 
| 225 |  |  |  |  |  |  | [0x103A0, 0x103DF => 'Old Persian'], | 
| 226 |  |  |  |  |  |  | [0x10400, 0x1044F => 'Deseret'], | 
| 227 |  |  |  |  |  |  | [0x10450, 0x1047F => 'Shavian'], | 
| 228 |  |  |  |  |  |  | [0x10480, 0x104AF => 'Osmanya'], | 
| 229 |  |  |  |  |  |  | [0x10800, 0x1083F => 'Cypriot Syllabary'], | 
| 230 |  |  |  |  |  |  | [0x10A00, 0x10A5F => 'Kharoshthi'], | 
| 231 |  |  |  |  |  |  | [0x1D000, 0x1D0FF => 'Byzantine Musical Symbols'], | 
| 232 |  |  |  |  |  |  | [0x1D100, 0x1D1FF => 'Musical Symbols'], | 
| 233 |  |  |  |  |  |  | [0x1D200, 0x1D24F => 'Ancient Greek Musical Notation'], | 
| 234 |  |  |  |  |  |  | [0x1D300, 0x1D35F => 'Tai Xuan Jing Symbols'], | 
| 235 |  |  |  |  |  |  | [0x1D400, 0x1D7FF => 'Mathematical Alphanumeric Symbols'], | 
| 236 |  |  |  |  |  |  | [0x20000, 0x2A6DF => 'CJK Unified Ideographs Extension B'], | 
| 237 |  |  |  |  |  |  | [0x2F800, 0x2FA1F => 'CJK Compatibility Ideographs Supplement'], | 
| 238 |  |  |  |  |  |  | [0xE0000, 0xE007F => 'Tags'], | 
| 239 |  |  |  |  |  |  | [0xE0100, 0xE01EF => 'Variation Selectors Supplement'], | 
| 240 |  |  |  |  |  |  | [0xF0000, 0xFFFFF => 'Supplementary Private Use Area-A'], | 
| 241 |  |  |  |  |  |  | [0x100000, 0x10FFFF => 'Supplementary Private Use Area-B'], | 
| 242 |  |  |  |  |  |  | ); | 
| 243 |  |  |  |  |  |  |  | 
| 244 |  |  |  |  |  |  | %JAMO_SHORT_NAME = ( | 
| 245 |  |  |  |  |  |  | '1100' => 'G', | 
| 246 |  |  |  |  |  |  | '1101' => 'GG', | 
| 247 |  |  |  |  |  |  | '1102' => 'N', | 
| 248 |  |  |  |  |  |  | '1103' => 'D', | 
| 249 |  |  |  |  |  |  | '1104' => 'DD', | 
| 250 |  |  |  |  |  |  | '1105' => 'L', | 
| 251 |  |  |  |  |  |  | '1106' => 'M', | 
| 252 |  |  |  |  |  |  | '1107' => 'B', | 
| 253 |  |  |  |  |  |  | '1108' => 'BB', | 
| 254 |  |  |  |  |  |  | '1109' => 'S', | 
| 255 |  |  |  |  |  |  | '110A' => 'SS', | 
| 256 |  |  |  |  |  |  | '110B' => '', | 
| 257 |  |  |  |  |  |  | '110C' => 'J', | 
| 258 |  |  |  |  |  |  | '110D' => 'JJ', | 
| 259 |  |  |  |  |  |  | '110E' => 'C', | 
| 260 |  |  |  |  |  |  | '110F' => 'K', | 
| 261 |  |  |  |  |  |  | '1110' => 'T', | 
| 262 |  |  |  |  |  |  | '1111' => 'P', | 
| 263 |  |  |  |  |  |  | '1112' => 'H', | 
| 264 |  |  |  |  |  |  | '1161' => 'A', | 
| 265 |  |  |  |  |  |  | '1162' => 'AE', | 
| 266 |  |  |  |  |  |  | '1163' => 'YA', | 
| 267 |  |  |  |  |  |  | '1164' => 'YAE', | 
| 268 |  |  |  |  |  |  | '1165' => 'EO', | 
| 269 |  |  |  |  |  |  | '1166' => 'E', | 
| 270 |  |  |  |  |  |  | '1167' => 'YEO', | 
| 271 |  |  |  |  |  |  | '1168' => 'YE', | 
| 272 |  |  |  |  |  |  | '1169' => 'O', | 
| 273 |  |  |  |  |  |  | '116A' => 'WA', | 
| 274 |  |  |  |  |  |  | '116B' => 'WAE', | 
| 275 |  |  |  |  |  |  | '116C' => 'OE', | 
| 276 |  |  |  |  |  |  | '116D' => 'YO', | 
| 277 |  |  |  |  |  |  | '116E' => 'U', | 
| 278 |  |  |  |  |  |  | '116F' => 'WEO', | 
| 279 |  |  |  |  |  |  | '1170' => 'WE', | 
| 280 |  |  |  |  |  |  | '1171' => 'WI', | 
| 281 |  |  |  |  |  |  | '1172' => 'YU', | 
| 282 |  |  |  |  |  |  | '1173' => 'EU', | 
| 283 |  |  |  |  |  |  | '1174' => 'YI', | 
| 284 |  |  |  |  |  |  | '1175' => 'I', | 
| 285 |  |  |  |  |  |  | '11A8' => 'G', | 
| 286 |  |  |  |  |  |  | '11A9' => 'GG', | 
| 287 |  |  |  |  |  |  | '11AA' => 'GS', | 
| 288 |  |  |  |  |  |  | '11AB' => 'N', | 
| 289 |  |  |  |  |  |  | '11AC' => 'NJ', | 
| 290 |  |  |  |  |  |  | '11AD' => 'NH', | 
| 291 |  |  |  |  |  |  | '11AE' => 'D', | 
| 292 |  |  |  |  |  |  | '11AF' => 'L', | 
| 293 |  |  |  |  |  |  | '11B0' => 'LG', | 
| 294 |  |  |  |  |  |  | '11B1' => 'LM', | 
| 295 |  |  |  |  |  |  | '11B2' => 'LB', | 
| 296 |  |  |  |  |  |  | '11B3' => 'LS', | 
| 297 |  |  |  |  |  |  | '11B4' => 'LT', | 
| 298 |  |  |  |  |  |  | '11B5' => 'LP', | 
| 299 |  |  |  |  |  |  | '11B6' => 'LH', | 
| 300 |  |  |  |  |  |  | '11B7' => 'M', | 
| 301 |  |  |  |  |  |  | '11B8' => 'B', | 
| 302 |  |  |  |  |  |  | '11B9' => 'BS', | 
| 303 |  |  |  |  |  |  | '11BA' => 'S', | 
| 304 |  |  |  |  |  |  | '11BB' => 'SS', | 
| 305 |  |  |  |  |  |  | '11BC' => 'NG', | 
| 306 |  |  |  |  |  |  | '11BD' => 'J', | 
| 307 |  |  |  |  |  |  | '11BE' => 'C', | 
| 308 |  |  |  |  |  |  | '11BF' => 'K', | 
| 309 |  |  |  |  |  |  | '11C0' => 'T', | 
| 310 |  |  |  |  |  |  | '11C1' => 'P', | 
| 311 |  |  |  |  |  |  | '11C2' => 'H', | 
| 312 |  |  |  |  |  |  | ); | 
| 313 |  |  |  |  |  |  |  | 
| 314 |  |  |  |  |  |  | sub _init_names | 
| 315 |  |  |  |  |  |  | { | 
| 316 | 1 |  |  | 1 |  | 189 | keys %NAMES = 16351;  # preextent | 
| 317 | 1 |  |  |  |  | 4 | local($_); | 
| 318 | 1 |  |  |  |  | 9 | while () { | 
| 319 | 16351 |  |  |  |  | 16392 | chop; | 
| 320 | 16351 |  |  |  |  | 31780 | my($code, $name) = split(' ', $_, 2); | 
| 321 | 16351 |  |  |  |  | 61898 | $NAMES{$code} = $name; | 
| 322 |  |  |  |  |  |  | } | 
| 323 | 1 |  |  |  |  | 49 | close(DATA); | 
| 324 |  |  |  |  |  |  | } | 
| 325 |  |  |  |  |  |  |  | 
| 326 |  |  |  |  |  |  | 1; | 
| 327 |  |  |  |  |  |  |  | 
| 328 |  |  |  |  |  |  |  | 
| 329 |  |  |  |  |  |  | __DATA__ |