use strict;
use warnings;
use File::Spec;
-our $VERSION = '1.08';
+our $VERSION = '1.09';
use bytes (); # for $bytes::hint_bits
my %alias1 = (
- # Icky 3.2 names with parentheses.
- 'LINE FEED' => 'LINE FEED (LF)',
- 'FORM FEED' => 'FORM FEED (FF)',
- 'CARRIAGE RETURN' => 'CARRIAGE RETURN (CR)',
- 'NEXT LINE' => 'NEXT LINE (NEL)',
- # Convenience.
- 'LF' => 'LINE FEED (LF)',
- 'FF' => 'FORM FEED (FF)',
- 'CR' => 'CARRIAGE RETURN (CR)',
- 'NEL' => 'NEXT LINE (NEL)',
- # More convenience. For futher convencience,
- # it is suggested some way using using the NamesList
- # aliases is implemented.
- 'ZWNJ' => 'ZERO WIDTH NON-JOINER',
- 'ZWJ' => 'ZERO WIDTH JOINER',
- 'BOM' => 'BYTE ORDER MARK',
- );
+ # Icky 3.2 names with parentheses.
+ 'LINE FEED' => 0x0A, # LINE FEED (LF)
+ 'FORM FEED' => 0x0C, # FORM FEED (FF)
+ 'CARRIAGE RETURN' => 0x0D, # CARRIAGE RETURN (CR)
+ 'NEXT LINE' => 0x85, # NEXT LINE (NEL)
+
+ # Some variant names from Wikipedia
+ 'SINGLE-SHIFT 2' => 0x8E,
+ 'SINGLE-SHIFT 3' => 0x8F,
+ 'PRIVATE USE 1' => 0x91,
+ 'PRIVATE USE 2' => 0x92,
+ 'START OF PROTECTED AREA' => 0x96,
+ 'END OF PROTECTED AREA' => 0x97,
+
+ # Convenience. Standard abbreviations for the controls
+ 'NUL' => 0x00, # NULL
+ 'SOH' => 0x01, # START OF HEADING
+ 'STX' => 0x02, # START OF TEXT
+ 'ETX' => 0x03, # END OF TEXT
+ 'EOT' => 0x04, # END OF TRANSMISSION
+ 'ENQ' => 0x05, # ENQUIRY
+ 'ACK' => 0x06, # ACKNOWLEDGE
+ 'BEL' => 0x07, # BELL
+ 'BS' => 0x08, # BACKSPACE
+ 'HT' => 0x09, # HORIZONTAL TABULATION
+ 'LF' => 0x0A, # LINE FEED (LF)
+ 'VT' => 0x0B, # VERTICAL TABULATION
+ 'FF' => 0x0C, # FORM FEED (FF)
+ 'CR' => 0x0D, # CARRIAGE RETURN (CR)
+ 'SO' => 0x0E, # SHIFT OUT
+ 'SI' => 0x0F, # SHIFT IN
+ 'DLE' => 0x10, # DATA LINK ESCAPE
+ 'DC1' => 0x11, # DEVICE CONTROL ONE
+ 'DC2' => 0x12, # DEVICE CONTROL TWO
+ 'DC3' => 0x13, # DEVICE CONTROL THREE
+ 'DC4' => 0x14, # DEVICE CONTROL FOUR
+ 'NAK' => 0x15, # NEGATIVE ACKNOWLEDGE
+ 'SYN' => 0x16, # SYNCHRONOUS IDLE
+ 'ETB' => 0x17, # END OF TRANSMISSION BLOCK
+ 'CAN' => 0x18, # CANCEL
+ 'EOM' => 0x19, # END OF MEDIUM
+ 'SUB' => 0x1A, # SUBSTITUTE
+ 'ESC' => 0x1B, # ESCAPE
+ 'FS' => 0x1C, # FILE SEPARATOR
+ 'GS' => 0x1D, # GROUP SEPARATOR
+ 'RS' => 0x1E, # RECORD SEPARATOR
+ 'US' => 0x1F, # UNIT SEPARATOR
+ 'DEL' => 0x7F, # DELETE
+ 'BPH' => 0x82, # BREAK PERMITTED HERE
+ 'NBH' => 0x83, # NO BREAK HERE
+ 'NEL' => 0x85, # NEXT LINE (NEL)
+ 'SSA' => 0x86, # START OF SELECTED AREA
+ 'ESA' => 0x87, # END OF SELECTED AREA
+ 'HTS' => 0x88, # CHARACTER TABULATION SET
+ 'HTJ' => 0x89, # CHARACTER TABULATION WITH JUSTIFICATION
+ 'VTS' => 0x8A, # LINE TABULATION SET
+ 'PLD' => 0x8B, # PARTIAL LINE FORWARD
+ 'PLU' => 0x8C, # PARTIAL LINE BACKWARD
+ 'RI ' => 0x8D, # REVERSE LINE FEED
+ 'SS2' => 0x8E, # SINGLE SHIFT TWO
+ 'SS3' => 0x8F, # SINGLE SHIFT THREE
+ 'DCS' => 0x90, # DEVICE CONTROL STRING
+ 'PU1' => 0x91, # PRIVATE USE ONE
+ 'PU2' => 0x92, # PRIVATE USE TWO
+ 'STS' => 0x93, # SET TRANSMIT STATE
+ 'CCH' => 0x94, # CANCEL CHARACTER
+ 'MW ' => 0x95, # MESSAGE WAITING
+ 'SPA' => 0x96, # START OF GUARDED AREA
+ 'EPA' => 0x97, # END OF GUARDED AREA
+ 'SOS' => 0x98, # START OF STRING
+ 'SCI' => 0x9A, # SINGLE CHARACTER INTRODUCER
+ 'CSI' => 0x9B, # CONTROL SEQUENCE INTRODUCER
+ 'ST ' => 0x9C, # STRING TERMINATOR
+ 'OSC' => 0x9D, # OPERATING SYSTEM COMMAND
+ 'PM ' => 0x9E, # PRIVACY MESSAGE
+ 'APC' => 0x9F, # APPLICATION PROGRAM COMMAND
+
+ # There are no names for these in the Unicode standard;
+ # perhaps should be deprecated, but then again there are
+ # no alternative names, so am not deprecating. And if
+ # did, the code would have to change to not recommend an
+ # alternative for these.
+ 'PADDING CHARACTER' => 0x80,
+ 'PAD' => 0x80,
+ 'HIGH OCTET PRESET' => 0x81,
+ 'HOP' => 0x81,
+ 'INDEX' => 0x84,
+ 'IND' => 0x84,
+ 'SINGLE GRAPHIC CHARACTER INTRODUCER' => 0x99,
+ 'SGC' => 0x99,
+
+ # More convenience. For further convenience,
+ # it is suggested some way of using the NamesList
+ # aliases be implemented, but there are ambiguities in
+ # NamesList.txt)
+ 'BOM' => 0xFEFF, # BYTE ORDER MARK
+ 'BYTE ORDER MARK'=> 0xFEFF,
+ 'CGJ' => 0x034F, # COMBINING GRAPHEME JOINER
+ 'FVS1' => 0x180B, # MONGOLIAN FREE VARIATION SELECTOR ONE
+ 'FVS2' => 0x180C, # MONGOLIAN FREE VARIATION SELECTOR TWO
+ 'FVS3' => 0x180D, # MONGOLIAN FREE VARIATION SELECTOR THREE
+ 'LRE' => 0x202A, # LEFT-TO-RIGHT EMBEDDING
+ 'LRM' => 0x200E, # LEFT-TO-RIGHT MARK
+ 'LRO' => 0x202D, # LEFT-TO-RIGHT OVERRIDE
+ 'MMSP' => 0x205F, # MEDIUM MATHEMATICAL SPACE
+ 'MVS' => 0x180E, # MONGOLIAN VOWEL SEPARATOR
+ 'NBSP' => 0x00A0, # NO-BREAK SPACE
+ 'NNBSP' => 0x202F, # NARROW NO-BREAK SPACE
+ 'PDF' => 0x202C, # POP DIRECTIONAL FORMATTING
+ 'RLE' => 0x202B, # RIGHT-TO-LEFT EMBEDDING
+ 'RLM' => 0x200F, # RIGHT-TO-LEFT MARK
+ 'RLO' => 0x202E, # RIGHT-TO-LEFT OVERRIDE
+ 'SHY' => 0x00AD, # SOFT HYPHEN
+ 'VS1' => 0xFE00, # VARIATION SELECTOR-1
+ 'VS2' => 0xFE01, # VARIATION SELECTOR-2
+ 'VS3' => 0xFE02, # VARIATION SELECTOR-3
+ 'VS4' => 0xFE03, # VARIATION SELECTOR-4
+ 'VS5' => 0xFE04, # VARIATION SELECTOR-5
+ 'VS6' => 0xFE05, # VARIATION SELECTOR-6
+ 'VS7' => 0xFE06, # VARIATION SELECTOR-7
+ 'VS8' => 0xFE07, # VARIATION SELECTOR-8
+ 'VS9' => 0xFE08, # VARIATION SELECTOR-9
+ 'VS10' => 0xFE09, # VARIATION SELECTOR-10
+ 'VS11' => 0xFE0A, # VARIATION SELECTOR-11
+ 'VS12' => 0xFE0B, # VARIATION SELECTOR-12
+ 'VS13' => 0xFE0C, # VARIATION SELECTOR-13
+ 'VS14' => 0xFE0D, # VARIATION SELECTOR-14
+ 'VS15' => 0xFE0E, # VARIATION SELECTOR-15
+ 'VS16' => 0xFE0F, # VARIATION SELECTOR-16
+ 'VS17' => 0xE0100, # VARIATION SELECTOR-17
+ 'VS18' => 0xE0101, # VARIATION SELECTOR-18
+ 'VS19' => 0xE0102, # VARIATION SELECTOR-19
+ 'VS20' => 0xE0103, # VARIATION SELECTOR-20
+ 'VS21' => 0xE0104, # VARIATION SELECTOR-21
+ 'VS22' => 0xE0105, # VARIATION SELECTOR-22
+ 'VS23' => 0xE0106, # VARIATION SELECTOR-23
+ 'VS24' => 0xE0107, # VARIATION SELECTOR-24
+ 'VS25' => 0xE0108, # VARIATION SELECTOR-25
+ 'VS26' => 0xE0109, # VARIATION SELECTOR-26
+ 'VS27' => 0xE010A, # VARIATION SELECTOR-27
+ 'VS28' => 0xE010B, # VARIATION SELECTOR-28
+ 'VS29' => 0xE010C, # VARIATION SELECTOR-29
+ 'VS30' => 0xE010D, # VARIATION SELECTOR-30
+ 'VS31' => 0xE010E, # VARIATION SELECTOR-31
+ 'VS32' => 0xE010F, # VARIATION SELECTOR-32
+ 'VS33' => 0xE0110, # VARIATION SELECTOR-33
+ 'VS34' => 0xE0111, # VARIATION SELECTOR-34
+ 'VS35' => 0xE0112, # VARIATION SELECTOR-35
+ 'VS36' => 0xE0113, # VARIATION SELECTOR-36
+ 'VS37' => 0xE0114, # VARIATION SELECTOR-37
+ 'VS38' => 0xE0115, # VARIATION SELECTOR-38
+ 'VS39' => 0xE0116, # VARIATION SELECTOR-39
+ 'VS40' => 0xE0117, # VARIATION SELECTOR-40
+ 'VS41' => 0xE0118, # VARIATION SELECTOR-41
+ 'VS42' => 0xE0119, # VARIATION SELECTOR-42
+ 'VS43' => 0xE011A, # VARIATION SELECTOR-43
+ 'VS44' => 0xE011B, # VARIATION SELECTOR-44
+ 'VS45' => 0xE011C, # VARIATION SELECTOR-45
+ 'VS46' => 0xE011D, # VARIATION SELECTOR-46
+ 'VS47' => 0xE011E, # VARIATION SELECTOR-47
+ 'VS48' => 0xE011F, # VARIATION SELECTOR-48
+ 'VS49' => 0xE0120, # VARIATION SELECTOR-49
+ 'VS50' => 0xE0121, # VARIATION SELECTOR-50
+ 'VS51' => 0xE0122, # VARIATION SELECTOR-51
+ 'VS52' => 0xE0123, # VARIATION SELECTOR-52
+ 'VS53' => 0xE0124, # VARIATION SELECTOR-53
+ 'VS54' => 0xE0125, # VARIATION SELECTOR-54
+ 'VS55' => 0xE0126, # VARIATION SELECTOR-55
+ 'VS56' => 0xE0127, # VARIATION SELECTOR-56
+ 'VS57' => 0xE0128, # VARIATION SELECTOR-57
+ 'VS58' => 0xE0129, # VARIATION SELECTOR-58
+ 'VS59' => 0xE012A, # VARIATION SELECTOR-59
+ 'VS60' => 0xE012B, # VARIATION SELECTOR-60
+ 'VS61' => 0xE012C, # VARIATION SELECTOR-61
+ 'VS62' => 0xE012D, # VARIATION SELECTOR-62
+ 'VS63' => 0xE012E, # VARIATION SELECTOR-63
+ 'VS64' => 0xE012F, # VARIATION SELECTOR-64
+ 'VS65' => 0xE0130, # VARIATION SELECTOR-65
+ 'VS66' => 0xE0131, # VARIATION SELECTOR-66
+ 'VS67' => 0xE0132, # VARIATION SELECTOR-67
+ 'VS68' => 0xE0133, # VARIATION SELECTOR-68
+ 'VS69' => 0xE0134, # VARIATION SELECTOR-69
+ 'VS70' => 0xE0135, # VARIATION SELECTOR-70
+ 'VS71' => 0xE0136, # VARIATION SELECTOR-71
+ 'VS72' => 0xE0137, # VARIATION SELECTOR-72
+ 'VS73' => 0xE0138, # VARIATION SELECTOR-73
+ 'VS74' => 0xE0139, # VARIATION SELECTOR-74
+ 'VS75' => 0xE013A, # VARIATION SELECTOR-75
+ 'VS76' => 0xE013B, # VARIATION SELECTOR-76
+ 'VS77' => 0xE013C, # VARIATION SELECTOR-77
+ 'VS78' => 0xE013D, # VARIATION SELECTOR-78
+ 'VS79' => 0xE013E, # VARIATION SELECTOR-79
+ 'VS80' => 0xE013F, # VARIATION SELECTOR-80
+ 'VS81' => 0xE0140, # VARIATION SELECTOR-81
+ 'VS82' => 0xE0141, # VARIATION SELECTOR-82
+ 'VS83' => 0xE0142, # VARIATION SELECTOR-83
+ 'VS84' => 0xE0143, # VARIATION SELECTOR-84
+ 'VS85' => 0xE0144, # VARIATION SELECTOR-85
+ 'VS86' => 0xE0145, # VARIATION SELECTOR-86
+ 'VS87' => 0xE0146, # VARIATION SELECTOR-87
+ 'VS88' => 0xE0147, # VARIATION SELECTOR-88
+ 'VS89' => 0xE0148, # VARIATION SELECTOR-89
+ 'VS90' => 0xE0149, # VARIATION SELECTOR-90
+ 'VS91' => 0xE014A, # VARIATION SELECTOR-91
+ 'VS92' => 0xE014B, # VARIATION SELECTOR-92
+ 'VS93' => 0xE014C, # VARIATION SELECTOR-93
+ 'VS94' => 0xE014D, # VARIATION SELECTOR-94
+ 'VS95' => 0xE014E, # VARIATION SELECTOR-95
+ 'VS96' => 0xE014F, # VARIATION SELECTOR-96
+ 'VS97' => 0xE0150, # VARIATION SELECTOR-97
+ 'VS98' => 0xE0151, # VARIATION SELECTOR-98
+ 'VS99' => 0xE0152, # VARIATION SELECTOR-99
+ 'VS100' => 0xE0153, # VARIATION SELECTOR-100
+ 'VS101' => 0xE0154, # VARIATION SELECTOR-101
+ 'VS102' => 0xE0155, # VARIATION SELECTOR-102
+ 'VS103' => 0xE0156, # VARIATION SELECTOR-103
+ 'VS104' => 0xE0157, # VARIATION SELECTOR-104
+ 'VS105' => 0xE0158, # VARIATION SELECTOR-105
+ 'VS106' => 0xE0159, # VARIATION SELECTOR-106
+ 'VS107' => 0xE015A, # VARIATION SELECTOR-107
+ 'VS108' => 0xE015B, # VARIATION SELECTOR-108
+ 'VS109' => 0xE015C, # VARIATION SELECTOR-109
+ 'VS110' => 0xE015D, # VARIATION SELECTOR-110
+ 'VS111' => 0xE015E, # VARIATION SELECTOR-111
+ 'VS112' => 0xE015F, # VARIATION SELECTOR-112
+ 'VS113' => 0xE0160, # VARIATION SELECTOR-113
+ 'VS114' => 0xE0161, # VARIATION SELECTOR-114
+ 'VS115' => 0xE0162, # VARIATION SELECTOR-115
+ 'VS116' => 0xE0163, # VARIATION SELECTOR-116
+ 'VS117' => 0xE0164, # VARIATION SELECTOR-117
+ 'VS118' => 0xE0165, # VARIATION SELECTOR-118
+ 'VS119' => 0xE0166, # VARIATION SELECTOR-119
+ 'VS120' => 0xE0167, # VARIATION SELECTOR-120
+ 'VS121' => 0xE0168, # VARIATION SELECTOR-121
+ 'VS122' => 0xE0169, # VARIATION SELECTOR-122
+ 'VS123' => 0xE016A, # VARIATION SELECTOR-123
+ 'VS124' => 0xE016B, # VARIATION SELECTOR-124
+ 'VS125' => 0xE016C, # VARIATION SELECTOR-125
+ 'VS126' => 0xE016D, # VARIATION SELECTOR-126
+ 'VS127' => 0xE016E, # VARIATION SELECTOR-127
+ 'VS128' => 0xE016F, # VARIATION SELECTOR-128
+ 'VS129' => 0xE0170, # VARIATION SELECTOR-129
+ 'VS130' => 0xE0171, # VARIATION SELECTOR-130
+ 'VS131' => 0xE0172, # VARIATION SELECTOR-131
+ 'VS132' => 0xE0173, # VARIATION SELECTOR-132
+ 'VS133' => 0xE0174, # VARIATION SELECTOR-133
+ 'VS134' => 0xE0175, # VARIATION SELECTOR-134
+ 'VS135' => 0xE0176, # VARIATION SELECTOR-135
+ 'VS136' => 0xE0177, # VARIATION SELECTOR-136
+ 'VS137' => 0xE0178, # VARIATION SELECTOR-137
+ 'VS138' => 0xE0179, # VARIATION SELECTOR-138
+ 'VS139' => 0xE017A, # VARIATION SELECTOR-139
+ 'VS140' => 0xE017B, # VARIATION SELECTOR-140
+ 'VS141' => 0xE017C, # VARIATION SELECTOR-141
+ 'VS142' => 0xE017D, # VARIATION SELECTOR-142
+ 'VS143' => 0xE017E, # VARIATION SELECTOR-143
+ 'VS144' => 0xE017F, # VARIATION SELECTOR-144
+ 'VS145' => 0xE0180, # VARIATION SELECTOR-145
+ 'VS146' => 0xE0181, # VARIATION SELECTOR-146
+ 'VS147' => 0xE0182, # VARIATION SELECTOR-147
+ 'VS148' => 0xE0183, # VARIATION SELECTOR-148
+ 'VS149' => 0xE0184, # VARIATION SELECTOR-149
+ 'VS150' => 0xE0185, # VARIATION SELECTOR-150
+ 'VS151' => 0xE0186, # VARIATION SELECTOR-151
+ 'VS152' => 0xE0187, # VARIATION SELECTOR-152
+ 'VS153' => 0xE0188, # VARIATION SELECTOR-153
+ 'VS154' => 0xE0189, # VARIATION SELECTOR-154
+ 'VS155' => 0xE018A, # VARIATION SELECTOR-155
+ 'VS156' => 0xE018B, # VARIATION SELECTOR-156
+ 'VS157' => 0xE018C, # VARIATION SELECTOR-157
+ 'VS158' => 0xE018D, # VARIATION SELECTOR-158
+ 'VS159' => 0xE018E, # VARIATION SELECTOR-159
+ 'VS160' => 0xE018F, # VARIATION SELECTOR-160
+ 'VS161' => 0xE0190, # VARIATION SELECTOR-161
+ 'VS162' => 0xE0191, # VARIATION SELECTOR-162
+ 'VS163' => 0xE0192, # VARIATION SELECTOR-163
+ 'VS164' => 0xE0193, # VARIATION SELECTOR-164
+ 'VS165' => 0xE0194, # VARIATION SELECTOR-165
+ 'VS166' => 0xE0195, # VARIATION SELECTOR-166
+ 'VS167' => 0xE0196, # VARIATION SELECTOR-167
+ 'VS168' => 0xE0197, # VARIATION SELECTOR-168
+ 'VS169' => 0xE0198, # VARIATION SELECTOR-169
+ 'VS170' => 0xE0199, # VARIATION SELECTOR-170
+ 'VS171' => 0xE019A, # VARIATION SELECTOR-171
+ 'VS172' => 0xE019B, # VARIATION SELECTOR-172
+ 'VS173' => 0xE019C, # VARIATION SELECTOR-173
+ 'VS174' => 0xE019D, # VARIATION SELECTOR-174
+ 'VS175' => 0xE019E, # VARIATION SELECTOR-175
+ 'VS176' => 0xE019F, # VARIATION SELECTOR-176
+ 'VS177' => 0xE01A0, # VARIATION SELECTOR-177
+ 'VS178' => 0xE01A1, # VARIATION SELECTOR-178
+ 'VS179' => 0xE01A2, # VARIATION SELECTOR-179
+ 'VS180' => 0xE01A3, # VARIATION SELECTOR-180
+ 'VS181' => 0xE01A4, # VARIATION SELECTOR-181
+ 'VS182' => 0xE01A5, # VARIATION SELECTOR-182
+ 'VS183' => 0xE01A6, # VARIATION SELECTOR-183
+ 'VS184' => 0xE01A7, # VARIATION SELECTOR-184
+ 'VS185' => 0xE01A8, # VARIATION SELECTOR-185
+ 'VS186' => 0xE01A9, # VARIATION SELECTOR-186
+ 'VS187' => 0xE01AA, # VARIATION SELECTOR-187
+ 'VS188' => 0xE01AB, # VARIATION SELECTOR-188
+ 'VS189' => 0xE01AC, # VARIATION SELECTOR-189
+ 'VS190' => 0xE01AD, # VARIATION SELECTOR-190
+ 'VS191' => 0xE01AE, # VARIATION SELECTOR-191
+ 'VS192' => 0xE01AF, # VARIATION SELECTOR-192
+ 'VS193' => 0xE01B0, # VARIATION SELECTOR-193
+ 'VS194' => 0xE01B1, # VARIATION SELECTOR-194
+ 'VS195' => 0xE01B2, # VARIATION SELECTOR-195
+ 'VS196' => 0xE01B3, # VARIATION SELECTOR-196
+ 'VS197' => 0xE01B4, # VARIATION SELECTOR-197
+ 'VS198' => 0xE01B5, # VARIATION SELECTOR-198
+ 'VS199' => 0xE01B6, # VARIATION SELECTOR-199
+ 'VS200' => 0xE01B7, # VARIATION SELECTOR-200
+ 'VS201' => 0xE01B8, # VARIATION SELECTOR-201
+ 'VS202' => 0xE01B9, # VARIATION SELECTOR-202
+ 'VS203' => 0xE01BA, # VARIATION SELECTOR-203
+ 'VS204' => 0xE01BB, # VARIATION SELECTOR-204
+ 'VS205' => 0xE01BC, # VARIATION SELECTOR-205
+ 'VS206' => 0xE01BD, # VARIATION SELECTOR-206
+ 'VS207' => 0xE01BE, # VARIATION SELECTOR-207
+ 'VS208' => 0xE01BF, # VARIATION SELECTOR-208
+ 'VS209' => 0xE01C0, # VARIATION SELECTOR-209
+ 'VS210' => 0xE01C1, # VARIATION SELECTOR-210
+ 'VS211' => 0xE01C2, # VARIATION SELECTOR-211
+ 'VS212' => 0xE01C3, # VARIATION SELECTOR-212
+ 'VS213' => 0xE01C4, # VARIATION SELECTOR-213
+ 'VS214' => 0xE01C5, # VARIATION SELECTOR-214
+ 'VS215' => 0xE01C6, # VARIATION SELECTOR-215
+ 'VS216' => 0xE01C7, # VARIATION SELECTOR-216
+ 'VS217' => 0xE01C8, # VARIATION SELECTOR-217
+ 'VS218' => 0xE01C9, # VARIATION SELECTOR-218
+ 'VS219' => 0xE01CA, # VARIATION SELECTOR-219
+ 'VS220' => 0xE01CB, # VARIATION SELECTOR-220
+ 'VS221' => 0xE01CC, # VARIATION SELECTOR-221
+ 'VS222' => 0xE01CD, # VARIATION SELECTOR-222
+ 'VS223' => 0xE01CE, # VARIATION SELECTOR-223
+ 'VS224' => 0xE01CF, # VARIATION SELECTOR-224
+ 'VS225' => 0xE01D0, # VARIATION SELECTOR-225
+ 'VS226' => 0xE01D1, # VARIATION SELECTOR-226
+ 'VS227' => 0xE01D2, # VARIATION SELECTOR-227
+ 'VS228' => 0xE01D3, # VARIATION SELECTOR-228
+ 'VS229' => 0xE01D4, # VARIATION SELECTOR-229
+ 'VS230' => 0xE01D5, # VARIATION SELECTOR-230
+ 'VS231' => 0xE01D6, # VARIATION SELECTOR-231
+ 'VS232' => 0xE01D7, # VARIATION SELECTOR-232
+ 'VS233' => 0xE01D8, # VARIATION SELECTOR-233
+ 'VS234' => 0xE01D9, # VARIATION SELECTOR-234
+ 'VS235' => 0xE01DA, # VARIATION SELECTOR-235
+ 'VS236' => 0xE01DB, # VARIATION SELECTOR-236
+ 'VS237' => 0xE01DC, # VARIATION SELECTOR-237
+ 'VS238' => 0xE01DD, # VARIATION SELECTOR-238
+ 'VS239' => 0xE01DE, # VARIATION SELECTOR-239
+ 'VS240' => 0xE01DF, # VARIATION SELECTOR-240
+ 'VS241' => 0xE01E0, # VARIATION SELECTOR-241
+ 'VS242' => 0xE01E1, # VARIATION SELECTOR-242
+ 'VS243' => 0xE01E2, # VARIATION SELECTOR-243
+ 'VS244' => 0xE01E3, # VARIATION SELECTOR-244
+ 'VS245' => 0xE01E4, # VARIATION SELECTOR-245
+ 'VS246' => 0xE01E5, # VARIATION SELECTOR-246
+ 'VS247' => 0xE01E6, # VARIATION SELECTOR-247
+ 'VS248' => 0xE01E7, # VARIATION SELECTOR-248
+ 'VS249' => 0xE01E8, # VARIATION SELECTOR-249
+ 'VS250' => 0xE01E9, # VARIATION SELECTOR-250
+ 'VS251' => 0xE01EA, # VARIATION SELECTOR-251
+ 'VS252' => 0xE01EB, # VARIATION SELECTOR-252
+ 'VS253' => 0xE01EC, # VARIATION SELECTOR-253
+ 'VS254' => 0xE01ED, # VARIATION SELECTOR-254
+ 'VS255' => 0xE01EE, # VARIATION SELECTOR-255
+ 'VS256' => 0xE01EF, # VARIATION SELECTOR-256
+ 'WJ' => 0x2060, # WORD JOINER
+ 'ZWJ' => 0x200D, # ZERO WIDTH JOINER
+ 'ZWNJ' => 0x200C, # ZERO WIDTH NON-JOINER
+ 'ZWSP' => 0x200B, # ZERO WIDTH SPACE
+ );
my %alias2 = (
- # Pre-3.2 compatibility (only for the first 256 characters).
- 'HORIZONTAL TABULATION' => 'CHARACTER TABULATION',
- 'VERTICAL TABULATION' => 'LINE TABULATION',
- 'FILE SEPARATOR' => 'INFORMATION SEPARATOR FOUR',
- 'GROUP SEPARATOR' => 'INFORMATION SEPARATOR THREE',
- 'RECORD SEPARATOR' => 'INFORMATION SEPARATOR TWO',
- 'UNIT SEPARATOR' => 'INFORMATION SEPARATOR ONE',
- 'PARTIAL LINE DOWN' => 'PARTIAL LINE FORWARD',
- 'PARTIAL LINE UP' => 'PARTIAL LINE BACKWARD',
- );
+ # Pre-3.2 compatibility (only for the first 256 characters).
+ # Use of these gives deprecated message.
+ 'HORIZONTAL TABULATION' => 0x09, # CHARACTER TABULATION
+ 'VERTICAL TABULATION' => 0x0B, # LINE TABULATION
+ 'FILE SEPARATOR' => 0x1C, # INFORMATION SEPARATOR FOUR
+ 'GROUP SEPARATOR' => 0x1D, # INFORMATION SEPARATOR THREE
+ 'RECORD SEPARATOR' => 0x1E, # INFORMATION SEPARATOR TWO
+ 'UNIT SEPARATOR' => 0x1F, # INFORMATION SEPARATOR ONE
+ 'HORIZONTAL TABULATION SET' => 0x88, # CHARACTER TABULATION SET
+ 'HORIZONTAL TABULATION WITH JUSTIFICATION' => 0x89, # CHARACTER TABULATION WITH JUSTIFICATION
+ 'PARTIAL LINE DOWN' => 0x8B, # PARTIAL LINE FORWARD
+ 'PARTIAL LINE UP' => 0x8C, # PARTIAL LINE BACKWARD
+ 'VERTICAL TABULATION SET' => 0x8A, # LINE TABULATION SET
+ 'REVERSE INDEX' => 0x8D, # REVERSE LINE FEED
+ );
my %alias3 = (
- # User defined aliasses. Even more convenient :)
- );
+ # User defined aliases. Even more convenient :)
+ );
my $txt;
sub croak
sub charnames
{
my $name = shift;
+ my $ord;
+ my $fname;
- if (exists $alias1{$name}) {
- $name = $alias1{$name};
+ if (exists $alias3{$name}) { # User alias should be checked first, or else
+ # can't override ours, and if we add any,
+ # could conflict with theirs.
+ $name = $alias3{$name};
+ }
+ elsif (exists $alias1{$name}) {
+ $ord = $alias1{$name};
+ $fname = $name;
}
elsif (exists $alias2{$name}) {
require warnings;
- warnings::warnif('deprecated', qq{Unicode character name "$name" is deprecated, use "$alias2{$name}" instead});
- $name = $alias2{$name};
- }
- elsif (exists $alias3{$name}) {
- $name = $alias3{$name};
+ warnings::warnif('deprecated', "Unicode character name \"$name\" is deprecated, use \"" . viacode($alias2{$name}) . "\" instead");
+ $ord = $alias2{$name};
+ $fname = $name;
}
- my $ord;
my @off;
- my $fname;
- if ($name eq "BYTE ORDER MARK") {
- $fname = $name;
- $ord = 0xFEFF;
- } else {
+ if (! defined $ord) {
## Suck in the code/name list as a big string.
## Lines look like:
## "0052\t\tLATIN CAPITAL LETTER R\n"
use charnames ();
print charnames::viacode(0x1234); # prints "ETHIOPIC SYLLABLE SEE"
- printf "%04X", charnames::vianame("GOTHIC LETTER AHSA"); # prints "10330"
+ printf "%04X", charnames::vianame("GOTHIC LETTER AHSA"); # prints
+ # "10330"
=head1 DESCRIPTION
as a letter in script C<SCRIPT>. If pragma C<use charnames> is used
with script name arguments, then for C<\N{CHARNAME}> the name
C<CHARNAME> is looked up as a letter in the given scripts (in the
-specified order). Customized aliases are explained in L</CUSTOM ALIASES>.
+specified order). Customized aliases can override these, and are explained in
+L</CUSTOM ALIASES>.
For lookup of C<CHARNAME> inside a given script C<SCRIPTNAME>
this pragma looks for the names
For the C0 and C1 control characters (U+0000..U+001F, U+0080..U+009F)
as of Unicode 3.1, there are no official Unicode names but you can use
-instead the ISO 6429 names (LINE FEED, ESCAPE, and so forth). In
+instead the ISO 6429 names (LINE FEED, ESCAPE, and so forth, and their
+abbreviations, LF, ESC, ...). In
Unicode 3.2 (as of Perl 5.8) some naming changes take place ISO 6429
-has been updated, see L</ALIASES>. Also note that the U+UU80, U+0081,
-U+0084, and U+0099 do not have names even in ISO 6429.
+has been updated, see L</ALIASES>.
Since the Unicode standard uses "U+HHHH", so can you: "\N{U+263a}"
is the Unicode smiley face, or "\N{WHITE SMILING FACE}".
CR
NEL
+All the other standard abbreviations for the controls, such as C<ACK> for
+C<ACKNOWLEDGE> also can be used.
+
One can also use
BYTE ORDER MARK
BOM
-and
-
- ZWNJ
- ZWJ
-
-for ZERO WIDTH NON-JOINER and ZERO WIDTH JOINER.
+and these abbreviations
+
+ Abbreviation Full Name
+
+ CGJ COMBINING GRAPHEME JOINER
+ FVS1 MONGOLIAN FREE VARIATION SELECTOR ONE
+ FVS2 MONGOLIAN FREE VARIATION SELECTOR TWO
+ FVS3 MONGOLIAN FREE VARIATION SELECTOR THREE
+ LRE LEFT-TO-RIGHT EMBEDDING
+ LRM LEFT-TO-RIGHT MARK
+ LRO LEFT-TO-RIGHT OVERRIDE
+ MMSP MEDIUM MATHEMATICAL SPACE
+ MVS MONGOLIAN VOWEL SEPARATOR
+ NBSP NO-BREAK SPACE
+ NNBSP NARROW NO-BREAK SPACE
+ PDF POP DIRECTIONAL FORMATTING
+ RLE RIGHT-TO-LEFT EMBEDDING
+ RLM RIGHT-TO-LEFT MARK
+ RLO RIGHT-TO-LEFT OVERRIDE
+ SHY SOFT HYPHEN
+ VS1 VARIATION SELECTOR-1
+ .
+ .
+ .
+ VS256 VARIATION SELECTOR-256
+ WJ WORD JOINER
+ ZWJ ZERO WIDTH JOINER
+ ZWNJ ZERO WIDTH NON-JOINER
+ ZWSP ZERO WIDTH SPACE
For backward compatibility one can use the old names for
certain C0 and C1 controls
old new
- HORIZONTAL TABULATION CHARACTER TABULATION
- VERTICAL TABULATION LINE TABULATION
FILE SEPARATOR INFORMATION SEPARATOR FOUR
GROUP SEPARATOR INFORMATION SEPARATOR THREE
- RECORD SEPARATOR INFORMATION SEPARATOR TWO
- UNIT SEPARATOR INFORMATION SEPARATOR ONE
+ HORIZONTAL TABULATION CHARACTER TABULATION
+ HORIZONTAL TABULATION SET CHARACTER TABULATION SET
+ HORIZONTAL TABULATION WITH JUSTIFICATION CHARACTER TABULATION
+ WITH JUSTIFICATION
PARTIAL LINE DOWN PARTIAL LINE FORWARD
PARTIAL LINE UP PARTIAL LINE BACKWARD
+ RECORD SEPARATOR INFORMATION SEPARATOR TWO
+ REVERSE INDEX REVERSE LINE FEED
+ UNIT SEPARATOR INFORMATION SEPARATOR ONE
+ VERTICAL TABULATION LINE TABULATION
+ VERTICAL TABULATION SET LINE TABULATION SET
but the old names in addition to giving the character
will also give a warning about being deprecated.
+And finally, certain published variants are usable, including some for
+controls that have no Unicode names:
+
+ END OF PROTECTED AREA
+ HIGH OCTET PRESET
+ HOP
+ IND
+ INDEX
+ PAD
+ PADDING CHARACTER
+ PRIVATE USE 1
+ PRIVATE USE 2
+ SGC
+ SINGLE GRAPHIC CHARACTER INTRODUCER
+ SINGLE-SHIFT 2
+ SINGLE-SHIFT 3
+ START OF PROTECTED AREA
+
=head1 CUSTOM ALIASES
This version of charnames supports three mechanisms of adding local
or customized aliases to standard Unicode naming conventions (:full).
+The aliases override any standard definitions, so, if you're twisted enough,
+you can change C<"\N{LATIN CAPITAL LETTER A}"> to mean C<"B">, etc.
Note that an alias should not be something that is a legal curly
brace-enclosed quantifier (see L<perlreref/QUANTIFIERS>). For example
points, as that is their correct current name.
vianame returns a chr if the input name is of the form C<U+...>, and an ord
-otherwise. It is planned to change this to always return an ord.
+otherwise. It is planned to change this to always return an ord. Send email
+to C<perl5-porters@perl.org> to comment on this proposal.
None of the functions work on almost all the Hangul syllable and CJK Unicode
characters that have their code points as part of their names.
-Names must be ASCII characters only.
+Names must be ASCII characters only, which means that you are out of luck if
+you want to create aliases in a language where some or all the characters of
+the desired aliases are non-ASCII.
Unicode standard named sequences are not recognized, such as
C<LATIN CAPITAL LETTER A WITH MACRON AND GRAVE>
$SIG{__WARN__} = sub { push @WARN, @_ };
}
-our $local_tests = 58;
+our $local_tests = 424;
# ---- For the alias extensions
require "../t/lib/common.pl";
1
EOE
like($@, "CYRILLIC CAPITAL LETTER BE.*above 0xFF");
+
+ $res = eval <<'EOE';
+use charnames ':full', ":alias" => { BOM => "LATIN SMALL LETTER B" };
+"\N{BOM}";
+EOE
+ is ($@, "");
+ is ($res, 'b', "Verify that can redefine a standard alias");
}
my $encoded_be;
is("\N{HORIZONTAL TABULATION}", "\t");
- ok(grep { /"HORIZONTAL TABULATION" is deprecated/ } @WARN);
+ ok(grep { /"HORIZONTAL TABULATION" is deprecated.*CHARACTER TABULATION/ } @WARN);
no warnings 'deprecated';
is(charnames::viacode("BE"), "VULGAR FRACTION THREE QUARTERS");
is(charnames::viacode("U+00000000000FEED"), "ARABIC LETTER WAW ISOLATED FORM");
+{
+ no warnings 'deprecated';
+ is("\N{LINE FEED}", "\N{LINE FEED (LF)}");
+ is("\N{FORM FEED}", "\N{FORM FEED (FF)}");
+ is("\N{CARRIAGE RETURN}", "\N{CARRIAGE RETURN (CR)}");
+ is("\N{NEXT LINE}", "\N{NEXT LINE (NEL)}");
+ is("\N{NUL}", "\N{NULL}");
+ is("\N{SOH}", "\N{START OF HEADING}");
+ is("\N{STX}", "\N{START OF TEXT}");
+ is("\N{ETX}", "\N{END OF TEXT}");
+ is("\N{EOT}", "\N{END OF TRANSMISSION}");
+ is("\N{ENQ}", "\N{ENQUIRY}");
+ is("\N{ACK}", "\N{ACKNOWLEDGE}");
+ is("\N{BEL}", "\N{BELL}");
+ is("\N{BS}", "\N{BACKSPACE}");
+ is("\N{HT}", "\N{HORIZONTAL TABULATION}");
+ is("\N{LF}", "\N{LINE FEED (LF)}");
+ is("\N{VT}", "\N{VERTICAL TABULATION}");
+ is("\N{FF}", "\N{FORM FEED (FF)}");
+ is("\N{CR}", "\N{CARRIAGE RETURN (CR)}");
+ is("\N{SO}", "\N{SHIFT OUT}");
+ is("\N{SI}", "\N{SHIFT IN}");
+ is("\N{DLE}", "\N{DATA LINK ESCAPE}");
+ is("\N{DC1}", "\N{DEVICE CONTROL ONE}");
+ is("\N{DC2}", "\N{DEVICE CONTROL TWO}");
+ is("\N{DC3}", "\N{DEVICE CONTROL THREE}");
+ is("\N{DC4}", "\N{DEVICE CONTROL FOUR}");
+ is("\N{NAK}", "\N{NEGATIVE ACKNOWLEDGE}");
+ is("\N{SYN}", "\N{SYNCHRONOUS IDLE}");
+ is("\N{ETB}", "\N{END OF TRANSMISSION BLOCK}");
+ is("\N{CAN}", "\N{CANCEL}");
+ is("\N{EOM}", "\N{END OF MEDIUM}");
+ is("\N{SUB}", "\N{SUBSTITUTE}");
+ is("\N{ESC}", "\N{ESCAPE}");
+ is("\N{FS}", "\N{FILE SEPARATOR}");
+ is("\N{GS}", "\N{GROUP SEPARATOR}");
+ is("\N{RS}", "\N{RECORD SEPARATOR}");
+ is("\N{US}", "\N{UNIT SEPARATOR}");
+ is("\N{DEL}", "\N{DELETE}");
+ is("\N{BPH}", "\N{BREAK PERMITTED HERE}");
+ is("\N{NBH}", "\N{NO BREAK HERE}");
+ is("\N{NEL}", "\N{NEXT LINE (NEL)}");
+ is("\N{SSA}", "\N{START OF SELECTED AREA}");
+ is("\N{ESA}", "\N{END OF SELECTED AREA}");
+ is("\N{HTS}", "\N{CHARACTER TABULATION SET}");
+ is("\N{HTJ}", "\N{CHARACTER TABULATION WITH JUSTIFICATION}");
+ is("\N{VTS}", "\N{LINE TABULATION SET}");
+ is("\N{PLD}", "\N{PARTIAL LINE FORWARD}");
+ is("\N{PLU}", "\N{PARTIAL LINE BACKWARD}");
+ is("\N{RI }", "\N{REVERSE LINE FEED}");
+ is("\N{SS2}", "\N{SINGLE SHIFT TWO}");
+ is("\N{SS3}", "\N{SINGLE SHIFT THREE}");
+ is("\N{DCS}", "\N{DEVICE CONTROL STRING}");
+ is("\N{PU1}", "\N{PRIVATE USE ONE}");
+ is("\N{PU2}", "\N{PRIVATE USE TWO}");
+ is("\N{STS}", "\N{SET TRANSMIT STATE}");
+ is("\N{CCH}", "\N{CANCEL CHARACTER}");
+ is("\N{MW }", "\N{MESSAGE WAITING}");
+ is("\N{SPA}", "\N{START OF GUARDED AREA}");
+ is("\N{EPA}", "\N{END OF GUARDED AREA}");
+ is("\N{SOS}", "\N{START OF STRING}");
+ is("\N{SCI}", "\N{SINGLE CHARACTER INTRODUCER}");
+ is("\N{CSI}", "\N{CONTROL SEQUENCE INTRODUCER}");
+ is("\N{ST }", "\N{STRING TERMINATOR}");
+ is("\N{OSC}", "\N{OPERATING SYSTEM COMMAND}");
+ is("\N{PM }", "\N{PRIVACY MESSAGE}");
+ is("\N{APC}", "\N{APPLICATION PROGRAM COMMAND}");
+ is("\N{PADDING CHARACTER}", "\N{PAD}");
+ is("\N{HIGH OCTET PRESET}","\N{HOP}");
+ is("\N{INDEX}", "\N{IND}");
+ is("\N{SINGLE GRAPHIC CHARACTER INTRODUCER}", "\N{SGC}");
+ is("\N{BOM}", "\N{BYTE ORDER MARK}");
+ is("\N{CGJ}", "\N{COMBINING GRAPHEME JOINER}");
+ is("\N{FVS1}", "\N{MONGOLIAN FREE VARIATION SELECTOR ONE}");
+ is("\N{FVS2}", "\N{MONGOLIAN FREE VARIATION SELECTOR TWO}");
+ is("\N{FVS3}", "\N{MONGOLIAN FREE VARIATION SELECTOR THREE}");
+ is("\N{LRE}", "\N{LEFT-TO-RIGHT EMBEDDING}");
+ is("\N{LRM}", "\N{LEFT-TO-RIGHT MARK}");
+ is("\N{LRO}", "\N{LEFT-TO-RIGHT OVERRIDE}");
+ is("\N{MMSP}", "\N{MEDIUM MATHEMATICAL SPACE}");
+ is("\N{MVS}", "\N{MONGOLIAN VOWEL SEPARATOR}");
+ is("\N{NBSP}", "\N{NO-BREAK SPACE}");
+ is("\N{NNBSP}", "\N{NARROW NO-BREAK SPACE}");
+ is("\N{PDF}", "\N{POP DIRECTIONAL FORMATTING}");
+ is("\N{RLE}", "\N{RIGHT-TO-LEFT EMBEDDING}");
+ is("\N{RLM}", "\N{RIGHT-TO-LEFT MARK}");
+ is("\N{RLO}", "\N{RIGHT-TO-LEFT OVERRIDE}");
+ is("\N{SHY}", "\N{SOFT HYPHEN}");
+ is("\N{WJ}", "\N{WORD JOINER}");
+ is("\N{ZWJ}", "\N{ZERO WIDTH JOINER}");
+ is("\N{ZWNJ}", "\N{ZERO WIDTH NON-JOINER}");
+ is("\N{ZWSP}", "\N{ZERO WIDTH SPACE}");
+ is("\N{HORIZONTAL TABULATION}", "\N{CHARACTER TABULATION}");
+ is("\N{VERTICAL TABULATION}", "\N{LINE TABULATION}");
+ is("\N{FILE SEPARATOR}", "\N{INFORMATION SEPARATOR FOUR}");
+ is("\N{GROUP SEPARATOR}", "\N{INFORMATION SEPARATOR THREE}");
+ is("\N{RECORD SEPARATOR}", "\N{INFORMATION SEPARATOR TWO}");
+ is("\N{UNIT SEPARATOR}", "\N{INFORMATION SEPARATOR ONE}");
+ is("\N{HORIZONTAL TABULATION SET}", "\N{CHARACTER TABULATION SET}");
+ is("\N{HORIZONTAL TABULATION WITH JUSTIFICATION}", "\N{CHARACTER TABULATION WITH JUSTIFICATION}");
+ is("\N{PARTIAL LINE DOWN}", "\N{PARTIAL LINE FORWARD}");
+ is("\N{PARTIAL LINE UP}", "\N{PARTIAL LINE BACKWARD}");
+ is("\N{VERTICAL TABULATION SET}", "\N{LINE TABULATION SET}");
+ is("\N{REVERSE INDEX}", "\N{REVERSE LINE FEED}");
+ is("\N{SINGLE-SHIFT 2}", "\N{SINGLE SHIFT TWO}");
+ is("\N{SINGLE-SHIFT 3}", "\N{SINGLE SHIFT THREE}");
+ is("\N{PRIVATE USE 1}", "\N{PRIVATE USE ONE}");
+ is("\N{PRIVATE USE 2}", "\N{PRIVATE USE TWO}");
+ is("\N{START OF PROTECTED AREA}", "\N{START OF GUARDED AREA}");
+ is("\N{END OF PROTECTED AREA}", "\N{END OF GUARDED AREA}");
+ is("\N{VS1}", "\N{VARIATION SELECTOR-1}");
+ is("\N{VS2}", "\N{VARIATION SELECTOR-2}");
+ is("\N{VS3}", "\N{VARIATION SELECTOR-3}");
+ is("\N{VS4}", "\N{VARIATION SELECTOR-4}");
+ is("\N{VS5}", "\N{VARIATION SELECTOR-5}");
+ is("\N{VS6}", "\N{VARIATION SELECTOR-6}");
+ is("\N{VS7}", "\N{VARIATION SELECTOR-7}");
+ is("\N{VS8}", "\N{VARIATION SELECTOR-8}");
+ is("\N{VS9}", "\N{VARIATION SELECTOR-9}");
+ is("\N{VS10}", "\N{VARIATION SELECTOR-10}");
+ is("\N{VS11}", "\N{VARIATION SELECTOR-11}");
+ is("\N{VS12}", "\N{VARIATION SELECTOR-12}");
+ is("\N{VS13}", "\N{VARIATION SELECTOR-13}");
+ is("\N{VS14}", "\N{VARIATION SELECTOR-14}");
+ is("\N{VS15}", "\N{VARIATION SELECTOR-15}");
+ is("\N{VS16}", "\N{VARIATION SELECTOR-16}");
+ is("\N{VS17}", "\N{VARIATION SELECTOR-17}");
+ is("\N{VS18}", "\N{VARIATION SELECTOR-18}");
+ is("\N{VS19}", "\N{VARIATION SELECTOR-19}");
+ is("\N{VS20}", "\N{VARIATION SELECTOR-20}");
+ is("\N{VS21}", "\N{VARIATION SELECTOR-21}");
+ is("\N{VS22}", "\N{VARIATION SELECTOR-22}");
+ is("\N{VS23}", "\N{VARIATION SELECTOR-23}");
+ is("\N{VS24}", "\N{VARIATION SELECTOR-24}");
+ is("\N{VS25}", "\N{VARIATION SELECTOR-25}");
+ is("\N{VS26}", "\N{VARIATION SELECTOR-26}");
+ is("\N{VS27}", "\N{VARIATION SELECTOR-27}");
+ is("\N{VS28}", "\N{VARIATION SELECTOR-28}");
+ is("\N{VS29}", "\N{VARIATION SELECTOR-29}");
+ is("\N{VS30}", "\N{VARIATION SELECTOR-30}");
+ is("\N{VS31}", "\N{VARIATION SELECTOR-31}");
+ is("\N{VS32}", "\N{VARIATION SELECTOR-32}");
+ is("\N{VS33}", "\N{VARIATION SELECTOR-33}");
+ is("\N{VS34}", "\N{VARIATION SELECTOR-34}");
+ is("\N{VS35}", "\N{VARIATION SELECTOR-35}");
+ is("\N{VS36}", "\N{VARIATION SELECTOR-36}");
+ is("\N{VS37}", "\N{VARIATION SELECTOR-37}");
+ is("\N{VS38}", "\N{VARIATION SELECTOR-38}");
+ is("\N{VS39}", "\N{VARIATION SELECTOR-39}");
+ is("\N{VS40}", "\N{VARIATION SELECTOR-40}");
+ is("\N{VS41}", "\N{VARIATION SELECTOR-41}");
+ is("\N{VS42}", "\N{VARIATION SELECTOR-42}");
+ is("\N{VS43}", "\N{VARIATION SELECTOR-43}");
+ is("\N{VS44}", "\N{VARIATION SELECTOR-44}");
+ is("\N{VS45}", "\N{VARIATION SELECTOR-45}");
+ is("\N{VS46}", "\N{VARIATION SELECTOR-46}");
+ is("\N{VS47}", "\N{VARIATION SELECTOR-47}");
+ is("\N{VS48}", "\N{VARIATION SELECTOR-48}");
+ is("\N{VS49}", "\N{VARIATION SELECTOR-49}");
+ is("\N{VS50}", "\N{VARIATION SELECTOR-50}");
+ is("\N{VS51}", "\N{VARIATION SELECTOR-51}");
+ is("\N{VS52}", "\N{VARIATION SELECTOR-52}");
+ is("\N{VS53}", "\N{VARIATION SELECTOR-53}");
+ is("\N{VS54}", "\N{VARIATION SELECTOR-54}");
+ is("\N{VS55}", "\N{VARIATION SELECTOR-55}");
+ is("\N{VS56}", "\N{VARIATION SELECTOR-56}");
+ is("\N{VS57}", "\N{VARIATION SELECTOR-57}");
+ is("\N{VS58}", "\N{VARIATION SELECTOR-58}");
+ is("\N{VS59}", "\N{VARIATION SELECTOR-59}");
+ is("\N{VS60}", "\N{VARIATION SELECTOR-60}");
+ is("\N{VS61}", "\N{VARIATION SELECTOR-61}");
+ is("\N{VS62}", "\N{VARIATION SELECTOR-62}");
+ is("\N{VS63}", "\N{VARIATION SELECTOR-63}");
+ is("\N{VS64}", "\N{VARIATION SELECTOR-64}");
+ is("\N{VS65}", "\N{VARIATION SELECTOR-65}");
+ is("\N{VS66}", "\N{VARIATION SELECTOR-66}");
+ is("\N{VS67}", "\N{VARIATION SELECTOR-67}");
+ is("\N{VS68}", "\N{VARIATION SELECTOR-68}");
+ is("\N{VS69}", "\N{VARIATION SELECTOR-69}");
+ is("\N{VS70}", "\N{VARIATION SELECTOR-70}");
+ is("\N{VS71}", "\N{VARIATION SELECTOR-71}");
+ is("\N{VS72}", "\N{VARIATION SELECTOR-72}");
+ is("\N{VS73}", "\N{VARIATION SELECTOR-73}");
+ is("\N{VS74}", "\N{VARIATION SELECTOR-74}");
+ is("\N{VS75}", "\N{VARIATION SELECTOR-75}");
+ is("\N{VS76}", "\N{VARIATION SELECTOR-76}");
+ is("\N{VS77}", "\N{VARIATION SELECTOR-77}");
+ is("\N{VS78}", "\N{VARIATION SELECTOR-78}");
+ is("\N{VS79}", "\N{VARIATION SELECTOR-79}");
+ is("\N{VS80}", "\N{VARIATION SELECTOR-80}");
+ is("\N{VS81}", "\N{VARIATION SELECTOR-81}");
+ is("\N{VS82}", "\N{VARIATION SELECTOR-82}");
+ is("\N{VS83}", "\N{VARIATION SELECTOR-83}");
+ is("\N{VS84}", "\N{VARIATION SELECTOR-84}");
+ is("\N{VS85}", "\N{VARIATION SELECTOR-85}");
+ is("\N{VS86}", "\N{VARIATION SELECTOR-86}");
+ is("\N{VS87}", "\N{VARIATION SELECTOR-87}");
+ is("\N{VS88}", "\N{VARIATION SELECTOR-88}");
+ is("\N{VS89}", "\N{VARIATION SELECTOR-89}");
+ is("\N{VS90}", "\N{VARIATION SELECTOR-90}");
+ is("\N{VS91}", "\N{VARIATION SELECTOR-91}");
+ is("\N{VS92}", "\N{VARIATION SELECTOR-92}");
+ is("\N{VS93}", "\N{VARIATION SELECTOR-93}");
+ is("\N{VS94}", "\N{VARIATION SELECTOR-94}");
+ is("\N{VS95}", "\N{VARIATION SELECTOR-95}");
+ is("\N{VS96}", "\N{VARIATION SELECTOR-96}");
+ is("\N{VS97}", "\N{VARIATION SELECTOR-97}");
+ is("\N{VS98}", "\N{VARIATION SELECTOR-98}");
+ is("\N{VS99}", "\N{VARIATION SELECTOR-99}");
+ is("\N{VS100}", "\N{VARIATION SELECTOR-100}");
+ is("\N{VS101}", "\N{VARIATION SELECTOR-101}");
+ is("\N{VS102}", "\N{VARIATION SELECTOR-102}");
+ is("\N{VS103}", "\N{VARIATION SELECTOR-103}");
+ is("\N{VS104}", "\N{VARIATION SELECTOR-104}");
+ is("\N{VS105}", "\N{VARIATION SELECTOR-105}");
+ is("\N{VS106}", "\N{VARIATION SELECTOR-106}");
+ is("\N{VS107}", "\N{VARIATION SELECTOR-107}");
+ is("\N{VS108}", "\N{VARIATION SELECTOR-108}");
+ is("\N{VS109}", "\N{VARIATION SELECTOR-109}");
+ is("\N{VS110}", "\N{VARIATION SELECTOR-110}");
+ is("\N{VS111}", "\N{VARIATION SELECTOR-111}");
+ is("\N{VS112}", "\N{VARIATION SELECTOR-112}");
+ is("\N{VS113}", "\N{VARIATION SELECTOR-113}");
+ is("\N{VS114}", "\N{VARIATION SELECTOR-114}");
+ is("\N{VS115}", "\N{VARIATION SELECTOR-115}");
+ is("\N{VS116}", "\N{VARIATION SELECTOR-116}");
+ is("\N{VS117}", "\N{VARIATION SELECTOR-117}");
+ is("\N{VS118}", "\N{VARIATION SELECTOR-118}");
+ is("\N{VS119}", "\N{VARIATION SELECTOR-119}");
+ is("\N{VS120}", "\N{VARIATION SELECTOR-120}");
+ is("\N{VS121}", "\N{VARIATION SELECTOR-121}");
+ is("\N{VS122}", "\N{VARIATION SELECTOR-122}");
+ is("\N{VS123}", "\N{VARIATION SELECTOR-123}");
+ is("\N{VS124}", "\N{VARIATION SELECTOR-124}");
+ is("\N{VS125}", "\N{VARIATION SELECTOR-125}");
+ is("\N{VS126}", "\N{VARIATION SELECTOR-126}");
+ is("\N{VS127}", "\N{VARIATION SELECTOR-127}");
+ is("\N{VS128}", "\N{VARIATION SELECTOR-128}");
+ is("\N{VS129}", "\N{VARIATION SELECTOR-129}");
+ is("\N{VS130}", "\N{VARIATION SELECTOR-130}");
+ is("\N{VS131}", "\N{VARIATION SELECTOR-131}");
+ is("\N{VS132}", "\N{VARIATION SELECTOR-132}");
+ is("\N{VS133}", "\N{VARIATION SELECTOR-133}");
+ is("\N{VS134}", "\N{VARIATION SELECTOR-134}");
+ is("\N{VS135}", "\N{VARIATION SELECTOR-135}");
+ is("\N{VS136}", "\N{VARIATION SELECTOR-136}");
+ is("\N{VS137}", "\N{VARIATION SELECTOR-137}");
+ is("\N{VS138}", "\N{VARIATION SELECTOR-138}");
+ is("\N{VS139}", "\N{VARIATION SELECTOR-139}");
+ is("\N{VS140}", "\N{VARIATION SELECTOR-140}");
+ is("\N{VS141}", "\N{VARIATION SELECTOR-141}");
+ is("\N{VS142}", "\N{VARIATION SELECTOR-142}");
+ is("\N{VS143}", "\N{VARIATION SELECTOR-143}");
+ is("\N{VS144}", "\N{VARIATION SELECTOR-144}");
+ is("\N{VS145}", "\N{VARIATION SELECTOR-145}");
+ is("\N{VS146}", "\N{VARIATION SELECTOR-146}");
+ is("\N{VS147}", "\N{VARIATION SELECTOR-147}");
+ is("\N{VS148}", "\N{VARIATION SELECTOR-148}");
+ is("\N{VS149}", "\N{VARIATION SELECTOR-149}");
+ is("\N{VS150}", "\N{VARIATION SELECTOR-150}");
+ is("\N{VS151}", "\N{VARIATION SELECTOR-151}");
+ is("\N{VS152}", "\N{VARIATION SELECTOR-152}");
+ is("\N{VS153}", "\N{VARIATION SELECTOR-153}");
+ is("\N{VS154}", "\N{VARIATION SELECTOR-154}");
+ is("\N{VS155}", "\N{VARIATION SELECTOR-155}");
+ is("\N{VS156}", "\N{VARIATION SELECTOR-156}");
+ is("\N{VS157}", "\N{VARIATION SELECTOR-157}");
+ is("\N{VS158}", "\N{VARIATION SELECTOR-158}");
+ is("\N{VS159}", "\N{VARIATION SELECTOR-159}");
+ is("\N{VS160}", "\N{VARIATION SELECTOR-160}");
+ is("\N{VS161}", "\N{VARIATION SELECTOR-161}");
+ is("\N{VS162}", "\N{VARIATION SELECTOR-162}");
+ is("\N{VS163}", "\N{VARIATION SELECTOR-163}");
+ is("\N{VS164}", "\N{VARIATION SELECTOR-164}");
+ is("\N{VS165}", "\N{VARIATION SELECTOR-165}");
+ is("\N{VS166}", "\N{VARIATION SELECTOR-166}");
+ is("\N{VS167}", "\N{VARIATION SELECTOR-167}");
+ is("\N{VS168}", "\N{VARIATION SELECTOR-168}");
+ is("\N{VS169}", "\N{VARIATION SELECTOR-169}");
+ is("\N{VS170}", "\N{VARIATION SELECTOR-170}");
+ is("\N{VS171}", "\N{VARIATION SELECTOR-171}");
+ is("\N{VS172}", "\N{VARIATION SELECTOR-172}");
+ is("\N{VS173}", "\N{VARIATION SELECTOR-173}");
+ is("\N{VS174}", "\N{VARIATION SELECTOR-174}");
+ is("\N{VS175}", "\N{VARIATION SELECTOR-175}");
+ is("\N{VS176}", "\N{VARIATION SELECTOR-176}");
+ is("\N{VS177}", "\N{VARIATION SELECTOR-177}");
+ is("\N{VS178}", "\N{VARIATION SELECTOR-178}");
+ is("\N{VS179}", "\N{VARIATION SELECTOR-179}");
+ is("\N{VS180}", "\N{VARIATION SELECTOR-180}");
+ is("\N{VS181}", "\N{VARIATION SELECTOR-181}");
+ is("\N{VS182}", "\N{VARIATION SELECTOR-182}");
+ is("\N{VS183}", "\N{VARIATION SELECTOR-183}");
+ is("\N{VS184}", "\N{VARIATION SELECTOR-184}");
+ is("\N{VS185}", "\N{VARIATION SELECTOR-185}");
+ is("\N{VS186}", "\N{VARIATION SELECTOR-186}");
+ is("\N{VS187}", "\N{VARIATION SELECTOR-187}");
+ is("\N{VS188}", "\N{VARIATION SELECTOR-188}");
+ is("\N{VS189}", "\N{VARIATION SELECTOR-189}");
+ is("\N{VS190}", "\N{VARIATION SELECTOR-190}");
+ is("\N{VS191}", "\N{VARIATION SELECTOR-191}");
+ is("\N{VS192}", "\N{VARIATION SELECTOR-192}");
+ is("\N{VS193}", "\N{VARIATION SELECTOR-193}");
+ is("\N{VS194}", "\N{VARIATION SELECTOR-194}");
+ is("\N{VS195}", "\N{VARIATION SELECTOR-195}");
+ is("\N{VS196}", "\N{VARIATION SELECTOR-196}");
+ is("\N{VS197}", "\N{VARIATION SELECTOR-197}");
+ is("\N{VS198}", "\N{VARIATION SELECTOR-198}");
+ is("\N{VS199}", "\N{VARIATION SELECTOR-199}");
+ is("\N{VS200}", "\N{VARIATION SELECTOR-200}");
+ is("\N{VS201}", "\N{VARIATION SELECTOR-201}");
+ is("\N{VS202}", "\N{VARIATION SELECTOR-202}");
+ is("\N{VS203}", "\N{VARIATION SELECTOR-203}");
+ is("\N{VS204}", "\N{VARIATION SELECTOR-204}");
+ is("\N{VS205}", "\N{VARIATION SELECTOR-205}");
+ is("\N{VS206}", "\N{VARIATION SELECTOR-206}");
+ is("\N{VS207}", "\N{VARIATION SELECTOR-207}");
+ is("\N{VS208}", "\N{VARIATION SELECTOR-208}");
+ is("\N{VS209}", "\N{VARIATION SELECTOR-209}");
+ is("\N{VS210}", "\N{VARIATION SELECTOR-210}");
+ is("\N{VS211}", "\N{VARIATION SELECTOR-211}");
+ is("\N{VS212}", "\N{VARIATION SELECTOR-212}");
+ is("\N{VS213}", "\N{VARIATION SELECTOR-213}");
+ is("\N{VS214}", "\N{VARIATION SELECTOR-214}");
+ is("\N{VS215}", "\N{VARIATION SELECTOR-215}");
+ is("\N{VS216}", "\N{VARIATION SELECTOR-216}");
+ is("\N{VS217}", "\N{VARIATION SELECTOR-217}");
+ is("\N{VS218}", "\N{VARIATION SELECTOR-218}");
+ is("\N{VS219}", "\N{VARIATION SELECTOR-219}");
+ is("\N{VS220}", "\N{VARIATION SELECTOR-220}");
+ is("\N{VS221}", "\N{VARIATION SELECTOR-221}");
+ is("\N{VS222}", "\N{VARIATION SELECTOR-222}");
+ is("\N{VS223}", "\N{VARIATION SELECTOR-223}");
+ is("\N{VS224}", "\N{VARIATION SELECTOR-224}");
+ is("\N{VS225}", "\N{VARIATION SELECTOR-225}");
+ is("\N{VS226}", "\N{VARIATION SELECTOR-226}");
+ is("\N{VS227}", "\N{VARIATION SELECTOR-227}");
+ is("\N{VS228}", "\N{VARIATION SELECTOR-228}");
+ is("\N{VS229}", "\N{VARIATION SELECTOR-229}");
+ is("\N{VS230}", "\N{VARIATION SELECTOR-230}");
+ is("\N{VS231}", "\N{VARIATION SELECTOR-231}");
+ is("\N{VS232}", "\N{VARIATION SELECTOR-232}");
+ is("\N{VS233}", "\N{VARIATION SELECTOR-233}");
+ is("\N{VS234}", "\N{VARIATION SELECTOR-234}");
+ is("\N{VS235}", "\N{VARIATION SELECTOR-235}");
+ is("\N{VS236}", "\N{VARIATION SELECTOR-236}");
+ is("\N{VS237}", "\N{VARIATION SELECTOR-237}");
+ is("\N{VS238}", "\N{VARIATION SELECTOR-238}");
+ is("\N{VS239}", "\N{VARIATION SELECTOR-239}");
+ is("\N{VS240}", "\N{VARIATION SELECTOR-240}");
+ is("\N{VS241}", "\N{VARIATION SELECTOR-241}");
+ is("\N{VS242}", "\N{VARIATION SELECTOR-242}");
+ is("\N{VS243}", "\N{VARIATION SELECTOR-243}");
+ is("\N{VS244}", "\N{VARIATION SELECTOR-244}");
+ is("\N{VS245}", "\N{VARIATION SELECTOR-245}");
+ is("\N{VS246}", "\N{VARIATION SELECTOR-246}");
+ is("\N{VS247}", "\N{VARIATION SELECTOR-247}");
+ is("\N{VS248}", "\N{VARIATION SELECTOR-248}");
+ is("\N{VS249}", "\N{VARIATION SELECTOR-249}");
+ is("\N{VS250}", "\N{VARIATION SELECTOR-250}");
+ is("\N{VS251}", "\N{VARIATION SELECTOR-251}");
+ is("\N{VS252}", "\N{VARIATION SELECTOR-252}");
+ is("\N{VS253}", "\N{VARIATION SELECTOR-253}");
+ is("\N{VS254}", "\N{VARIATION SELECTOR-254}");
+ is("\N{VS255}", "\N{VARIATION SELECTOR-255}");
+ is("\N{VS256}", "\N{VARIATION SELECTOR-256}");
+}
+
+# ---- Alias extensions
+
+my $alifile = File::Spec->catfile(File::Spec->updir, qw(lib unicore xyzzy_alias.pl));
+
+my @prgs;
+{
+ local $/ = undef;
+ @prgs = split "\n########\n", <DATA>;
+}
+
+for (@prgs) {
+ my ($code, $exp) = ((split m/\nEXPECT\n/), '$');
+ my ($prog, $fil) = ((split m/\nFILE\n/, $code), "");
+ my $tmpfile = tempfile();
+ open my $tmp, "> $tmpfile" or die "Could not open $tmpfile: $!";
+ print $tmp $prog, "\n";
+ close $tmp or die "Could not close $tmpfile: $!";
+ if ($fil) {
+ $fil .= "\n";
+ open my $ali, "> $alifile" or die "Could not open $alifile: $!";
+ print $ali $fil;
+ close $ali or die "Could not close $alifile: $!";
+ }
+ my $switch = "";
+ my $res = runperl( switches => $switch,
+ progfile => $tmpfile,
+ stderr => 1 );
+ my $status = $?;
+ $res =~ s/[\r\n]+$//;
+ $res =~ s/tmp\d+/-/g; # fake $prog from STDIN
+ $res =~ s/\n%[A-Z]+-[SIWEF]-.*$// # clip off DCL status msg
+ if $^O eq "VMS";
+ $exp =~ s/[\r\n]+$//;
+ my $pfx = ($res =~ s/^PREFIX\n//);
+ my $rexp = qr{^$exp};
+ my $expected = ""; # Unsure why this is here, as was never initialized
+
+ SKIP: {
+ skip $res, 1, if $res =~ s/^SKIPPED\n//;
+ if (($pfx and $res !~ /^\Q$expected/) or
+ (!$pfx and $res !~ $rexp))
+ {
+ fail("PROG:\n$prog\nFILE:\n${fil}EXPECTED:\n$exp\nGOT:\n$res");
+ } else {
+ pass("");
+ }
+ }
+ $fil or next;
+ 1 while unlink $alifile;
+}
+
# [perl #30409] charnames.pm clobbers default variable
$_ = 'foobar';
eval "use charnames ':full';";