Add a number of abbrs and variants to \N{}
authorKarl Williamson <khw@khw-desktop.(none)>
Tue, 29 Jun 2010 18:54:33 +0000 (12:54 -0600)
committerJesse Vincent <jesse@bestpractical.com>
Sun, 4 Jul 2010 20:43:41 +0000 (21:43 +0100)
This patch adds the standard abbreviations for the control characters
(such as ACK, BEL, etc) to the repertoire that \N{} knows about.  It
also adds a few common variants of their full names, and the old names
for the 4 controls that Unicode has chosen not to have any names at all
for.

The patch also adds all the abbreviations that Unicode lists in 5.2 for
longer characters, such as NBSP, SHY, LRE, ...

To preserve complete backward compatibilty for these and future changes,
user-defined aliases are now checked first, before these are.

As a performance enhancement, these aliases are mapped to their actual
code values instead of their full names which then had to be looked up
in the large table.  Now that is avoided, and the table is not loaded
at all until a name is encountered that is not one of these aliases.

The pod and .t are updated.

lib/charnames.pm
lib/charnames.t
pod/perl5133delta.pod

index eddf66a..578ca46 100644 (file)
@@ -2,44 +2,406 @@ package charnames;
 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
@@ -86,27 +448,28 @@ sub alias_file ($)
 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"
@@ -347,7 +710,8 @@ charnames - define character names for C<\N{named}> string literal escapes
 
   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
 
@@ -359,7 +723,8 @@ C<CHARNAME> has the form C<SCRIPT:CNAME>, then C<CNAME> is looked up
 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
@@ -379,10 +744,10 @@ functionality, use charnames::vianame().
 
 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}".
@@ -408,39 +773,90 @@ to use the official names
     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
@@ -558,12 +974,15 @@ viacode should return an empty string for unassigned in-range Unicode code
 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>
index 50c9837..33d0f99 100644 (file)
@@ -11,7 +11,7 @@ BEGIN {
     $SIG{__WARN__} = sub { push @WARN, @_ };
 }
 
-our $local_tests = 58;
+our $local_tests = 424;
 
 # ---- For the alias extensions
 require "../t/lib/common.pl";
@@ -38,6 +38,13 @@ use charnames 'cyrillic';
 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;
@@ -164,7 +171,7 @@ is("\N{BOM}", chr(0xFEFF));
 
     is("\N{HORIZONTAL TABULATION}", "\t");
 
-    ok(grep { /"HORIZONTAL TABULATION" is deprecated/ } @WARN);
+    ok(grep { /"HORIZONTAL TABULATION" is deprecated.*CHARACTER TABULATION/ } @WARN);
 
     no warnings 'deprecated';
 
@@ -198,6 +205,425 @@ is(charnames::viacode(0), "NULL");
 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';";
index 1cf19d8..f16dcf9 100644 (file)
@@ -28,6 +28,17 @@ here, but most should go in the L</Performance Enhancements> section.
 
 [ List each enhancement as a =head2 entry ]
 
+=head2 C<\N{I<name>}> understands a a number of new abbreviations and names
+
+C<\N{}> now knows about the abbreviated character names listed by Unicode, such
+as NBSP, SHY, LRO, ZWJ, etc., as well as all the customary abbreviations for
+the C0 and C1 control characters (such as ACK, BEL, CAN, etc.), as well as a
+few new variants in common usage of some C1 full names.  A complete list is in
+L<charnames>.
+
+In the past, it was ineffective to override one of Perl's abbreviations with
+your own custom alias.  Now it works.
+
 =head1 Security
 
 XXX Any security-related notices go here.  In particular, any security