Locale:...:CP10007(3)

πŸŽ€ Locale::...::CP10007(3) β€” the one where M$ refuses to let go

Okay bestie, so this is CP10007(3) from the User Contributed Perl Documentation section, and it's a Locale::RecodeData</> situation, so you already know it's giving "internal plumbing, do not touch" energy. Buckle up, it's short but iconic.


✨ NAME ✨

Locale::RecodeData::CP10007 β€” literally just conversion routines for CP10007. That's it. That's the whole name. πŸ’…


πŸ¦‹ SYNOPSIS πŸ¦‹

This module is internal to libintl.  Do not use directly!

Okay so real talk: this module is internal to libintl. Like, it's backstage. It's not for you. Do not use it directly. I'm serious, bestie β€” Do not use directly! with the exclamation mark and everything. The manpage is screaming at us and honestly? Respect. 🫢


🌸 DESCRIPTION 🌸

So what even is this thing? It's a generated module, meaning nobody hand-wrote it, a script birthed it β€” and it contains the conversion tables and routines for CP10007. That's the whole vibe. Generated code, conversion tables, routines, done. ✨


πŸ’œ COMMENTS πŸ’œ

Okay this is the messy part and I am obsessed. 😭 The manpage says the following comments have been extracted from the original charmap, and here's what it says, verbatim:

This is the old MacCyrillic which M$ keeps around as CP10007.

"M$". They said it. In the official documentation. I cannot. πŸ’€ So yeah β€” <italic>the old MacCyrillic</italic>, and Redmond keeps it alive as CP10007. Sunk-cost-fuelled king behaviour, honestly. πŸ‘‘

And then, please note: aliases listed above are not necessarily valid! So don't come for me if you try one and it doesn't work β€” the docs literally warned us. πŸ™ˆ


πŸ”₯ CHARACTER TABLE πŸ”₯

Alright, here's the part you came for. A few ground rules before the table drops (it's coming in the next bit, don't panic):

  • The table is sorted in the same order as the original charmap. No re-sorting, no alphabetising, we respect the source. 🧚
  • All character codes are in hexadecimal, periodt. So read 41 as hex, not as forty-one. πŸ”’
  • And this one's important: when you see 'ISO-10646', read it as 'ISO-10646-UCS4'. Same thing, longer name, that's the rule. ⭐

…and that's where part 1 wraps β€” the table itself is up next, bestie. Don't go anywhere. πŸ’–

...and we're straight into the table, no recap, let's go πŸ’…

First up: the 00–1F block, aka the control-character zone. These are the ones that do stuff instead of looking like anything β€” NULL at 00, BELL at 07, ESCAPE at 1B, and the whole DEVICE CONTROL ONE through DEVICE CONTROL FOUR squad. It's giving backstage-pass energy: you don't see them in the text, but they're running the show 🎭

           00 |  00000000 | NULL
           01 |  00000001 | START OF HEADING
           02 |  00000002 | START OF TEXT
           03 |  00000003 | END OF TEXT
           04 |  00000004 | END OF TRANSMISSION
           05 |  00000005 | ENQUIRY
           06 |  00000006 | ACKNOWLEDGE
           07 |  00000007 | BELL
           08 |  00000008 | BACKSPACE
           09 |  00000009 | HORIZONTAL TABULATION
           0A |  0000000A | LINE FEED
           0B |  0000000B | VERTICAL TABULATION
           0C |  0000000C | FORM FEED
           0D |  0000000D | CARRIAGE RETURN
           0E |  0000000E | SHIFT OUT
           0F |  0000000F | SHIFT IN
           10 |  00000010 | DATA LINK ESCAPE
           11 |  00000011 | DEVICE CONTROL ONE
           12 |  00000012 | DEVICE CONTROL TWO
           13 |  00000013 | DEVICE CONTROL THREE
           14 |  00000014 | DEVICE CONTROL FOUR
           15 |  00000015 | NEGATIVE ACKNOWLEDGE
           16 |  00000016 | SYNCHRONOUS IDLE
           17 |  00000017 | END OF TRANSMISSION BLOCK
           18 |  00000018 | CANCEL
           19 |  00000019 | END OF MEDIUM
           1A |  0000001A | SUBSTITUTE
           1B |  0000001B | ESCAPE
           1C |  0000001C | FILE SEPARATOR
           1D |  0000001D | GROUP SEPARATOR
           1E |  0000001E | RECORD SEPARATOR
           1F |  0000001F | UNIT SEPARATOR

