diff --git a/Lib/test/test_ucn.py b/Lib/test/test_ucn.py index 7821a41ea..2a4496769 100644 --- a/Lib/test/test_ucn.py +++ b/Lib/test/test_ucn.py @@ -149,7 +149,6 @@ class UnicodeNamesTest(unittest.TestCase): self.checkletter("HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK", "\uFF9F") self.checkletter("FULLWIDTH LATIN SMALL LETTER A", "\uFF41") - @unittest.expectedFailure # TODO: RUSTPYTHON def test_aliases(self): # Check that the aliases defined in the NameAliases.txt file work. # This should be updated when new aliases are added or the file @@ -190,7 +189,6 @@ class UnicodeNamesTest(unittest.TestCase): unicodedata.name(chr(cp)) self.assertEqual(str(cm.exception), 'no such name') - @unittest.expectedFailure # TODO: RUSTPYTHON def test_named_sequences_sample(self): # Check a few named sequences. See #12753. sequences = [ @@ -207,7 +205,6 @@ class UnicodeNamesTest(unittest.TestCase): with self.assertRaises(KeyError): unicodedata.ucd_3_2_0.lookup(seqname) - @unittest.expectedFailure # TODO: RUSTPYTHON def test_named_sequences_full(self): # Check all the named sequences def check_version(testfile): diff --git a/crates/stdlib/src/unicodedata.rs b/crates/stdlib/src/unicodedata.rs index 122807234..3a7bdb71c 100644 --- a/crates/stdlib/src/unicodedata.rs +++ b/crates/stdlib/src/unicodedata.rs @@ -101,10 +101,12 @@ mod unicodedata { #[pymethod] fn lookup(&self, name: PyStrRef, vm: &VirtualMachine) -> PyResult { if let Some(name_str) = name.to_str() - && let Some(character) = unicode_core::lookup_character(name_str) - && self.inner.membership(character) + && let Some(found) = self.inner.lookup(name_str) { - return Ok(character.to_string()); + return Ok(match found { + unicode_core::LookupResult::Character(ch) => ch.to_string(), + unicode_core::LookupResult::Sequence(seq) => seq.to_string(), + }); } Err(vm.new_key_error( vm.ctx diff --git a/crates/unicode/build.rs b/crates/unicode/build.rs index 15e001dbd..aaf70b91e 100644 --- a/crates/unicode/build.rs +++ b/crates/unicode/build.rs @@ -221,6 +221,7 @@ fn full_data_parsers_latest() { generate_decomp(decomp_lines); generate_algo_names(algo_names); + generate_name_lookups(); } fn generate_decomp(decomp_lines: Vec<(u32, String)>) { @@ -340,6 +341,78 @@ fn generate_algo_names(names: Vec<(u32, Box)>) { ); } +/// Formal name aliases (`NameAliases.txt`) and named sequences +/// (`NamedSequences.txt`). `unicodedata.lookup` consults both; `\N{}` +/// accepts only a single character, so named sequences stay out of +/// `lookup_character`. +fn generate_name_lookups() { + let mut aliases: Vec<(String, u32)> = Vec::new(); + for line in UnicodeLineReader::from_file_name("NameAliases.txt", true) { + let name = line + .field( + NonZeroUsize::new(1).unwrap(), + Some(&format!( + "field 1 (alias) missing from NameAliases.txt: {}", + line.line + )), + ) + .to_ascii_uppercase(); + aliases.push((name, line.start)); + } + aliases.sort_unstable_by(|a, b| a.0.cmp(&b.0)); + aliases.dedup_by(|a, b| a.0 == b.0); + + let mut sequences: Vec<(String, String)> = Vec::new(); + let path = Path::new(env!("CARGO_MANIFEST_DIR")) + .join("unicode") + .join("latest") + .join("NamedSequences.txt"); + let file = File::open(&path).unwrap_or_else(|e| { + panic!( + "{e}: vendored Unicode data file should exist: {}", + path.display() + ) + }); + for raw in BufReader::new(file).lines() { + let raw = raw.unwrap(); + let line = raw.trim(); + if line.is_empty() || line.starts_with('#') { + continue; + } + let (name, codes) = line + .split_once(';') + .unwrap_or_else(|| panic!("NamedSequences.txt line should be `NAME; HEX HEX`: {line}")); + let name = name.trim().to_ascii_uppercase(); + let mut escaped = String::new(); + for hex in codes.split_whitespace() { + let cp = u32::from_str_radix(hex, 16).unwrap_or_else(|e| { + panic!("NamedSequences.txt code point should be hex: {hex} ({e})") + }); + escaped.push_str("\\u{"); + escaped.push_str(&format!("{cp:X}")); + escaped.push('}'); + } + sequences.push((name, escaped)); + } + sequences.sort_unstable_by(|a, b| a.0.cmp(&b.0)); + sequences.dedup_by(|a, b| a.0 == b.0); + + let mut writer = open_writer("name_lookups.rs"); + writeln!(writer, "static NAME_ALIASES: &[(&str, char)] = &[").unwrap(); + for (name, code) in &aliases { + let ch = char::from_u32(*code) + .unwrap_or_else(|| panic!("NameAliases.txt code point should be a scalar: {code:04X}")); + writeln!(writer, " (\"{name}\", '\\u{{{:X}}}'),", ch as u32).unwrap(); + } + writeln!(writer, "];").unwrap(); + + writeln!(writer, "static NAMED_SEQUENCES: &[(&str, &str)] = &[").unwrap(); + for (name, escaped) in &sequences { + writeln!(writer, " (\"{name}\", \"{escaped}\"),").unwrap(); + } + writeln!(writer, "];").unwrap(); +} + /// Drive parsers that require the full 3.2.0 data. /// /// As the full data set is HUGE, it's more efficient to parse it once then delegate to subparsers. diff --git a/crates/unicode/src/data.rs b/crates/unicode/src/data.rs index a3dd05991..381a180a4 100644 --- a/crates/unicode/src/data.rs +++ b/crates/unicode/src/data.rs @@ -20,6 +20,7 @@ use icu_properties::props::{ use rustpython_wtf8::CodePoint; include!(concat!(env!("OUT_DIR"), "/generated/algo_names.rs")); +include!(concat!(env!("OUT_DIR"), "/generated/name_lookups.rs")); include!(concat!(env!("OUT_DIR"), "/generated/bidi_class_3_2.rs")); include!(concat!(env!("OUT_DIR"), "/generated/binary_props_3_2.rs")); include!(concat!( @@ -95,8 +96,20 @@ impl AlgorithmicName { } fn check_name(search_name: &str) -> Option { - if let Some(without_base) = search_name.strip_prefix(Self::TangutIdeograph.name_base()) { - let cp = u32::from_str_radix(without_base.strip_prefix('-')?.trim(), 16).ok()?; + // CPython compares derived-name prefixes case-insensitively + // (`PyOS_strnicmp` in `_getcode`). + let folded: String = search_name + .chars() + .map(|c| c.to_ascii_uppercase()) + .collect(); + if let Some(without_base) = folded.strip_prefix(Self::TangutIdeograph.name_base()) { + // `parse_hex_code` does not skip spaces around the digits. + let hex = without_base.strip_prefix('-')?; + // `_getcode` / `parse_hex_code`: 4–6 digits, no leading zero. + if hex.len() < 4 || hex.len() > 6 || hex.starts_with('0') { + return None; + } + let cp = u32::from_str_radix(hex, 16).ok()?; let ch = char::from_u32(cp)?; if lookup_table(ALGO_NAMES, ch)? == Self::TangutIdeograph { return Some(ch); @@ -107,6 +120,36 @@ impl AlgorithmicName { } } +/// Result of `unicodedata.lookup`. +/// +/// A named sequence is several characters; `\N{...}` only accepts a +/// single character, so `lookup_character` drops `Sequence`. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum LookupResult { + Character(char), + Sequence(&'static str), +} + +fn fold_lookup_name(name: &str) -> String { + name.chars().map(|c| c.to_ascii_uppercase()).collect() +} + +fn lookup_alias(name: &str) -> Option { + let key = fold_lookup_name(name); + NAME_ALIASES + .binary_search_by_key(&key.as_str(), |(n, _)| *n) + .ok() + .map(|i| NAME_ALIASES[i].1) +} + +fn lookup_named_sequence(name: &str) -> Option<&'static str> { + let key = fold_lookup_name(name); + NAMED_SEQUENCES + .binary_search_by_key(&key.as_str(), |(n, _)| *n) + .ok() + .map(|i| NAMED_SEQUENCES[i].1) +} + fn lookup_table(table: &[(u32, u32, T)], ch: char) -> Option { let ch = ch as u32; table @@ -170,10 +213,24 @@ pub fn unicode_version() -> String { ) } -/// Look up a character by its Unicode name (`unicodedata.lookup`). +/// Look up a name in the latest UCD (`unicodedata.lookup`). +/// +/// Named sequences are included; `\N{...}` should use [`lookup_character`] +/// so a sequence is reported as unknown. +#[must_use] +pub fn lookup_name(search_name: &str) -> Option { + Ucd::new(true).lookup(search_name) +} + +/// Look up a single character by its Unicode name (`\N{...}`). +/// +/// Named sequences are not characters and so do not resolve. #[must_use] pub fn lookup_character(search_name: &str) -> Option { - unicode_names2::character(search_name).or_else(|| AlgorithmicName::check_name(search_name)) + match lookup_name(search_name) { + Some(LookupResult::Character(ch)) => Some(ch), + Some(LookupResult::Sequence(_)) | None => None, + } } /// The Unicode name of `ch` (`unicodedata.name`), if any. @@ -210,6 +267,26 @@ impl Ucd { } } + /// Look up `name` in this UCD view. + /// + /// Unicode 3.2.0 has no name aliases and no named sequences + /// (`unicodedata.ucd_3_2_0.lookup`). + #[must_use] + pub fn lookup(self, search_name: &str) -> Option { + if let Some(ch) = unicode_names2::character(search_name) + .or_else(|| AlgorithmicName::check_name(search_name)) + { + return self.membership(ch).then_some(LookupResult::Character(ch)); + } + if !self.modern { + return None; + } + if let Some(ch) = lookup_alias(search_name) { + return Some(LookupResult::Character(ch)); + } + lookup_named_sequence(search_name).map(LookupResult::Sequence) + } + #[must_use] pub fn category(&self, c: CodePoint) -> &'static str { let Some(c) = c.to_char() else { @@ -414,7 +491,7 @@ impl Ucd { mod tests { use rustpython_wtf8::CodePoint; - use super::{Ucd, character_name, lookup_character}; + use super::{LookupResult, Ucd, character_name, lookup_character, lookup_name}; fn cp(ch: char) -> CodePoint { CodePoint::from(ch) @@ -438,4 +515,56 @@ mod tests { let legacy = Ucd::new(false); assert_eq!(legacy.unidata_version(), "3.2.0"); } + + #[test] + fn name_aliases_resolve_and_do_not_replace_the_official_name() { + assert_eq!( + lookup_character("LATIN CAPITAL LETTER GHA"), + Some('\u{01A2}') + ); + assert_eq!( + lookup_character("latin capital letter gha"), + Some('\u{01A2}') + ); + assert_eq!( + character_name('\u{01A2}').as_deref(), + Some("LATIN CAPITAL LETTER OI") + ); + assert_eq!(Ucd::new(false).lookup("LATIN CAPITAL LETTER GHA"), None); + } + + #[test] + fn named_sequences_resolve_only_on_the_modern_view() { + assert_eq!( + lookup_name("LATIN SMALL LETTER R WITH TILDE"), + Some(LookupResult::Sequence("r\u{0303}")) + ); + assert_eq!( + lookup_name("KEYCAP NUMBER SIGN"), + Some(LookupResult::Sequence("#\u{FE0F}\u{20E3}")) + ); + assert_eq!(lookup_character("LATIN SMALL LETTER R WITH TILDE"), None); + assert_eq!( + Ucd::new(false).lookup("LATIN SMALL LETTER R WITH TILDE"), + None + ); + } + + #[test] + fn tangut_derived_names_are_case_insensitive() { + assert_eq!( + lookup_character("TANGUT IDEOGRAPH-17000"), + Some('\u{17000}') + ); + assert_eq!( + lookup_character("tangut ideograph-18d08"), + Some('\u{18D08}') + ); + assert_eq!( + character_name('\u{17000}').as_deref(), + Some("TANGUT IDEOGRAPH-17000") + ); + assert_eq!(lookup_character("TANGUT IDEOGRAPH- 17000"), None); + assert_eq!(lookup_character("TANGUT IDEOGRAPH-17000 "), None); + } } diff --git a/crates/unicode/src/lib.rs b/crates/unicode/src/lib.rs index a3f3eceb1..319271b01 100644 --- a/crates/unicode/src/lib.rs +++ b/crates/unicode/src/lib.rs @@ -15,5 +15,5 @@ pub mod data; pub mod identifier; pub mod normalize; -pub use data::{Ucd, character_name, lookup_character, unicode_version}; +pub use data::{LookupResult, Ucd, character_name, lookup_character, lookup_name, unicode_version}; pub use normalize::{NormalizeForm, is_normalized, normalize}; diff --git a/crates/unicode/unicode/README.md b/crates/unicode/unicode/README.md index 894db3c4e..fa77fb426 100644 --- a/crates/unicode/unicode/README.md +++ b/crates/unicode/unicode/README.md @@ -4,4 +4,6 @@ The vendored data files come directly from the official [Unicode site](https://w The files in `latest` need to be periodically bumped to match `icu4x` and Rust. These files may be found at the [Unicode Character Database](https://www.unicode.org/ucd/). +`NameAliases.txt` and `NamedSequences.txt` feed `unicodedata.lookup` (formal aliases and named sequences). They are not used by `unicodedata.name`, which still reports the official character name. + RustPython vendors [Unicode 3.2.0](https://www.unicode.org/reports/tr28/tr28-3.html) to match CPython. CPython uses 3.2.0 to ensure backwards compatibility with a few older modules. Unicode 3.2.0 was released in 2002 and does not need periodic refreshes. diff --git a/crates/unicode/unicode/latest/NameAliases.txt b/crates/unicode/unicode/latest/NameAliases.txt new file mode 100644 index 000000000..09df7d666 --- /dev/null +++ b/crates/unicode/unicode/latest/NameAliases.txt @@ -0,0 +1,579 @@ +# NameAliases-17.0.0.txt +# Date: 2025-04-23 +# © 2025 Unicode®, Inc. +# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +# For terms of use and license, see https://www.unicode.org/terms_of_use.html +# +# Unicode Character Database +# For documentation, see https://www.unicode.org/reports/tr44/ +# +# This file is a normative contributory data file in the +# Unicode Character Database. +# +# This file defines the formal name aliases for Unicode characters. +# +# For informative aliases, see NamesList.txt +# +# The formal name aliases are divided into five types, each with a distinct label. +# +# Type Labels: +# +# 1. correction +# Corrections for serious problems in the character names +# 2. control +# ISO 6429 names for C0 and C1 control functions, and other +# commonly occurring names for control codes +# 3. alternate +# A few widely used alternate names for format characters +# 4. figment +# Several documented labels for C1 control code points which +# were never actually approved in any standard +# 5. abbreviation +# Commonly occurring abbreviations (or acronyms) for control codes, +# format characters, spaces, and variation selectors +# +# The formal name aliases are part of the Unicode character namespace, which +# includes the character names and the names of named character sequences. +# The inclusion of ISO 6429 names and other commonly occurring names and +# abbreviations for control codes and format characters as formal name aliases +# is to help avoid name collisions between Unicode character names and the +# labels which commonly appear in text and/or in implementations such as regex, for +# control codes (which for historical reasons have no Unicode character name) +# or for format characters. +# +# For documentation, see NamesList.html and https://www.unicode.org/reports/tr44/ +# +# FORMAT +# +# Each line has three fields, as described here: +# +# First field: Code point +# Second field: Alias +# Third field: Type +# +# The type labels used are defined above. As for property values, comparisons +# of type labels should ignore case. +# +# The type labels can be mapped to other strings for display, if desired. +# +# In case multiple aliases are assigned, additional aliases +# are provided on separate lines. Parsers of this data file should +# take note that the same code point can (and does) occur more than once. +# +# Note that currently the only instances of multiple aliases of the same +# type for a single code point are either of type "control" or "abbreviation". +# An alias of type "abbreviation" can, in principle, be added for any code +# point, although currently aliases of type "correction" do not have +# any additional aliases of type "abbreviation". Such relationships +# are not enforced by stability policies. +# +#----------------------------------------------------------------- + +0000;NULL;control +0000;NUL;abbreviation +0001;START OF HEADING;control +0001;SOH;abbreviation +0002;START OF TEXT;control +0002;STX;abbreviation +0003;END OF TEXT;control +0003;ETX;abbreviation +0004;END OF TRANSMISSION;control +0004;EOT;abbreviation +0005;ENQUIRY;control +0005;ENQ;abbreviation +0006;ACKNOWLEDGE;control +0006;ACK;abbreviation + +# Note that no formal name alias for the ISO 6429 "BELL" is +# provided for U+0007, because of the existing name collision +# with U+1F514 BELL. + +0007;ALERT;control +0007;BEL;abbreviation + +0008;BACKSPACE;control +0008;BS;abbreviation +0009;CHARACTER TABULATION;control +0009;HORIZONTAL TABULATION;control +0009;HT;abbreviation +0009;TAB;abbreviation +000A;LINE FEED;control +000A;NEW LINE;control +000A;END OF LINE;control +000A;LF;abbreviation +000A;NL;abbreviation +000A;EOL;abbreviation +000B;LINE TABULATION;control +000B;VERTICAL TABULATION;control +000B;VT;abbreviation +000C;FORM FEED;control +000C;FF;abbreviation +000D;CARRIAGE RETURN;control +000D;CR;abbreviation +000E;SHIFT OUT;control +000E;LOCKING-SHIFT ONE;control +000E;SO;abbreviation +000F;SHIFT IN;control +000F;LOCKING-SHIFT ZERO;control +000F;SI;abbreviation +0010;DATA LINK ESCAPE;control +0010;DLE;abbreviation +0011;DEVICE CONTROL ONE;control +0011;DC1;abbreviation +0012;DEVICE CONTROL TWO;control +0012;DC2;abbreviation +0013;DEVICE CONTROL THREE;control +0013;DC3;abbreviation +0014;DEVICE CONTROL FOUR;control +0014;DC4;abbreviation +0015;NEGATIVE ACKNOWLEDGE;control +0015;NAK;abbreviation +0016;SYNCHRONOUS IDLE;control +0016;SYN;abbreviation +0017;END OF TRANSMISSION BLOCK;control +0017;ETB;abbreviation +0018;CANCEL;control +0018;CAN;abbreviation +0019;END OF MEDIUM;control +0019;EOM;abbreviation +0019;EM;abbreviation +001A;SUBSTITUTE;control +001A;SUB;abbreviation +001B;ESCAPE;control +001B;ESC;abbreviation +001C;INFORMATION SEPARATOR FOUR;control +001C;FILE SEPARATOR;control +001C;FS;abbreviation +001D;INFORMATION SEPARATOR THREE;control +001D;GROUP SEPARATOR;control +001D;GS;abbreviation +001E;INFORMATION SEPARATOR TWO;control +001E;RECORD SEPARATOR;control +001E;RS;abbreviation +001F;INFORMATION SEPARATOR ONE;control +001F;UNIT SEPARATOR;control +001F;US;abbreviation +0020;SP;abbreviation +007F;DELETE;control +007F;DEL;abbreviation + +# PADDING CHARACTER and HIGH OCTET PRESET represent +# architectural concepts initially proposed for early +# drafts of ISO/IEC 10646-1. They were never actually +# approved or standardized: hence their designation +# here as the "figment" type. Formal name aliases +# (and corresponding abbreviations) for these code +# points are included here because these names leaked +# out from the draft documents and were published in +# at least one RFC whose names for code points were +# implemented in Perl regex expressions. + +0080;PADDING CHARACTER;figment +0080;PAD;abbreviation +0081;HIGH OCTET PRESET;figment +0081;HOP;abbreviation + +0082;BREAK PERMITTED HERE;control +0082;BPH;abbreviation +0083;NO BREAK HERE;control +0083;NBH;abbreviation +0084;INDEX;control +0084;IND;abbreviation +0085;NEXT LINE;control +0085;NEL;abbreviation +0086;START OF SELECTED AREA;control +0086;SSA;abbreviation +0087;END OF SELECTED AREA;control +0087;ESA;abbreviation +0088;CHARACTER TABULATION SET;control +0088;HORIZONTAL TABULATION SET;control +0088;HTS;abbreviation +0089;CHARACTER TABULATION WITH JUSTIFICATION;control +0089;HORIZONTAL TABULATION WITH JUSTIFICATION;control +0089;HTJ;abbreviation +008A;LINE TABULATION SET;control +008A;VERTICAL TABULATION SET;control +008A;VTS;abbreviation +008B;PARTIAL LINE FORWARD;control +008B;PARTIAL LINE DOWN;control +008B;PLD;abbreviation +008C;PARTIAL LINE BACKWARD;control +008C;PARTIAL LINE UP;control +008C;PLU;abbreviation +008D;REVERSE LINE FEED;control +008D;REVERSE INDEX;control +008D;RI;abbreviation +008E;SINGLE SHIFT TWO;control +008E;SINGLE-SHIFT-2;control +008E;SS2;abbreviation +008F;SINGLE SHIFT THREE;control +008F;SINGLE-SHIFT-3;control +008F;SS3;abbreviation +0090;DEVICE CONTROL STRING;control +0090;DCS;abbreviation +0091;PRIVATE USE ONE;control +0091;PRIVATE USE-1;control +0091;PU1;abbreviation +0092;PRIVATE USE TWO;control +0092;PRIVATE USE-2;control +0092;PU2;abbreviation +0093;SET TRANSMIT STATE;control +0093;STS;abbreviation +0094;CANCEL CHARACTER;control +0094;CCH;abbreviation +0095;MESSAGE WAITING;control +0095;MW;abbreviation +0096;START OF GUARDED AREA;control +0096;START OF PROTECTED AREA;control +0096;SPA;abbreviation +0097;END OF GUARDED AREA;control +0097;END OF PROTECTED AREA;control +0097;EPA;abbreviation +0098;START OF STRING;control +0098;SOS;abbreviation + +# SINGLE GRAPHIC CHARACTER INTRODUCER is another +# architectural concept from early drafts of ISO/IEC 10646-1 +# which was never approved and standardized. + +0099;SINGLE GRAPHIC CHARACTER INTRODUCER;figment +0099;SGC;abbreviation + +009A;SINGLE CHARACTER INTRODUCER;control +009A;SCI;abbreviation +009B;CONTROL SEQUENCE INTRODUCER;control +009B;CSI;abbreviation +009C;STRING TERMINATOR;control +009C;ST;abbreviation +009D;OPERATING SYSTEM COMMAND;control +009D;OSC;abbreviation +009E;PRIVACY MESSAGE;control +009E;PM;abbreviation +009F;APPLICATION PROGRAM COMMAND;control +009F;APC;abbreviation +00A0;NBSP;abbreviation +00AD;SHY;abbreviation +01A2;LATIN CAPITAL LETTER GHA;correction +01A3;LATIN SMALL LETTER GHA;correction +034F;CGJ;abbreviation +0616;ARABIC SMALL HIGH LIGATURE ALEF WITH YEH BARREE;correction +061C;ALM;abbreviation +0709;SYRIAC SUBLINEAR COLON SKEWED LEFT;correction +0CDE;KANNADA LETTER LLLA;correction +0E9D;LAO LETTER FO FON;correction +0E9F;LAO LETTER FO FAY;correction +0EA3;LAO LETTER RO;correction +0EA5;LAO LETTER LO;correction +0FD0;TIBETAN MARK BKA- SHOG GI MGO RGYAN;correction +11EC;HANGUL JONGSEONG YESIEUNG-KIYEOK;correction +11ED;HANGUL JONGSEONG YESIEUNG-SSANGKIYEOK;correction +11EE;HANGUL JONGSEONG SSANGYESIEUNG;correction +11EF;HANGUL JONGSEONG YESIEUNG-KHIEUKH;correction +180B;FVS1;abbreviation +180C;FVS2;abbreviation +180D;FVS3;abbreviation +180E;MVS;abbreviation +180F;FVS4;abbreviation +1BBD;SUNDANESE LETTER ARCHAIC I;correction +200B;ZWSP;abbreviation +200C;ZWNJ;abbreviation +200D;ZWJ;abbreviation +200E;LRM;abbreviation +200F;RLM;abbreviation +202A;LRE;abbreviation +202B;RLE;abbreviation +202C;PDF;abbreviation +202D;LRO;abbreviation +202E;RLO;abbreviation +202F;NNBSP;abbreviation +205F;MMSP;abbreviation +2060;WJ;abbreviation +2066;LRI;abbreviation +2067;RLI;abbreviation +2068;FSI;abbreviation +2069;PDI;abbreviation +2118;WEIERSTRASS ELLIPTIC FUNCTION;correction +2448;MICR ON US SYMBOL;correction +2449;MICR DASH SYMBOL;correction +2B7A;LEFTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE VERTICAL STROKE;correction +2B7C;RIGHTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE VERTICAL STROKE;correction +A015;YI SYLLABLE ITERATION MARK;correction +AA6E;MYANMAR LETTER KHAMTI LLA;correction +FE00;VS1;abbreviation +FE01;VS2;abbreviation +FE02;VS3;abbreviation +FE03;VS4;abbreviation +FE04;VS5;abbreviation +FE05;VS6;abbreviation +FE06;VS7;abbreviation +FE07;VS8;abbreviation +FE08;VS9;abbreviation +FE09;VS10;abbreviation +FE0A;VS11;abbreviation +FE0B;VS12;abbreviation +FE0C;VS13;abbreviation +FE0D;VS14;abbreviation +FE0E;VS15;abbreviation +FE0F;VS16;abbreviation +FE18;PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRACKET;correction +FEFF;BYTE ORDER MARK;alternate +FEFF;BOM;abbreviation +FEFF;ZWNBSP;abbreviation +122D4;CUNEIFORM SIGN NU11 TENU;correction +122D5;CUNEIFORM SIGN NU11 OVER NU11 BUR OVER BUR;correction +12327;CUNEIFORM SIGN KALAM;correction +1680B;BAMUM LETTER PHASE-A MAEMGBIEE;correction +16881;BAMUM LETTER PHASE-B PUNGGAAM;correction +1688E;BAMUM LETTER PHASE-B NGGOM;correction +168DC;BAMUM LETTER PHASE-C SHETFON;correction +1697D;BAMUM LETTER PHASE-E NGGOP;correction +16E56;MEDEFAIDRIN CAPITAL LETTER H;correction +16E57;MEDEFAIDRIN CAPITAL LETTER NG;correction +16E76;MEDEFAIDRIN SMALL LETTER H;correction +16E77;MEDEFAIDRIN SMALL LETTER NG;correction +1B001;HENTAIGANA LETTER E-1;correction +1D0C5;BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA VASIS;correction +1E899;MENDE KIKAKUI SYLLABLE M172 MBO;correction +1E89A;MENDE KIKAKUI SYLLABLE M174 MBOO;correction +E0100;VS17;abbreviation +E0101;VS18;abbreviation +E0102;VS19;abbreviation +E0103;VS20;abbreviation +E0104;VS21;abbreviation +E0105;VS22;abbreviation +E0106;VS23;abbreviation +E0107;VS24;abbreviation +E0108;VS25;abbreviation +E0109;VS26;abbreviation +E010A;VS27;abbreviation +E010B;VS28;abbreviation +E010C;VS29;abbreviation +E010D;VS30;abbreviation +E010E;VS31;abbreviation +E010F;VS32;abbreviation +E0110;VS33;abbreviation +E0111;VS34;abbreviation +E0112;VS35;abbreviation +E0113;VS36;abbreviation +E0114;VS37;abbreviation +E0115;VS38;abbreviation +E0116;VS39;abbreviation +E0117;VS40;abbreviation +E0118;VS41;abbreviation +E0119;VS42;abbreviation +E011A;VS43;abbreviation +E011B;VS44;abbreviation +E011C;VS45;abbreviation +E011D;VS46;abbreviation +E011E;VS47;abbreviation +E011F;VS48;abbreviation +E0120;VS49;abbreviation +E0121;VS50;abbreviation +E0122;VS51;abbreviation +E0123;VS52;abbreviation +E0124;VS53;abbreviation +E0125;VS54;abbreviation +E0126;VS55;abbreviation +E0127;VS56;abbreviation +E0128;VS57;abbreviation +E0129;VS58;abbreviation +E012A;VS59;abbreviation +E012B;VS60;abbreviation +E012C;VS61;abbreviation +E012D;VS62;abbreviation +E012E;VS63;abbreviation +E012F;VS64;abbreviation +E0130;VS65;abbreviation +E0131;VS66;abbreviation +E0132;VS67;abbreviation +E0133;VS68;abbreviation +E0134;VS69;abbreviation +E0135;VS70;abbreviation +E0136;VS71;abbreviation +E0137;VS72;abbreviation +E0138;VS73;abbreviation +E0139;VS74;abbreviation +E013A;VS75;abbreviation +E013B;VS76;abbreviation +E013C;VS77;abbreviation +E013D;VS78;abbreviation +E013E;VS79;abbreviation +E013F;VS80;abbreviation +E0140;VS81;abbreviation +E0141;VS82;abbreviation +E0142;VS83;abbreviation +E0143;VS84;abbreviation +E0144;VS85;abbreviation +E0145;VS86;abbreviation +E0146;VS87;abbreviation +E0147;VS88;abbreviation +E0148;VS89;abbreviation +E0149;VS90;abbreviation +E014A;VS91;abbreviation +E014B;VS92;abbreviation +E014C;VS93;abbreviation +E014D;VS94;abbreviation +E014E;VS95;abbreviation +E014F;VS96;abbreviation +E0150;VS97;abbreviation +E0151;VS98;abbreviation +E0152;VS99;abbreviation +E0153;VS100;abbreviation +E0154;VS101;abbreviation +E0155;VS102;abbreviation +E0156;VS103;abbreviation +E0157;VS104;abbreviation +E0158;VS105;abbreviation +E0159;VS106;abbreviation +E015A;VS107;abbreviation +E015B;VS108;abbreviation +E015C;VS109;abbreviation +E015D;VS110;abbreviation +E015E;VS111;abbreviation +E015F;VS112;abbreviation +E0160;VS113;abbreviation +E0161;VS114;abbreviation +E0162;VS115;abbreviation +E0163;VS116;abbreviation +E0164;VS117;abbreviation +E0165;VS118;abbreviation +E0166;VS119;abbreviation +E0167;VS120;abbreviation +E0168;VS121;abbreviation +E0169;VS122;abbreviation +E016A;VS123;abbreviation +E016B;VS124;abbreviation +E016C;VS125;abbreviation +E016D;VS126;abbreviation +E016E;VS127;abbreviation +E016F;VS128;abbreviation +E0170;VS129;abbreviation +E0171;VS130;abbreviation +E0172;VS131;abbreviation +E0173;VS132;abbreviation +E0174;VS133;abbreviation +E0175;VS134;abbreviation +E0176;VS135;abbreviation +E0177;VS136;abbreviation +E0178;VS137;abbreviation +E0179;VS138;abbreviation +E017A;VS139;abbreviation +E017B;VS140;abbreviation +E017C;VS141;abbreviation +E017D;VS142;abbreviation +E017E;VS143;abbreviation +E017F;VS144;abbreviation +E0180;VS145;abbreviation +E0181;VS146;abbreviation +E0182;VS147;abbreviation +E0183;VS148;abbreviation +E0184;VS149;abbreviation +E0185;VS150;abbreviation +E0186;VS151;abbreviation +E0187;VS152;abbreviation +E0188;VS153;abbreviation +E0189;VS154;abbreviation +E018A;VS155;abbreviation +E018B;VS156;abbreviation +E018C;VS157;abbreviation +E018D;VS158;abbreviation +E018E;VS159;abbreviation +E018F;VS160;abbreviation +E0190;VS161;abbreviation +E0191;VS162;abbreviation +E0192;VS163;abbreviation +E0193;VS164;abbreviation +E0194;VS165;abbreviation +E0195;VS166;abbreviation +E0196;VS167;abbreviation +E0197;VS168;abbreviation +E0198;VS169;abbreviation +E0199;VS170;abbreviation +E019A;VS171;abbreviation +E019B;VS172;abbreviation +E019C;VS173;abbreviation +E019D;VS174;abbreviation +E019E;VS175;abbreviation +E019F;VS176;abbreviation +E01A0;VS177;abbreviation +E01A1;VS178;abbreviation +E01A2;VS179;abbreviation +E01A3;VS180;abbreviation +E01A4;VS181;abbreviation +E01A5;VS182;abbreviation +E01A6;VS183;abbreviation +E01A7;VS184;abbreviation +E01A8;VS185;abbreviation +E01A9;VS186;abbreviation +E01AA;VS187;abbreviation +E01AB;VS188;abbreviation +E01AC;VS189;abbreviation +E01AD;VS190;abbreviation +E01AE;VS191;abbreviation +E01AF;VS192;abbreviation +E01B0;VS193;abbreviation +E01B1;VS194;abbreviation +E01B2;VS195;abbreviation +E01B3;VS196;abbreviation +E01B4;VS197;abbreviation +E01B5;VS198;abbreviation +E01B6;VS199;abbreviation +E01B7;VS200;abbreviation +E01B8;VS201;abbreviation +E01B9;VS202;abbreviation +E01BA;VS203;abbreviation +E01BB;VS204;abbreviation +E01BC;VS205;abbreviation +E01BD;VS206;abbreviation +E01BE;VS207;abbreviation +E01BF;VS208;abbreviation +E01C0;VS209;abbreviation +E01C1;VS210;abbreviation +E01C2;VS211;abbreviation +E01C3;VS212;abbreviation +E01C4;VS213;abbreviation +E01C5;VS214;abbreviation +E01C6;VS215;abbreviation +E01C7;VS216;abbreviation +E01C8;VS217;abbreviation +E01C9;VS218;abbreviation +E01CA;VS219;abbreviation +E01CB;VS220;abbreviation +E01CC;VS221;abbreviation +E01CD;VS222;abbreviation +E01CE;VS223;abbreviation +E01CF;VS224;abbreviation +E01D0;VS225;abbreviation +E01D1;VS226;abbreviation +E01D2;VS227;abbreviation +E01D3;VS228;abbreviation +E01D4;VS229;abbreviation +E01D5;VS230;abbreviation +E01D6;VS231;abbreviation +E01D7;VS232;abbreviation +E01D8;VS233;abbreviation +E01D9;VS234;abbreviation +E01DA;VS235;abbreviation +E01DB;VS236;abbreviation +E01DC;VS237;abbreviation +E01DD;VS238;abbreviation +E01DE;VS239;abbreviation +E01DF;VS240;abbreviation +E01E0;VS241;abbreviation +E01E1;VS242;abbreviation +E01E2;VS243;abbreviation +E01E3;VS244;abbreviation +E01E4;VS245;abbreviation +E01E5;VS246;abbreviation +E01E6;VS247;abbreviation +E01E7;VS248;abbreviation +E01E8;VS249;abbreviation +E01E9;VS250;abbreviation +E01EA;VS251;abbreviation +E01EB;VS252;abbreviation +E01EC;VS253;abbreviation +E01ED;VS254;abbreviation +E01EE;VS255;abbreviation +E01EF;VS256;abbreviation + +# EOF diff --git a/crates/unicode/unicode/latest/NamedSequences.txt b/crates/unicode/unicode/latest/NamedSequences.txt new file mode 100644 index 000000000..378bf4a9e --- /dev/null +++ b/crates/unicode/unicode/latest/NamedSequences.txt @@ -0,0 +1,613 @@ +# NamedSequences-17.0.0.txt +# Date: 2025-07-30 +# © 2025 Unicode®, Inc. +# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +# For terms of use and license, see https://www.unicode.org/terms_of_use.html +# +# Unicode Character Database +# For documentation, see https://www.unicode.org/reports/tr44/ +# +# Unicode Named Character Sequences +# +# This file is a normative contributory data file in the Unicode +# Character Database. +# +# Format: +# Name of Sequence; Code Point Sequence for USI +# +# Code point sequences in the Unicode Character Database +# use spaces as delimiters. The corresponding format for a +# UCS Sequence Identifier (USI) in ISO/IEC 10646 uses +# comma delimitation and angle brackets. Thus, a Unicode +# named character sequence of the form: +# +# EXAMPLE NAME;1000 1001 1002 +# +# in this data file, would correspond to an ISO/IEC 10646 USI +# as follows: +# +# <1000, 1001, 1002> +# +# For more information, see UAX #34: Unicode Named Character +# Sequences, at https://www.unicode.org/reports/tr34/ +# +# Note: The order of entries in this file is not significant. +# However, entries are generally in script order corresponding +# to block order in the Unicode Standard, to make it easier +# to find entries in the list. + +# ================================================ + +# Named keycap sequences for telephone keypad (used for emoji) +# Provisional, 2015-05-05 +# FE0F added to the sequences, 2016-05-11 +# Approved 2017-05-12 + +KEYCAP NUMBER SIGN;0023 FE0F 20E3 +KEYCAP ASTERISK;002A FE0F 20E3 +KEYCAP DIGIT ZERO;0030 FE0F 20E3 +KEYCAP DIGIT ONE;0031 FE0F 20E3 +KEYCAP DIGIT TWO;0032 FE0F 20E3 +KEYCAP DIGIT THREE;0033 FE0F 20E3 +KEYCAP DIGIT FOUR;0034 FE0F 20E3 +KEYCAP DIGIT FIVE;0035 FE0F 20E3 +KEYCAP DIGIT SIX;0036 FE0F 20E3 +KEYCAP DIGIT SEVEN;0037 FE0F 20E3 +KEYCAP DIGIT EIGHT;0038 FE0F 20E3 +KEYCAP DIGIT NINE;0039 FE0F 20E3 + +# Latin letter plus accent combinations. +# These are part of the original set of approved named sequences +# for Unicode 4.1. 2005. +# Subgroupings of this original set are identified here by +# purpose and source. + +# Subset 1: Originally requested for a Latin orthography +# of Hausa. See WG2 N1143 and UTC/1996-005. (6 total) + +LATIN CAPITAL LETTER A WITH MACRON AND GRAVE;0100 0300 +LATIN SMALL LETTER A WITH MACRON AND GRAVE;0101 0300 +LATIN CAPITAL LETTER I WITH MACRON AND GRAVE;012A 0300 +LATIN SMALL LETTER I WITH MACRON AND GRAVE;012B 0300 +LATIN CAPITAL LETTER U WITH MACRON AND GRAVE;016A 0300 +LATIN SMALL LETTER U WITH MACRON AND GRAVE;016B 0300 + +# Subset 2: Originally requested for a Latin orthography +# of Yoruba. See WG2 N1143 and UTC/1996-005. (14 total) + +LATIN CAPITAL LETTER E WITH VERTICAL LINE BELOW;0045 0329 +LATIN SMALL LETTER E WITH VERTICAL LINE BELOW;0065 0329 +LATIN CAPITAL LETTER E WITH VERTICAL LINE BELOW AND GRAVE;00C8 0329 +LATIN SMALL LETTER E WITH VERTICAL LINE BELOW AND GRAVE;00E8 0329 +LATIN CAPITAL LETTER E WITH VERTICAL LINE BELOW AND ACUTE;00C9 0329 +LATIN SMALL LETTER E WITH VERTICAL LINE BELOW AND ACUTE;00E9 0329 +LATIN CAPITAL LETTER O WITH VERTICAL LINE BELOW;004F 0329 +LATIN SMALL LETTER O WITH VERTICAL LINE BELOW;006F 0329 +LATIN CAPITAL LETTER O WITH VERTICAL LINE BELOW AND GRAVE;00D2 0329 +LATIN SMALL LETTER O WITH VERTICAL LINE BELOW AND GRAVE;00F2 0329 +LATIN CAPITAL LETTER O WITH VERTICAL LINE BELOW AND ACUTE;00D3 0329 +LATIN SMALL LETTER O WITH VERTICAL LINE BELOW AND ACUTE;00F3 0329 +LATIN CAPITAL LETTER S WITH VERTICAL LINE BELOW;0053 0329 +LATIN SMALL LETTER S WITH VERTICAL LINE BELOW;0073 0329 + +# Subset 3: Originally requested for Pinyin forms noted +# in HKSCS. See L2/02-423 and WG2 N2513. (4 total) + +LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND MACRON;00CA 0304 +LATIN SMALL LETTER E WITH CIRCUMFLEX AND MACRON;00EA 0304 +LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND CARON;00CA 030C +LATIN SMALL LETTER E WITH CIRCUMFLEX AND CARON;00EA 030C + +# Subset 4: Prominent use cases pulled from examples +# for Lithuanian and Tagalog in +# Unicode 4.0 and early drafts of UAX #34. (2 total) + +LATIN SMALL LETTER I WITH DOT ABOVE AND ACUTE;0069 0307 0301 +LATIN SMALL LETTER NG WITH TILDE ABOVE;006E 0360 0067 + +# Additions for Lithuanian. +# Provisional 2006-05-18, Approved 2007-10-19 + +LATIN CAPITAL LETTER A WITH OGONEK AND ACUTE;0104 0301 +LATIN SMALL LETTER A WITH OGONEK AND ACUTE;0105 0301 +LATIN CAPITAL LETTER A WITH OGONEK AND TILDE;0104 0303 +LATIN SMALL LETTER A WITH OGONEK AND TILDE;0105 0303 +LATIN CAPITAL LETTER E WITH OGONEK AND ACUTE;0118 0301 +LATIN SMALL LETTER E WITH OGONEK AND ACUTE;0119 0301 +LATIN CAPITAL LETTER E WITH OGONEK AND TILDE;0118 0303 +LATIN SMALL LETTER E WITH OGONEK AND TILDE;0119 0303 +LATIN CAPITAL LETTER E WITH DOT ABOVE AND ACUTE;0116 0301 +LATIN SMALL LETTER E WITH DOT ABOVE AND ACUTE;0117 0301 +LATIN CAPITAL LETTER E WITH DOT ABOVE AND TILDE;0116 0303 +LATIN SMALL LETTER E WITH DOT ABOVE AND TILDE;0117 0303 +LATIN SMALL LETTER I WITH DOT ABOVE AND GRAVE;0069 0307 0300 +LATIN SMALL LETTER I WITH DOT ABOVE AND TILDE;0069 0307 0303 +LATIN CAPITAL LETTER I WITH OGONEK AND ACUTE;012E 0301 +LATIN SMALL LETTER I WITH OGONEK AND DOT ABOVE AND ACUTE;012F 0307 0301 +LATIN CAPITAL LETTER I WITH OGONEK AND TILDE;012E 0303 +LATIN SMALL LETTER I WITH OGONEK AND DOT ABOVE AND TILDE;012F 0307 0303 +LATIN CAPITAL LETTER J WITH TILDE;004A 0303 +LATIN SMALL LETTER J WITH DOT ABOVE AND TILDE;006A 0307 0303 +LATIN CAPITAL LETTER L WITH TILDE;004C 0303 +LATIN SMALL LETTER L WITH TILDE;006C 0303 +LATIN CAPITAL LETTER M WITH TILDE;004D 0303 +LATIN SMALL LETTER M WITH TILDE;006D 0303 +LATIN CAPITAL LETTER R WITH TILDE;0052 0303 +LATIN SMALL LETTER R WITH TILDE;0072 0303 +LATIN CAPITAL LETTER U WITH OGONEK AND ACUTE;0172 0301 +LATIN SMALL LETTER U WITH OGONEK AND ACUTE;0173 0301 +LATIN CAPITAL LETTER U WITH OGONEK AND TILDE;0172 0303 +LATIN SMALL LETTER U WITH OGONEK AND TILDE;0173 0303 +LATIN CAPITAL LETTER U WITH MACRON AND ACUTE;016A 0301 +LATIN SMALL LETTER U WITH MACRON AND ACUTE;016B 0301 +LATIN CAPITAL LETTER U WITH MACRON AND TILDE;016A 0303 +LATIN SMALL LETTER U WITH MACRON AND TILDE;016B 0303 + +# Entries for JIS X 0213 compatibility mapping. +# Provisional 2008-11-07, Approved 2010-05-14 + +LATIN SMALL LETTER AE WITH GRAVE;00E6 0300 +LATIN SMALL LETTER OPEN O WITH GRAVE;0254 0300 +LATIN SMALL LETTER OPEN O WITH ACUTE;0254 0301 +LATIN SMALL LETTER TURNED V WITH GRAVE;028C 0300 +LATIN SMALL LETTER TURNED V WITH ACUTE;028C 0301 +LATIN SMALL LETTER SCHWA WITH GRAVE;0259 0300 +LATIN SMALL LETTER SCHWA WITH ACUTE;0259 0301 +LATIN SMALL LETTER HOOKED SCHWA WITH GRAVE;025A 0300 +LATIN SMALL LETTER HOOKED SCHWA WITH ACUTE;025A 0301 + +# Entries for Uyghur and Chagatai. +# Provisional N/A, Approved 2012-11-08 + +ARABIC SEQUENCE YEH WITH HAMZA ABOVE WITH ALEF;0626 0627 +ARABIC SEQUENCE YEH WITH HAMZA ABOVE WITH WAW;0626 0648 +ARABIC SEQUENCE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA;0626 0649 +ARABIC SEQUENCE YEH WITH HAMZA ABOVE WITH OE;0626 06C6 +ARABIC SEQUENCE YEH WITH HAMZA ABOVE WITH U;0626 06C7 +ARABIC SEQUENCE YEH WITH HAMZA ABOVE WITH YU;0626 06C8 +ARABIC SEQUENCE YEH WITH HAMZA ABOVE WITH E;0626 06D0 +ARABIC SEQUENCE YEH WITH HAMZA ABOVE WITH AE;0626 06D5 +ARABIC SEQUENCE NOON WITH KEHEH;0646 06A9 + +# Entries that correspond to Indic characters with nuktas +# that are also listed in CompositionExclusions.txt. +# These characters decompose for normalized text, even +# in NFC. Having named sequences for these helps in +# certain specifications, including Label Generation Rules (LGR) +# for Internationalized Domain Names (IDN). +# +# Provisional 2020-01-16, Approved 2021-07-27 + +DEVANAGARI SEQUENCE FOR LETTER QA; 0915 093C +DEVANAGARI SEQUENCE FOR LETTER KHHA; 0916 093C +DEVANAGARI SEQUENCE FOR LETTER GHHA; 0917 093C +DEVANAGARI SEQUENCE FOR LETTER ZA; 091C 093C +DEVANAGARI SEQUENCE FOR LETTER DDDHA; 0921 093C +DEVANAGARI SEQUENCE FOR LETTER RHA; 0922 093C +DEVANAGARI SEQUENCE FOR LETTER FA; 092B 093C +DEVANAGARI SEQUENCE FOR LETTER YYA; 092F 093C +BENGALI SEQUENCE FOR LETTER RRA; 09A1 09BC +BENGALI SEQUENCE FOR LETTER RHA; 09A2 09BC +BENGALI SEQUENCE FOR LETTER YYA; 09AF 09BC +GURMUKHI SEQUENCE FOR LETTER LLA; 0A32 0A3C +GURMUKHI SEQUENCE FOR LETTER SHA; 0A38 0A3C +GURMUKHI SEQUENCE FOR LETTER KHHA; 0A16 0A3C +GURMUKHI SEQUENCE FOR LETTER GHHA; 0A17 0A3C +GURMUKHI SEQUENCE FOR LETTER ZA; 0A1C 0A3C +GURMUKHI SEQUENCE FOR LETTER FA; 0A2B 0A3C +ORIYA SEQUENCE FOR LETTER RRA; 0B21 0B3C +ORIYA SEQUENCE FOR LETTER RHA; 0B22 0B3C + +# Entry for a Bangla entity. +# Provisional 2009-08-10, Approved 2010-05-14 +# +# Note that this same sequence is also used for the ASSAMESE LETTER KSSA. + +BENGALI LETTER KHINYA;0995 09CD 09B7 + +# Additions for Tamil. +# Provisional 2008-02-08, Approved 2009-08-14 +# +# A visual display of the Tamil named character sequences is available +# in the documentation for the Unicode Standard. +# See the "Tamil" section in the core specification. + +TAMIL CONSONANT K; 0B95 0BCD +TAMIL CONSONANT NG; 0B99 0BCD +TAMIL CONSONANT C; 0B9A 0BCD +TAMIL CONSONANT NY; 0B9E 0BCD +TAMIL CONSONANT TT; 0B9F 0BCD +TAMIL CONSONANT NN; 0BA3 0BCD +TAMIL CONSONANT T; 0BA4 0BCD +TAMIL CONSONANT N; 0BA8 0BCD +TAMIL CONSONANT P; 0BAA 0BCD +TAMIL CONSONANT M; 0BAE 0BCD +TAMIL CONSONANT Y; 0BAF 0BCD +TAMIL CONSONANT R; 0BB0 0BCD +TAMIL CONSONANT L; 0BB2 0BCD +TAMIL CONSONANT V; 0BB5 0BCD +TAMIL CONSONANT LLL;0BB4 0BCD +TAMIL CONSONANT LL; 0BB3 0BCD +TAMIL CONSONANT RR; 0BB1 0BCD +TAMIL CONSONANT NNN;0BA9 0BCD +TAMIL CONSONANT J; 0B9C 0BCD +TAMIL CONSONANT SH; 0BB6 0BCD +TAMIL CONSONANT SS; 0BB7 0BCD +TAMIL CONSONANT S; 0BB8 0BCD +TAMIL CONSONANT H; 0BB9 0BCD +TAMIL CONSONANT KSS;0B95 0BCD 0BB7 0BCD + +TAMIL SYLLABLE KAA; 0B95 0BBE +TAMIL SYLLABLE KI; 0B95 0BBF +TAMIL SYLLABLE KII; 0B95 0BC0 +TAMIL SYLLABLE KU; 0B95 0BC1 +TAMIL SYLLABLE KUU; 0B95 0BC2 +TAMIL SYLLABLE KE; 0B95 0BC6 +TAMIL SYLLABLE KEE; 0B95 0BC7 +TAMIL SYLLABLE KAI; 0B95 0BC8 +TAMIL SYLLABLE KO; 0B95 0BCA +TAMIL SYLLABLE KOO; 0B95 0BCB +TAMIL SYLLABLE KAU; 0B95 0BCC + +TAMIL SYLLABLE NGAA; 0B99 0BBE +TAMIL SYLLABLE NGI; 0B99 0BBF +TAMIL SYLLABLE NGII; 0B99 0BC0 +TAMIL SYLLABLE NGU; 0B99 0BC1 +TAMIL SYLLABLE NGUU; 0B99 0BC2 +TAMIL SYLLABLE NGE; 0B99 0BC6 +TAMIL SYLLABLE NGEE; 0B99 0BC7 +TAMIL SYLLABLE NGAI; 0B99 0BC8 +TAMIL SYLLABLE NGO; 0B99 0BCA +TAMIL SYLLABLE NGOO; 0B99 0BCB +TAMIL SYLLABLE NGAU; 0B99 0BCC + +TAMIL SYLLABLE CAA; 0B9A 0BBE +TAMIL SYLLABLE CI; 0B9A 0BBF +TAMIL SYLLABLE CII; 0B9A 0BC0 +TAMIL SYLLABLE CU; 0B9A 0BC1 +TAMIL SYLLABLE CUU; 0B9A 0BC2 +TAMIL SYLLABLE CE; 0B9A 0BC6 +TAMIL SYLLABLE CEE; 0B9A 0BC7 +TAMIL SYLLABLE CAI; 0B9A 0BC8 +TAMIL SYLLABLE CO; 0B9A 0BCA +TAMIL SYLLABLE COO; 0B9A 0BCB +TAMIL SYLLABLE CAU; 0B9A 0BCC + +TAMIL SYLLABLE NYAA; 0B9E 0BBE +TAMIL SYLLABLE NYI; 0B9E 0BBF +TAMIL SYLLABLE NYII; 0B9E 0BC0 +TAMIL SYLLABLE NYU; 0B9E 0BC1 +TAMIL SYLLABLE NYUU; 0B9E 0BC2 +TAMIL SYLLABLE NYE; 0B9E 0BC6 +TAMIL SYLLABLE NYEE; 0B9E 0BC7 +TAMIL SYLLABLE NYAI; 0B9E 0BC8 +TAMIL SYLLABLE NYO; 0B9E 0BCA +TAMIL SYLLABLE NYOO; 0B9E 0BCB +TAMIL SYLLABLE NYAU; 0B9E 0BCC + +TAMIL SYLLABLE TTAA; 0B9F 0BBE +TAMIL SYLLABLE TTI; 0B9F 0BBF +TAMIL SYLLABLE TTII; 0B9F 0BC0 +TAMIL SYLLABLE TTU; 0B9F 0BC1 +TAMIL SYLLABLE TTUU; 0B9F 0BC2 +TAMIL SYLLABLE TTE; 0B9F 0BC6 +TAMIL SYLLABLE TTEE; 0B9F 0BC7 +TAMIL SYLLABLE TTAI; 0B9F 0BC8 +TAMIL SYLLABLE TTO; 0B9F 0BCA +TAMIL SYLLABLE TTOO; 0B9F 0BCB +TAMIL SYLLABLE TTAU; 0B9F 0BCC + +TAMIL SYLLABLE NNAA; 0BA3 0BBE +TAMIL SYLLABLE NNI; 0BA3 0BBF +TAMIL SYLLABLE NNII; 0BA3 0BC0 +TAMIL SYLLABLE NNU; 0BA3 0BC1 +TAMIL SYLLABLE NNUU; 0BA3 0BC2 +TAMIL SYLLABLE NNE; 0BA3 0BC6 +TAMIL SYLLABLE NNEE; 0BA3 0BC7 +TAMIL SYLLABLE NNAI; 0BA3 0BC8 +TAMIL SYLLABLE NNO; 0BA3 0BCA +TAMIL SYLLABLE NNOO; 0BA3 0BCB +TAMIL SYLLABLE NNAU; 0BA3 0BCC + +TAMIL SYLLABLE TAA; 0BA4 0BBE +TAMIL SYLLABLE TI; 0BA4 0BBF +TAMIL SYLLABLE TII; 0BA4 0BC0 +TAMIL SYLLABLE TU; 0BA4 0BC1 +TAMIL SYLLABLE TUU; 0BA4 0BC2 +TAMIL SYLLABLE TE; 0BA4 0BC6 +TAMIL SYLLABLE TEE; 0BA4 0BC7 +TAMIL SYLLABLE TAI; 0BA4 0BC8 +TAMIL SYLLABLE TO; 0BA4 0BCA +TAMIL SYLLABLE TOO; 0BA4 0BCB +TAMIL SYLLABLE TAU; 0BA4 0BCC + +TAMIL SYLLABLE NAA; 0BA8 0BBE +TAMIL SYLLABLE NI; 0BA8 0BBF +TAMIL SYLLABLE NII; 0BA8 0BC0 +TAMIL SYLLABLE NU; 0BA8 0BC1 +TAMIL SYLLABLE NUU; 0BA8 0BC2 +TAMIL SYLLABLE NE; 0BA8 0BC6 +TAMIL SYLLABLE NEE; 0BA8 0BC7 +TAMIL SYLLABLE NAI; 0BA8 0BC8 +TAMIL SYLLABLE NO; 0BA8 0BCA +TAMIL SYLLABLE NOO; 0BA8 0BCB +TAMIL SYLLABLE NAU; 0BA8 0BCC + +TAMIL SYLLABLE PAA; 0BAA 0BBE +TAMIL SYLLABLE PI; 0BAA 0BBF +TAMIL SYLLABLE PII; 0BAA 0BC0 +TAMIL SYLLABLE PU; 0BAA 0BC1 +TAMIL SYLLABLE PUU; 0BAA 0BC2 +TAMIL SYLLABLE PE; 0BAA 0BC6 +TAMIL SYLLABLE PEE; 0BAA 0BC7 +TAMIL SYLLABLE PAI; 0BAA 0BC8 +TAMIL SYLLABLE PO; 0BAA 0BCA +TAMIL SYLLABLE POO; 0BAA 0BCB +TAMIL SYLLABLE PAU; 0BAA 0BCC + +TAMIL SYLLABLE MAA; 0BAE 0BBE +TAMIL SYLLABLE MI; 0BAE 0BBF +TAMIL SYLLABLE MII; 0BAE 0BC0 +TAMIL SYLLABLE MU; 0BAE 0BC1 +TAMIL SYLLABLE MUU; 0BAE 0BC2 +TAMIL SYLLABLE ME; 0BAE 0BC6 +TAMIL SYLLABLE MEE; 0BAE 0BC7 +TAMIL SYLLABLE MAI; 0BAE 0BC8 +TAMIL SYLLABLE MO; 0BAE 0BCA +TAMIL SYLLABLE MOO; 0BAE 0BCB +TAMIL SYLLABLE MAU; 0BAE 0BCC + +TAMIL SYLLABLE YAA; 0BAF 0BBE +TAMIL SYLLABLE YI; 0BAF 0BBF +TAMIL SYLLABLE YII; 0BAF 0BC0 +TAMIL SYLLABLE YU; 0BAF 0BC1 +TAMIL SYLLABLE YUU; 0BAF 0BC2 +TAMIL SYLLABLE YE; 0BAF 0BC6 +TAMIL SYLLABLE YEE; 0BAF 0BC7 +TAMIL SYLLABLE YAI; 0BAF 0BC8 +TAMIL SYLLABLE YO; 0BAF 0BCA +TAMIL SYLLABLE YOO; 0BAF 0BCB +TAMIL SYLLABLE YAU; 0BAF 0BCC + +TAMIL SYLLABLE RAA; 0BB0 0BBE +TAMIL SYLLABLE RI; 0BB0 0BBF +TAMIL SYLLABLE RII; 0BB0 0BC0 +TAMIL SYLLABLE RU; 0BB0 0BC1 +TAMIL SYLLABLE RUU; 0BB0 0BC2 +TAMIL SYLLABLE RE; 0BB0 0BC6 +TAMIL SYLLABLE REE; 0BB0 0BC7 +TAMIL SYLLABLE RAI; 0BB0 0BC8 +TAMIL SYLLABLE RO; 0BB0 0BCA +TAMIL SYLLABLE ROO; 0BB0 0BCB +TAMIL SYLLABLE RAU; 0BB0 0BCC + +TAMIL SYLLABLE LAA; 0BB2 0BBE +TAMIL SYLLABLE LI; 0BB2 0BBF +TAMIL SYLLABLE LII; 0BB2 0BC0 +TAMIL SYLLABLE LU; 0BB2 0BC1 +TAMIL SYLLABLE LUU; 0BB2 0BC2 +TAMIL SYLLABLE LE; 0BB2 0BC6 +TAMIL SYLLABLE LEE; 0BB2 0BC7 +TAMIL SYLLABLE LAI; 0BB2 0BC8 +TAMIL SYLLABLE LO; 0BB2 0BCA +TAMIL SYLLABLE LOO; 0BB2 0BCB +TAMIL SYLLABLE LAU; 0BB2 0BCC + +TAMIL SYLLABLE VAA; 0BB5 0BBE +TAMIL SYLLABLE VI; 0BB5 0BBF +TAMIL SYLLABLE VII; 0BB5 0BC0 +TAMIL SYLLABLE VU; 0BB5 0BC1 +TAMIL SYLLABLE VUU; 0BB5 0BC2 +TAMIL SYLLABLE VE; 0BB5 0BC6 +TAMIL SYLLABLE VEE; 0BB5 0BC7 +TAMIL SYLLABLE VAI; 0BB5 0BC8 +TAMIL SYLLABLE VO; 0BB5 0BCA +TAMIL SYLLABLE VOO; 0BB5 0BCB +TAMIL SYLLABLE VAU; 0BB5 0BCC + +TAMIL SYLLABLE LLLAA; 0BB4 0BBE +TAMIL SYLLABLE LLLI; 0BB4 0BBF +TAMIL SYLLABLE LLLII; 0BB4 0BC0 +TAMIL SYLLABLE LLLU; 0BB4 0BC1 +TAMIL SYLLABLE LLLUU; 0BB4 0BC2 +TAMIL SYLLABLE LLLE; 0BB4 0BC6 +TAMIL SYLLABLE LLLEE; 0BB4 0BC7 +TAMIL SYLLABLE LLLAI; 0BB4 0BC8 +TAMIL SYLLABLE LLLO; 0BB4 0BCA +TAMIL SYLLABLE LLLOO; 0BB4 0BCB +TAMIL SYLLABLE LLLAU; 0BB4 0BCC + +TAMIL SYLLABLE LLAA; 0BB3 0BBE +TAMIL SYLLABLE LLI; 0BB3 0BBF +TAMIL SYLLABLE LLII; 0BB3 0BC0 +TAMIL SYLLABLE LLU; 0BB3 0BC1 +TAMIL SYLLABLE LLUU; 0BB3 0BC2 +TAMIL SYLLABLE LLE; 0BB3 0BC6 +TAMIL SYLLABLE LLEE; 0BB3 0BC7 +TAMIL SYLLABLE LLAI; 0BB3 0BC8 +TAMIL SYLLABLE LLO; 0BB3 0BCA +TAMIL SYLLABLE LLOO; 0BB3 0BCB +TAMIL SYLLABLE LLAU; 0BB3 0BCC + +TAMIL SYLLABLE RRAA; 0BB1 0BBE +TAMIL SYLLABLE RRI; 0BB1 0BBF +TAMIL SYLLABLE RRII; 0BB1 0BC0 +TAMIL SYLLABLE RRU; 0BB1 0BC1 +TAMIL SYLLABLE RRUU; 0BB1 0BC2 +TAMIL SYLLABLE RRE; 0BB1 0BC6 +TAMIL SYLLABLE RREE; 0BB1 0BC7 +TAMIL SYLLABLE RRAI; 0BB1 0BC8 +TAMIL SYLLABLE RRO; 0BB1 0BCA +TAMIL SYLLABLE RROO; 0BB1 0BCB +TAMIL SYLLABLE RRAU; 0BB1 0BCC + +TAMIL SYLLABLE NNNAA; 0BA9 0BBE +TAMIL SYLLABLE NNNI; 0BA9 0BBF +TAMIL SYLLABLE NNNII; 0BA9 0BC0 +TAMIL SYLLABLE NNNU; 0BA9 0BC1 +TAMIL SYLLABLE NNNUU; 0BA9 0BC2 +TAMIL SYLLABLE NNNE; 0BA9 0BC6 +TAMIL SYLLABLE NNNEE; 0BA9 0BC7 +TAMIL SYLLABLE NNNAI; 0BA9 0BC8 +TAMIL SYLLABLE NNNO; 0BA9 0BCA +TAMIL SYLLABLE NNNOO; 0BA9 0BCB +TAMIL SYLLABLE NNNAU; 0BA9 0BCC + +TAMIL SYLLABLE JAA; 0B9C 0BBE +TAMIL SYLLABLE JI; 0B9C 0BBF +TAMIL SYLLABLE JII; 0B9C 0BC0 +TAMIL SYLLABLE JU; 0B9C 0BC1 +TAMIL SYLLABLE JUU; 0B9C 0BC2 +TAMIL SYLLABLE JE; 0B9C 0BC6 +TAMIL SYLLABLE JEE; 0B9C 0BC7 +TAMIL SYLLABLE JAI; 0B9C 0BC8 +TAMIL SYLLABLE JO; 0B9C 0BCA +TAMIL SYLLABLE JOO; 0B9C 0BCB +TAMIL SYLLABLE JAU; 0B9C 0BCC + +TAMIL SYLLABLE SHAA; 0BB6 0BBE +TAMIL SYLLABLE SHI; 0BB6 0BBF +TAMIL SYLLABLE SHII; 0BB6 0BC0 +TAMIL SYLLABLE SHU; 0BB6 0BC1 +TAMIL SYLLABLE SHUU; 0BB6 0BC2 +TAMIL SYLLABLE SHE; 0BB6 0BC6 +TAMIL SYLLABLE SHEE; 0BB6 0BC7 +TAMIL SYLLABLE SHAI; 0BB6 0BC8 +TAMIL SYLLABLE SHO; 0BB6 0BCA +TAMIL SYLLABLE SHOO; 0BB6 0BCB +TAMIL SYLLABLE SHAU; 0BB6 0BCC + +TAMIL SYLLABLE SSAA; 0BB7 0BBE +TAMIL SYLLABLE SSI; 0BB7 0BBF +TAMIL SYLLABLE SSII; 0BB7 0BC0 +TAMIL SYLLABLE SSU; 0BB7 0BC1 +TAMIL SYLLABLE SSUU; 0BB7 0BC2 +TAMIL SYLLABLE SSE; 0BB7 0BC6 +TAMIL SYLLABLE SSEE; 0BB7 0BC7 +TAMIL SYLLABLE SSAI; 0BB7 0BC8 +TAMIL SYLLABLE SSO; 0BB7 0BCA +TAMIL SYLLABLE SSOO; 0BB7 0BCB +TAMIL SYLLABLE SSAU; 0BB7 0BCC + +TAMIL SYLLABLE SAA; 0BB8 0BBE +TAMIL SYLLABLE SI; 0BB8 0BBF +TAMIL SYLLABLE SII; 0BB8 0BC0 +TAMIL SYLLABLE SU; 0BB8 0BC1 +TAMIL SYLLABLE SUU; 0BB8 0BC2 +TAMIL SYLLABLE SE; 0BB8 0BC6 +TAMIL SYLLABLE SEE; 0BB8 0BC7 +TAMIL SYLLABLE SAI; 0BB8 0BC8 +TAMIL SYLLABLE SO; 0BB8 0BCA +TAMIL SYLLABLE SOO; 0BB8 0BCB +TAMIL SYLLABLE SAU; 0BB8 0BCC + +TAMIL SYLLABLE HAA; 0BB9 0BBE +TAMIL SYLLABLE HI; 0BB9 0BBF +TAMIL SYLLABLE HII; 0BB9 0BC0 +TAMIL SYLLABLE HU; 0BB9 0BC1 +TAMIL SYLLABLE HUU; 0BB9 0BC2 +TAMIL SYLLABLE HE; 0BB9 0BC6 +TAMIL SYLLABLE HEE; 0BB9 0BC7 +TAMIL SYLLABLE HAI; 0BB9 0BC8 +TAMIL SYLLABLE HO; 0BB9 0BCA +TAMIL SYLLABLE HOO; 0BB9 0BCB +TAMIL SYLLABLE HAU; 0BB9 0BCC + +TAMIL SYLLABLE KSSA; 0B95 0BCD 0BB7 +TAMIL SYLLABLE KSSAA; 0B95 0BCD 0BB7 0BBE +TAMIL SYLLABLE KSSI; 0B95 0BCD 0BB7 0BBF +TAMIL SYLLABLE KSSII; 0B95 0BCD 0BB7 0BC0 +TAMIL SYLLABLE KSSU; 0B95 0BCD 0BB7 0BC1 +TAMIL SYLLABLE KSSUU; 0B95 0BCD 0BB7 0BC2 +TAMIL SYLLABLE KSSE; 0B95 0BCD 0BB7 0BC6 +TAMIL SYLLABLE KSSEE; 0B95 0BCD 0BB7 0BC7 +TAMIL SYLLABLE KSSAI; 0B95 0BCD 0BB7 0BC8 +TAMIL SYLLABLE KSSO; 0B95 0BCD 0BB7 0BCA +TAMIL SYLLABLE KSSOO; 0B95 0BCD 0BB7 0BCB +TAMIL SYLLABLE KSSAU; 0B95 0BCD 0BB7 0BCC + +TAMIL SYLLABLE SHRII; 0BB6 0BCD 0BB0 0BC0 + +# Sinhala medial consonants and "reph" form. +# Provisional 2010-05-13, Approved 2011-08-05 + +SINHALA CONSONANT SIGN YANSAYA;0DCA 200D 0DBA +SINHALA CONSONANT SIGN RAKAARAANSAYA;0DCA 200D 0DBB +SINHALA CONSONANT SIGN REPAYA;0DBB 0DCA 200D + +# Georgian letter plus accent sequence. +# This is part of the original set of approved named sequences +# for Unicode 4.1. 2005. + +GEORGIAN LETTER U-BRJGU;10E3 0302 + +# Khmer subjoined forms and other sequences. +# These are part of the original set of approved named sequences +# for Unicode 4.1. 2005. + +KHMER CONSONANT SIGN COENG KA;17D2 1780 +KHMER CONSONANT SIGN COENG KHA;17D2 1781 +KHMER CONSONANT SIGN COENG KO;17D2 1782 +KHMER CONSONANT SIGN COENG KHO;17D2 1783 +KHMER CONSONANT SIGN COENG NGO;17D2 1784 +KHMER CONSONANT SIGN COENG CA;17D2 1785 +KHMER CONSONANT SIGN COENG CHA;17D2 1786 +KHMER CONSONANT SIGN COENG CO;17D2 1787 +KHMER CONSONANT SIGN COENG CHO;17D2 1788 +KHMER CONSONANT SIGN COENG NYO;17D2 1789 +KHMER CONSONANT SIGN COENG DA;17D2 178A +KHMER CONSONANT SIGN COENG TTHA;17D2 178B +KHMER CONSONANT SIGN COENG DO;17D2 178C +KHMER CONSONANT SIGN COENG TTHO;17D2 178D +KHMER CONSONANT SIGN COENG NA;17D2 178E +KHMER CONSONANT SIGN COENG TA;17D2 178F +KHMER CONSONANT SIGN COENG THA;17D2 1790 +KHMER CONSONANT SIGN COENG TO;17D2 1791 +KHMER CONSONANT SIGN COENG THO;17D2 1792 +KHMER CONSONANT SIGN COENG NO;17D2 1793 +KHMER CONSONANT SIGN COENG BA;17D2 1794 +KHMER CONSONANT SIGN COENG PHA;17D2 1795 +KHMER CONSONANT SIGN COENG PO;17D2 1796 +KHMER CONSONANT SIGN COENG PHO;17D2 1797 +KHMER CONSONANT SIGN COENG MO;17D2 1798 +KHMER CONSONANT SIGN COENG YO;17D2 1799 +KHMER CONSONANT SIGN COENG RO;17D2 179A +KHMER CONSONANT SIGN COENG LO;17D2 179B +KHMER CONSONANT SIGN COENG VO;17D2 179C +KHMER CONSONANT SIGN COENG SHA;17D2 179D +KHMER CONSONANT SIGN COENG SSA;17D2 179E +KHMER CONSONANT SIGN COENG SA;17D2 179F +KHMER CONSONANT SIGN COENG HA;17D2 17A0 +KHMER CONSONANT SIGN COENG LA;17D2 17A1 +KHMER VOWEL SIGN COENG QA;17D2 17A2 +KHMER INDEPENDENT VOWEL SIGN COENG QU;17D2 17A7 +KHMER INDEPENDENT VOWEL SIGN COENG RY;17D2 17AB +KHMER INDEPENDENT VOWEL SIGN COENG RYY;17D2 17AC +KHMER INDEPENDENT VOWEL SIGN COENG QE;17D2 17AF +KHMER VOWEL SIGN OM;17BB 17C6 +KHMER VOWEL SIGN AAM;17B6 17C6 + +# Entries for JIS X 0213 compatibility mapping. +# Provisional 2008-11-07, Approved 2010-05-14 +# +# Two of these were part of the original set of approved named sequences +# for Unicode 4.1. 2005. + +HIRAGANA LETTER BIDAKUON NGA;304B 309A +HIRAGANA LETTER BIDAKUON NGI;304D 309A +HIRAGANA LETTER BIDAKUON NGU;304F 309A +HIRAGANA LETTER BIDAKUON NGE;3051 309A +HIRAGANA LETTER BIDAKUON NGO;3053 309A +KATAKANA LETTER BIDAKUON NGA;30AB 309A +KATAKANA LETTER BIDAKUON NGI;30AD 309A +KATAKANA LETTER BIDAKUON NGU;30AF 309A +KATAKANA LETTER BIDAKUON NGE;30B1 309A +KATAKANA LETTER BIDAKUON NGO;30B3 309A +KATAKANA LETTER AINU CE;30BB 309A +KATAKANA LETTER AINU TU;30C4 309A +KATAKANA LETTER AINU TO;30C8 309A +KATAKANA LETTER AINU P;31F7 309A +MODIFIER LETTER EXTRA-HIGH EXTRA-LOW CONTOUR TONE BAR;02E5 02E9 +MODIFIER LETTER EXTRA-LOW EXTRA-HIGH CONTOUR TONE BAR;02E9 02E5 + +# EOF diff --git a/extra_tests/snippets/stdlib_unicode_shared.py b/extra_tests/snippets/stdlib_unicode_shared.py index ff8bc0533..e9ea79cab 100644 --- a/extra_tests/snippets/stdlib_unicode_shared.py +++ b/extra_tests/snippets/stdlib_unicode_shared.py @@ -54,6 +54,16 @@ assert unicodedata.digit("²") == 2 assert abs(unicodedata.numeric("⅓") - (1 / 3)) < 1e-6 assert unicodedata.name("☃") == "SNOWMAN" assert unicodedata.lookup("SNOWMAN") == "☃" +assert unicodedata.lookup("LATIN CAPITAL LETTER GHA") == "\u01a2" +assert unicodedata.lookup("LATIN SMALL LETTER R WITH TILDE") == "r\u0303" +assert unicodedata.lookup("TANGUT IDEOGRAPH-17000") == "\U00017000" +assert unicodedata.ucd_3_2_0.lookup("SNOWMAN") == "☃" +try: + unicodedata.ucd_3_2_0.lookup("LATIN CAPITAL LETTER GHA") +except KeyError: + pass +else: + raise AssertionError("3.2.0 has no name aliases") assert unicodedata.combining("́") == 230 # COMBINING ACUTE ACCENT assert unicodedata.mirrored("(") == 1 assert unicodedata.east_asian_width("あ") == "W"