Then 20–7F β€” the printable era ✨ SPACE opens it at 20, DELETE closes it out at 7F, and in between it's every key on your keyboard being named extremely literally. EXCLAMATION MARK, NUMBER SIGN, COMMERCIAL AT, LOW LINE, GRAVE ACCENT... whoever named these was in their documentation era fr fr πŸ“

           20 |  00000020 | SPACE
           21 |  00000021 | EXCLAMATION MARK
           22 |  00000022 | QUOTATION MARK
           23 |  00000023 | NUMBER SIGN
           24 |  00000024 | DOLLAR SIGN
           25 |  00000025 | PERCENT SIGN
           26 |  00000026 | AMPERSAND
           27 |  00000027 | APOSTROPHE
           28 |  00000028 | LEFT PARENTHESIS
           29 |  00000029 | RIGHT PARENTHESIS
           2A |  0000002A | ASTERISK
           2B |  0000002B | PLUS SIGN
           2C |  0000002C | COMMA
           2D |  0000002D | HYPHEN-MINUS
           2E |  0000002E | FULL STOP
           2F |  0000002F | SOLIDUS
           30 |  00000030 | DIGIT ZERO
           31 |  00000031 | DIGIT ONE
           32 |  00000032 | DIGIT TWO
           33 |  00000033 | DIGIT THREE
           34 |  00000034 | DIGIT FOUR
           35 |  00000035 | DIGIT FIVE
           36 |  00000036 | DIGIT SIX
           37 |  00000037 | DIGIT SEVEN
           38 |  00000038 | DIGIT EIGHT
           39 |  00000039 | DIGIT NINE
           3A |  0000003A | COLON
           3B |  0000003B | SEMICOLON
           3C |  0000003C | LESS-THAN SIGN
           3D |  0000003D | EQUALS SIGN
           3E |  0000003E | GREATER-THAN SIGN
           3F |  0000003F | QUESTION MARK
           40 |  00000040 | COMMERCIAL AT
           41 |  00000041 | LATIN CAPITAL LETTER A
           42 |  00000042 | LATIN CAPITAL LETTER B
           43 |  00000043 | LATIN CAPITAL LETTER C
           44 |  00000044 | LATIN CAPITAL LETTER D
           45 |  00000045 | LATIN CAPITAL LETTER E
           46 |  00000046 | LATIN CAPITAL LETTER F
           47 |  00000047 | LATIN CAPITAL LETTER G
           48 |  00000048 | LATIN CAPITAL LETTER H
           49 |  00000049 | LATIN CAPITAL LETTER I
           4A |  0000004A | LATIN CAPITAL LETTER J
           4B |  0000004B | LATIN CAPITAL LETTER K
           4C |  0000004C | LATIN CAPITAL LETTER L
           4D |  0000004D | LATIN CAPITAL LETTER M
           4E |  0000004E | LATIN CAPITAL LETTER N
           4F |  0000004F | LATIN CAPITAL LETTER O
           50 |  00000050 | LATIN CAPITAL LETTER P
           51 |  00000051 | LATIN CAPITAL LETTER Q
           52 |  00000052 | LATIN CAPITAL LETTER R
           53 |  00000053 | LATIN CAPITAL LETTER S
           54 |  00000054 | LATIN CAPITAL LETTER T
           55 |  00000055 | LATIN CAPITAL LETTER U
           56 |  00000056 | LATIN CAPITAL LETTER V
           57 |  00000057 | LATIN CAPITAL LETTER W
           58 |  00000058 | LATIN CAPITAL LETTER X
           59 |  00000059 | LATIN CAPITAL LETTER Y
           5A |  0000005A | LATIN CAPITAL LETTER Z
           5B |  0000005B | LEFT SQUARE BRACKET
           5C |  0000005C | REVERSE SOLIDUS
           5D |  0000005D | RIGHT SQUARE BRACKET
           5E |  0000005E | CIRCUMFLEX ACCENT
           5F |  0000005F | LOW LINE
           60 |  00000060 | GRAVE ACCENT
           61 |  00000061 | LATIN SMALL LETTER A
           62 |  00000062 | LATIN SMALL LETTER B
           63 |  00000063 | LATIN SMALL LETTER C
           64 |  00000064 | LATIN SMALL LETTER D
           65 |  00000065 | LATIN SMALL LETTER E
           66 |  00000066 | LATIN SMALL LETTER F
           67 |  00000067 | LATIN SMALL LETTER G
           68 |  00000068 | LATIN SMALL LETTER H
           69 |  00000069 | LATIN SMALL LETTER I
           6A |  0000006A | LATIN SMALL LETTER J
           6B |  0000006B | LATIN SMALL LETTER K
           6C |  0000006C | LATIN SMALL LETTER L
           6D |  0000006D | LATIN SMALL LETTER M
           6E |  0000006E | LATIN SMALL LETTER N
           6F |  0000006F | LATIN SMALL LETTER O
           70 |  00000070 | LATIN SMALL LETTER P
           71 |  00000071 | LATIN SMALL LETTER Q
           72 |  00000072 | LATIN SMALL LETTER R
           73 |  00000073 | LATIN SMALL LETTER S
           74 |  00000074 | LATIN SMALL LETTER T
           75 |  00000075 | LATIN SMALL LETTER U
           76 |  00000076 | LATIN SMALL LETTER V
           77 |  00000077 | LATIN SMALL LETTER W
           78 |  00000078 | LATIN SMALL LETTER X
           79 |  00000079 | LATIN SMALL LETTER Y
           7A |  0000007A | LATIN SMALL LETTER Z
           7B |  0000007B | LEFT CURLY BRACKET
           7C |  0000007C | VERTICAL LINE
           7D |  0000007D | RIGHT CURLY BRACKET
           7E |  0000007E | TILDE
           7F |  0000007F | DELETE

Now the plot twist πŸŒ€ at 80 we jump all the way over to ISO-10646 00000410 and beyond β€” the Cyrillic capitals arc begins. Same local byte range, whole different Unicode neighbourhood, no cap.

           80 |  00000410 | CYRILLIC CAPITAL LETTER A
           81 |  00000411 | CYRILLIC CAPITAL LETTER BE
           82 |  00000412 | CYRILLIC CAPITAL LETTER VE
           83 |  00000413 | CYRILLIC CAPITAL LETTER GHE
           84 |  00000414 | CYRILLIC CAPITAL LETTER DE
           85 |  00000415 | CYRILLIC CAPITAL LETTER IE
           86 |  00000416 | CYRILLIC CAPITAL LETTER ZHE
           87 |  00000417 | CYRILLIC CAPITAL LETTER ZE
           88 |  00000418 | CYRILLIC CAPITAL LETTER I
           89 |  00000419 | CYRILLIC CAPITAL LETTER SHORT I
           8A |  0000041A | CYRILLIC CAPITAL LETTER KA
           8B |  0000041B | CYRILLIC CAPITAL LETTER EL
           8C |  0000041C | CYRILLIC CAPITAL LETTER EM
           8D |  0000041D | CYRILLIC CAPITAL LETTER EN
           8E |  0000041E | CYRILLIC CAPITAL LETTER O
           8F |  0000041F | CYRILLIC CAPITAL LETTER PE
           90 |  00000420 | CYRILLIC CAPITAL LETTER ER
           91 |  00000421 | CYRILLIC CAPITAL LETTER ES
           92 |  00000422 | CYRILLIC CAPITAL LETTER TE
           93 |  00000423 | CYRILLIC CAPITAL LETTER U
           94 |  00000424 | CYRILLIC CAPITAL LETTER EF
           95 |  00000425 | CYRILLIC CAPITAL LETTER HA
           96 |  00000426 | CYRILLIC CAPITAL LETTER TSE
           97 |  00000427 | CYRILLIC CAPITAL LETTER CHE
           98 |  00000428 | CYRILLIC CAPITAL LETTER SHA
           99 |  00000429 | CYRILLIC CAPITAL LETTER SHCHA
           9A |  0000042A | CYRILLIC CAPITAL LETTER HARD SIGN
           9B |  0000042B | CYRILLIC CAPITAL LETTER YERU
           9C |  0000042C | CYRILLIC CAPITAL LETTER SOFT SIGN
           9D |  0000042D | CYRILLIC CAPITAL LETTER E
           9E |  0000042E | CYRILLIC CAPITAL LETTER YU
           9F |  0000042F | CYRILLIC CAPITAL LETTER YA

A0–DF is where it gets ✨ chaotic in the best way β€” punctuation icons like DAGGER and BULLET and PILCROW SIGN living next to DEGREE SIGN, CENT SIGN, POUND SIGN, SECTION SIGN, REGISTERED SIGN, COPYRIGHT SIGN and TRADE MARK SIGN, then math baddies NOT EQUAL TO, INFINITY, PLUS-MINUS SIGN, LESS-THAN OR EQUAL TO, GREATER-THAN OR EQUAL TO, NOT SIGN, SQUARE ROOT, ALMOST EQUAL TO, INCREMENT, DIVISION SIGN, then quote-mark o'clock with LEFT-POINTING DOUBLE ANGLE QUOTATION MARK, RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK, LEFT DOUBLE QUOTATION MARK, RIGHT DOUBLE QUOTATION MARK, LEFT SINGLE QUOTATION MARK, RIGHT SINGLE QUOTATION MARK, DOUBLE LOW-9 QUOTATION MARK, plus HORIZONTAL ELLIPSIS, NO-BREAK SPACE, EN DASH, EM DASH, NUMERO SIGN and LATIN SMALL LETTER F WITH HOOK. All of it interleaved with more Cyrillic β€” DJE, GJE, JE, LJE, NJE, DZE, TSHE, KJE, IO and friends. Iconic chaos, honestly πŸŽ€

           A0 |  00002020 | DAGGER
           A1 |  000000B0 | DEGREE SIGN
           A2 |  000000A2 | CENT SIGN
           A3 |  000000A3 | POUND SIGN
           A4 |  000000A7 | SECTION SIGN
           A5 |  00002022 | BULLET
           A6 |  000000B6 | PILCROW SIGN
           A7 |  00000406 | CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
           A8 |  000000AE | REGISTERED SIGN
           A9 |  000000A9 | COPYRIGHT SIGN
           AA |  00002122 | TRADE MARK SIGN
           AB |  00000402 | CYRILLIC CAPITAL LETTER DJE
           AC |  00000452 | CYRILLIC SMALL LETTER DJE
           AD |  00002260 | NOT EQUAL TO
           AE |  00000403 | CYRILLIC CAPITAL LETTER GJE
           AF |  00000453 | CYRILLIC SMALL LETTER GJE
           B0 |  0000221E | INFINITY
           B1 |  000000B1 | PLUS-MINUS SIGN
           B2 |  00002264 | LESS-THAN OR EQUAL TO
           B3 |  00002265 | GREATER-THAN OR EQUAL TO
           B4 |  00000456 | CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
           B5 |  000000B5 | MICRO SIGN
           B6 |  00000491 | CYRILLIC SMALL LETTER GHE WITH UPTURN
           B7 |  00000408 | CYRILLIC CAPITAL LETTER JE
           B8 |  00000404 | CYRILLIC CAPITAL LETTER UKRAINIAN IE
           B9 |  00000454 | CYRILLIC SMALL LETTER UKRAINIAN IE
           BA |  00000407 | CYRILLIC CAPITAL LETTER YI
           BB |  00000457 | CYRILLIC SMALL LETTER YI
           BC |  00000409 | CYRILLIC CAPITAL LETTER LJE
           BD |  00000459 | CYRILLIC SMALL LETTER LJE
           BE |  0000040A | CYRILLIC CAPITAL LETTER NJE
           BF |  0000045A | CYRILLIC SMALL LETTER NJE
           C0 |  00000458 | CYRILLIC SMALL LETTER JE
           C1 |  00000405 | CYRILLIC CAPITAL LETTER DZE
           C2 |  000000AC | NOT SIGN
           C3 |  0000221A | SQUARE ROOT
           C4 |  00000192 | LATIN SMALL LETTER F WITH HOOK
           C5 |  00002248 | ALMOST EQUAL TO
           C6 |  00002206 | INCREMENT
           C7 |  000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
           C8 |  000000BB | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
           C9 |  00002026 | HORIZONTAL ELLIPSIS
           CA |  000000A0 | NO-BREAK SPACE
           CB |  0000040B | CYRILLIC CAPITAL LETTER TSHE
           CC |  0000045B | CYRILLIC SMALL LETTER TSHE
           CD |  0000040C | CYRILLIC CAPITAL LETTER KJE
           CE |  0000045C | CYRILLIC SMALL LETTER KJE
           CF |  00000455 | CYRILLIC SMALL LETTER DZE
           D0 |  00002013 | EN DASH
           D1 |  00002014 | EM DASH
           D2 |  0000201C | LEFT DOUBLE QUOTATION MARK
           D3 |  0000201D | RIGHT DOUBLE QUOTATION MARK
           D4 |  00002018 | LEFT SINGLE QUOTATION MARK
           D5 |  00002019 | RIGHT SINGLE QUOTATION MARK
           D6 |  000000F7 | DIVISION SIGN
           D7 |  0000201E | DOUBLE LOW-9 QUOTATION MARK
           D8 |  0000040E | CYRILLIC CAPITAL LETTER SHORT U
           D9 |  0000045E | CYRILLIC SMALL LETTER SHORT U
           DA |  0000040F | CYRILLIC CAPITAL LETTER DZHE
           DB |  0000045F | CYRILLIC SMALL LETTER DZHE
           DC |  00002116 | NUMERO SIGN
           DD |  00000401 | CYRILLIC CAPITAL LETTER IO
           DE |  00000451 | CYRILLIC SMALL LETTER IO
           DF |  0000044F | CYRILLIC SMALL LETTER YA

And then E0 onward it's full lowercase-Cyrillic main character energy πŸ‘‘ CYRILLIC SMALL LETTER A through CYRILLIC SMALL LETTER U and beyond, running right up to F3 β€” which is where this part of the page hands things off to whatever comes next 🫢

           E0 |  00000430 | CYRILLIC SMALL LETTER A
           E1 |  00000431 | CYRILLIC SMALL LETTER BE
           E2 |  00000432 | CYRILLIC SMALL LETTER VE
           E3 |  00000433 | CYRILLIC SMALL LETTER GHE
           E4 |  00000434 | CYRILLIC SMALL LETTER DE
           E5 |  00000435 | CYRILLIC SMALL LETTER IE
           E6 |  00000436 | CYRILLIC SMALL LETTER ZHE
           E7 |  00000437 | CYRILLIC SMALL LETTER ZE
           E8 |  00000438 | CYRILLIC SMALL LETTER I
           E9 |  00000439 | CYRILLIC SMALL LETTER SHORT I
           EA |  0000043A | CYRILLIC SMALL LETTER KA
           EB |  0000043B | CYRILLIC SMALL LETTER EL
           EC |  0000043C | CYRILLIC SMALL LETTER EM
           ED |  0000043D | CYRILLIC SMALL LETTER EN
           EE |  0000043E | CYRILLIC SMALL LETTER O
           EF |  0000043F | CYRILLIC SMALL LETTER PE
           F0 |  00000440 | CYRILLIC SMALL LETTER ER
           F1 |  00000441 | CYRILLIC SMALL LETTER ES
           F2 |  00000442 | CYRILLIC SMALL LETTER TE
           F3 |  00000443 | CYRILLIC SMALL LETTER U

...and we're picking right back up mid-table, bestie β€” the Cyrillic block is almost done, just these last few queens left πŸ‘‘πŸ’…

F4 |  00000444 | CYRILLIC SMALL LETTER EF
F5 |  00000445 | CYRILLIC SMALL LETTER HA
F6 |  00000446 | CYRILLIC SMALL LETTER TSE
F7 |  00000447 | CYRILLIC SMALL LETTER CHE
F8 |  00000448 | CYRILLIC SMALL LETTER SHA
F9 |  00000449 | CYRILLIC SMALL LETTER SHCHA
FA |  0000044A | CYRILLIC SMALL LETTER HARD SIGN
FB |  0000044B | CYRILLIC SMALL LETTER YERU
FC |  0000044C | CYRILLIC SMALL LETTER SOFT SIGN
FD |  0000044D | CYRILLIC SMALL LETTER E
FE |  0000044E | CYRILLIC SMALL LETTER YU
FF |  000000A4 | CURRENCY SIGN

okay so look at that last one 😭 FF just casually dips out of the Cyrillic alphabet and lands on CURRENCY SIGN (000000A4) β€” like ma'am, this is a Cyrillic block, what are you doing here?? > not me questioning the code page design decisions, fr fr, that's just how it is πŸ’€

And that's the whole character table, start to finish β€” every last byte accounted for, no crumbs left behind βœ¨πŸ¦‹


πŸ’– AUTHOR πŸ’–

Copyright (C) 2002-2017 Guido Flohr <http://www.guido-flohr.net/> (<mailto:guido.flohr@cantanea.com>), all rights reserved. See the source code for details!

and yes, the original really does say it twice, like "See the source code for details!code for details!" 😭 β€” that's a little copy-paste moment from the source page itself, and we're keeping it verbatim because facts are facts, bestie πŸ’…


πŸŽ€ SEE ALSO πŸŽ€

go read those if you wanna go deeper β€” the lore is there, iykyk 🌈⭐


okay that's the whole page, we ate and left absolutely zero crumbs πŸ“βœ¨ this was Locale:...:CP10007(3), shipped with perl v5.42.0 and dated 2025-01-22 β€” go forth and decode your Cyrillic bytes, main character πŸ«ΆπŸ’œ