diff --git a/src/formats/docx/content.rs b/src/formats/docx/content.rs
index c5a7c18b..c1db505d 100644
--- a/src/formats/docx/content.rs
+++ b/src/formats/docx/content.rs
@@ -501,6 +501,11 @@ impl<'a, 'b, 'e> InlineWalker<'a, 'b, 'e> {
self.push(Inline::Text { text, style });
}
}
+ "sym" => {
+ if let Some(text) = super::symbols::glyph(child) {
+ self.push(Inline::Text { text, style });
+ }
+ }
"tab" | "ptab" => self.push(Inline::Text { text: " ".into(), style: Style::PLAIN }),
// Markdown has no pages or columns, but every w:br still
// separates the runs around it: dropping a page break
diff --git a/src/formats/docx/mod.rs b/src/formats/docx/mod.rs
index eee5317e..300876a9 100644
--- a/src/formats/docx/mod.rs
+++ b/src/formats/docx/mod.rs
@@ -6,6 +6,7 @@
mod content;
mod numbering;
mod styles;
+mod symbols;
use crate::error::ConvertError;
use crate::model::{Document, Note, NoteKind};
@@ -247,6 +248,95 @@ mod tests {
);
}
+ #[test]
+ fn symbol_glyphs_load_from_the_font_code_page() {
+ // Word's legacy round bullet is Symbol F0B7 (#193); Wingdings'
+ // bullet squares and arrowheads, and Symbol's operators, come from
+ // the same code-page tables. Both the byte form and the U+F000..F0FF
+ // form must load, and the font name is case-insensitive.
+ for (font, form, expected) in [
+ ("Symbol", "F0B7", "\u{2022}"),
+ ("Symbol", "00B7", "\u{2022}"),
+ ("symbol", "f0b7", "\u{2022}"),
+ ("Wingdings", "F0A7", "\u{25aa}"),
+ ("WINGDINGS", "00A7", "\u{25aa}"),
+ ("Wingdings", "F0D8", "\u{27a2}"),
+ ("Wingdings", "F0B7", "\u{1f550}"),
+ ("Symbol", "F0A3", "\u{2264}"),
+ ("Symbol", "F0B3", "\u{2265}"),
+ ("Symbol", "F0BA", "\u{2261}"),
+ ("Symbol", "F0BB", "\u{2248}"),
+ ] {
+ let document = format!(
+ r#"
+ before after
+ "#
+ );
+ let bytes = docx_parts(&[("word/document.xml", &document)]);
+ let doc = parse(&bytes).unwrap();
+ let Some(Block::Paragraph(inlines)) = doc.blocks.first() else { panic!() };
+ assert_eq!(
+ crate::model::inlines_to_plain_text(inlines),
+ format!("before {expected} after"),
+ );
+ }
+ }
+
+ #[test]
+ fn symbol_glyphs_accept_a_unicode_valued_w_char() {
+ // Converters that store the character itself in w:char keep working
+ // for the symbol fonts (#193's Symbol operators). A value too large
+ // to be a font code is the character; private-use values never load.
+ for (form, expected) in [("2264", "\u{2264}"), ("2248", "\u{2248}")] {
+ let document = format!(
+ r#"
+ p q
+ "#
+ );
+ let bytes = docx_parts(&[("word/document.xml", &document)]);
+ let doc = parse(&bytes).unwrap();
+ let Some(Block::Paragraph(inlines)) = doc.blocks.first() else { panic!() };
+ assert_eq!(crate::model::inlines_to_plain_text(inlines), format!("p {expected} q"));
+ }
+ for font in ["Wingdings", "Symbol"] {
+ let document = format!(
+ r#"
+ beforeafter
+ "#
+ );
+ let bytes = docx_parts(&[("word/document.xml", &document)]);
+ let doc = parse(&bytes).unwrap();
+ let Some(Block::Paragraph(inlines)) = doc.blocks.first() else { panic!() };
+ assert_eq!(crate::model::inlines_to_plain_text(inlines), "beforeafter");
+ }
+ }
+
+ #[test]
+ fn unknown_or_malformed_symbol_glyphs_stay_dropped() {
+ for attrs in [
+ r#"w:font="Arial" w:char="2013""#,
+ r#"w:font="Wingdings" w:char="0010""#,
+ r#"w:font="Wingdings" w:char="not-hex""#,
+ r#"w:font="Wingdings" w:char="+00A7""#,
+ r#"w:font="Wingdings" w:char="""#,
+ r#"w:font="Wingdings" w:char="100A7""#,
+ r#"w:font="Wingdings""#,
+ r#"w:char="F0A7""#,
+ ] {
+ let document = format!(
+ r#"
+ beforeafter
+ "#
+ );
+ let bytes = docx_parts(&[("word/document.xml", &document)]);
+ assert_eq!(
+ crate::to_markdown_bytes(&bytes, crate::Format::Docx).unwrap().trim(),
+ "beforeafter",
+ "attrs: {attrs}",
+ );
+ }
+ }
+
#[test]
fn unmarked_run_edge_whitespace_is_kept() {
// Converters that never write xml:space carry inter-word spacing on
diff --git a/src/formats/docx/symbols.rs b/src/formats/docx/symbols.rs
new file mode 100644
index 00000000..7c777469
--- /dev/null
+++ b/src/formats/docx/symbols.rs
@@ -0,0 +1,1141 @@
+//! Symbol-font code pages for `w:sym`: the glyph drawn from Wingdings,
+//! Wingdings 2, Wingdings 3, Webdings or Symbol, mapped to Unicode text.
+//!
+//! Source: the tables docx4j ships as `SymbolMapper.java` (Apache-2.0),
+//! which record Alan Wood's code-page mappings for the Microsoft symbol
+//! fonts (alanwood.net). Every entry was cross-checked against pandoc's
+//! independent table (GPL, validation only); the two agree except where
+//! docx4j notes a deliberate correction (Wingdings 0xd8 -> U+27A2).
+
+use crate::package::xml::{Element, ns};
+
+/// The Unicode text of one `w:sym` glyph, or `None` when its font and code
+/// are unknown to the tables.
+pub(super) fn glyph(symbol: &Element) -> Option {
+ let font = symbol.attr(ns::W, "font")?;
+ let value = symbol.attr(ns::W, "char")?;
+ // Reject signs and overlong values even when integer parsing accepts them.
+ if value.is_empty() || value.len() > 4 || !value.bytes().all(|b| b.is_ascii_hexdigit()) {
+ return None;
+ }
+ let raw = u32::from_str_radix(value, 16).ok()?;
+ // Word stores legacy symbol-font codes both as bytes and in U+F000..F0FF.
+ let code = match raw {
+ 0xf000..=0xf0ff => raw - 0xf000,
+ _ => raw,
+ };
+ let page = code_page(font)?;
+ if let Ok(byte) = u8::try_from(code) {
+ if let Ok(index) = page.binary_search_by_key(&byte, |entry| entry.0) {
+ return Some(page[index].1.to_string());
+ }
+ } else if let Some(character) = char::from_u32(raw) {
+ // Some generators store the Unicode scalar itself in w:char when
+ // the font is a symbol font, so a value too large to be a code byte
+ // is the character (issue #193's Symbol `2264` for <=). Private-use
+ // and control values stay out: a font-relative code never loads.
+ if !character.is_control() && !(0xe000..0xf900).contains(&raw) {
+ return Some(character.to_string());
+ }
+ }
+ log::debug!("dropping w:sym glyph: {font} has no entry for its code");
+ None
+}
+
+/// The code page of a known symbol font, or `None` for every other font:
+/// a `w:sym` of Arial or Times is not this table's business.
+fn code_page(font: &str) -> Option<&'static [(u8, &str)]> {
+ if font.eq_ignore_ascii_case("Wingdings") {
+ Some(WINGDINGS)
+ } else if font.eq_ignore_ascii_case("Wingdings 2") {
+ Some(WINGDINGS_2)
+ } else if font.eq_ignore_ascii_case("Wingdings 3") {
+ Some(WINGDINGS_3)
+ } else if font.eq_ignore_ascii_case("Webdings") {
+ Some(WEBDINGS)
+ } else if font.eq_ignore_ascii_case("Symbol") {
+ Some(SYMBOL)
+ } else {
+ None
+ }
+}
+
+/// Wingdings: the code page Word's `w:sym` draws from (gaps are not in the font).
+static WINGDINGS: &[(u8, &str)] = &[
+ (0x20, "\u{20}"),
+ (0x21, "\u{1f589}"),
+ (0x22, "\u{2702}"),
+ (0x23, "\u{2701}"),
+ (0x24, "\u{1f453}"),
+ (0x25, "\u{1f56d}"),
+ (0x26, "\u{1f56e}"),
+ (0x27, "\u{1f56f}"),
+ (0x28, "\u{1f57f}"),
+ (0x29, "\u{2706}"),
+ (0x2a, "\u{1f582}"),
+ (0x2b, "\u{1f583}"),
+ (0x2c, "\u{1f4ea}"),
+ (0x2d, "\u{1f4eb}"),
+ (0x2e, "\u{1f4ec}"),
+ (0x2f, "\u{1f4ed}"),
+ (0x30, "\u{1f4c1}"),
+ (0x31, "\u{1f4c2}"),
+ (0x32, "\u{1f4c4}"),
+ (0x33, "\u{1f5cf}"),
+ (0x34, "\u{1f5d0}"),
+ (0x35, "\u{1f5c4}"),
+ (0x36, "\u{231b}"),
+ (0x37, "\u{1f5ae}"),
+ (0x38, "\u{1f5b0}"),
+ (0x39, "\u{1f5b2}"),
+ (0x3a, "\u{1f5b3}"),
+ (0x3b, "\u{1f5b4}"),
+ (0x3c, "\u{1f5ab}"),
+ (0x3d, "\u{1f5ac}"),
+ (0x3e, "\u{2707}"),
+ (0x3f, "\u{270d}"),
+ (0x40, "\u{1f58e}"),
+ (0x41, "\u{270c}"),
+ (0x42, "\u{1f44c}"),
+ (0x43, "\u{1f44d}"),
+ (0x44, "\u{1f44e}"),
+ (0x45, "\u{261c}"),
+ (0x46, "\u{261e}"),
+ (0x47, "\u{261d}"),
+ (0x48, "\u{261f}"),
+ (0x49, "\u{1f590}"),
+ (0x4a, "\u{263a}"),
+ (0x4b, "\u{1f610}"),
+ (0x4c, "\u{2639}"),
+ (0x4d, "\u{1f4a3}"),
+ (0x4e, "\u{2620}"),
+ (0x4f, "\u{1f3f3}"),
+ (0x50, "\u{1f3f1}"),
+ (0x51, "\u{2708}"),
+ (0x52, "\u{263c}"),
+ (0x53, "\u{1f4a7}"),
+ (0x54, "\u{2744}"),
+ (0x55, "\u{1f546}"),
+ (0x56, "\u{271e}"),
+ (0x57, "\u{1f548}"),
+ (0x58, "\u{2720}"),
+ (0x59, "\u{2721}"),
+ (0x5a, "\u{262a}"),
+ (0x5b, "\u{262f}"),
+ (0x5c, "\u{950}"),
+ (0x5d, "\u{2638}"),
+ (0x5e, "\u{2648}"),
+ (0x5f, "\u{2649}"),
+ (0x60, "\u{264a}"),
+ (0x61, "\u{264b}"),
+ (0x62, "\u{264c}"),
+ (0x63, "\u{264d}"),
+ (0x64, "\u{264e}"),
+ (0x65, "\u{264f}"),
+ (0x66, "\u{2650}"),
+ (0x67, "\u{2651}"),
+ (0x68, "\u{2652}"),
+ (0x69, "\u{2653}"),
+ (0x6a, "\u{1f670}"),
+ (0x6b, "\u{1f675}"),
+ (0x6c, "\u{25cf}"),
+ (0x6d, "\u{1f53e}"),
+ (0x6e, "\u{25a0}"),
+ (0x6f, "\u{25a1}"),
+ (0x70, "\u{1f790}"),
+ (0x71, "\u{2751}"),
+ (0x72, "\u{2752}"),
+ (0x73, "\u{2b27}"),
+ (0x74, "\u{29eb}"),
+ (0x75, "\u{25c6}"),
+ (0x76, "\u{2756}"),
+ (0x77, "\u{2b25}"),
+ (0x78, "\u{2327}"),
+ (0x79, "\u{2bb9}"),
+ (0x7a, "\u{2318}"),
+ (0x7b, "\u{1f3f5}"),
+ (0x7c, "\u{1f3f6}"),
+ (0x7d, "\u{1f676}"),
+ (0x7e, "\u{1f677}"),
+ (0x80, "\u{24ea}"),
+ (0x81, "\u{2460}"),
+ (0x82, "\u{2461}"),
+ (0x83, "\u{2462}"),
+ (0x84, "\u{2463}"),
+ (0x85, "\u{2464}"),
+ (0x86, "\u{2465}"),
+ (0x87, "\u{2466}"),
+ (0x88, "\u{2467}"),
+ (0x89, "\u{2468}"),
+ (0x8a, "\u{2469}"),
+ (0x8b, "\u{24ff}"),
+ (0x8c, "\u{2776}"),
+ (0x8d, "\u{2777}"),
+ (0x8e, "\u{2778}"),
+ (0x8f, "\u{2779}"),
+ (0x90, "\u{277a}"),
+ (0x91, "\u{277b}"),
+ (0x92, "\u{277c}"),
+ (0x93, "\u{277d}"),
+ (0x94, "\u{277e}"),
+ (0x95, "\u{277f}"),
+ (0x96, "\u{1f662}"),
+ (0x97, "\u{1f660}"),
+ (0x98, "\u{1f661}"),
+ (0x99, "\u{1f663}"),
+ (0x9a, "\u{1f65e}"),
+ (0x9b, "\u{1f65c}"),
+ (0x9c, "\u{1f65d}"),
+ (0x9d, "\u{1f65f}"),
+ (0x9e, "\u{b7}"),
+ (0x9f, "\u{2022}"),
+ (0xa0, "\u{25aa}"),
+ (0xa1, "\u{26aa}"),
+ (0xa2, "\u{1f786}"),
+ (0xa3, "\u{1f788}"),
+ (0xa4, "\u{25c9}"),
+ (0xa5, "\u{25ce}"),
+ (0xa6, "\u{1f53f}"),
+ (0xa7, "\u{25aa}"),
+ (0xa8, "\u{25fb}"),
+ (0xa9, "\u{1f7c2}"),
+ (0xaa, "\u{2726}"),
+ (0xab, "\u{2605}"),
+ (0xac, "\u{2736}"),
+ (0xad, "\u{2734}"),
+ (0xae, "\u{2739}"),
+ (0xaf, "\u{2735}"),
+ (0xb0, "\u{2bd0}"),
+ (0xb1, "\u{2316}"),
+ (0xb2, "\u{27e1}"),
+ (0xb3, "\u{2311}"),
+ (0xb4, "\u{2bd1}"),
+ (0xb5, "\u{272a}"),
+ (0xb6, "\u{2730}"),
+ (0xb7, "\u{1f550}"),
+ (0xb8, "\u{1f551}"),
+ (0xb9, "\u{1f552}"),
+ (0xba, "\u{1f553}"),
+ (0xbb, "\u{1f554}"),
+ (0xbc, "\u{1f555}"),
+ (0xbd, "\u{1f556}"),
+ (0xbe, "\u{1f557}"),
+ (0xbf, "\u{1f558}"),
+ (0xc0, "\u{1f559}"),
+ (0xc1, "\u{1f55a}"),
+ (0xc2, "\u{1f55b}"),
+ (0xc3, "\u{2bb0}"),
+ (0xc4, "\u{2bb1}"),
+ (0xc5, "\u{2bb2}"),
+ (0xc6, "\u{2bb3}"),
+ (0xc7, "\u{2bb4}"),
+ (0xc8, "\u{2bb5}"),
+ (0xc9, "\u{2bb6}"),
+ (0xca, "\u{2bb7}"),
+ (0xcb, "\u{1f66a}"),
+ (0xcc, "\u{1f66b}"),
+ (0xcd, "\u{1f595}"),
+ (0xce, "\u{1f594}"),
+ (0xcf, "\u{1f597}"),
+ (0xd0, "\u{1f596}"),
+ (0xd1, "\u{1f590}"),
+ (0xd2, "\u{1f591}"),
+ (0xd3, "\u{1f592}"),
+ (0xd4, "\u{1f593}"),
+ (0xd5, "\u{232b}"),
+ (0xd6, "\u{2326}"),
+ (0xd7, "\u{2b98}"),
+ (0xd8, "\u{27a2}"),
+ (0xd9, "\u{2b99}"),
+ (0xda, "\u{2b9b}"),
+ (0xdb, "\u{2b88}"),
+ (0xdc, "\u{2b8a}"),
+ (0xdd, "\u{2b89}"),
+ (0xde, "\u{2b8b}"),
+ (0xdf, "\u{1f868}"),
+ (0xe0, "\u{1f86a}"),
+ (0xe1, "\u{1f869}"),
+ (0xe2, "\u{1f86b}"),
+ (0xe3, "\u{1f86c}"),
+ (0xe4, "\u{1f86d}"),
+ (0xe5, "\u{1f86f}"),
+ (0xe6, "\u{1f86e}"),
+ (0xe7, "\u{1f878}"),
+ (0xe8, "\u{1f87a}"),
+ (0xe9, "\u{1f879}"),
+ (0xea, "\u{1f87b}"),
+ (0xeb, "\u{1f87c}"),
+ (0xec, "\u{1f87d}"),
+ (0xed, "\u{1f87f}"),
+ (0xee, "\u{1f87e}"),
+ (0xef, "\u{21e6}"),
+ (0xf0, "\u{21e8}"),
+ (0xf1, "\u{21e7}"),
+ (0xf2, "\u{21e9}"),
+ (0xf3, "\u{2b04}"),
+ (0xf4, "\u{21f3}"),
+ (0xf5, "\u{2b00}"),
+ (0xf6, "\u{2b01}"),
+ (0xf7, "\u{2b03}"),
+ (0xf8, "\u{2b02}"),
+ (0xf9, "\u{1f86c}"),
+ (0xfa, "\u{1f86d}"),
+ (0xfb, "\u{1f5f6}"),
+ (0xfc, "\u{2713}"),
+ (0xfd, "\u{1f5f7}"),
+ (0xfe, "\u{1f5f9}"),
+ (0xff, "\u{229e}"),
+];
+
+/// Wingdings 2: the code page Word's `w:sym` draws from (gaps are not in the font).
+static WINGDINGS_2: &[(u8, &str)] = &[
+ (0x20, "\u{20}"),
+ (0x21, "\u{1f58a}"),
+ (0x22, "\u{1f58b}"),
+ (0x23, "\u{1f58c}"),
+ (0x24, "\u{1f58d}"),
+ (0x25, "\u{2704}"),
+ (0x26, "\u{2700}"),
+ (0x27, "\u{1f57e}"),
+ (0x28, "\u{1f57d}"),
+ (0x29, "\u{1f5c5}"),
+ (0x2a, "\u{1f5c6}"),
+ (0x2b, "\u{1f5c7}"),
+ (0x2c, "\u{1f5c8}"),
+ (0x2d, "\u{1f5c9}"),
+ (0x2e, "\u{1f5ca}"),
+ (0x2f, "\u{1f5cb}"),
+ (0x30, "\u{1f5cc}"),
+ (0x31, "\u{1f5cd}"),
+ (0x32, "\u{1f4cb}"),
+ (0x33, "\u{1f5d1}"),
+ (0x34, "\u{1f5d4}"),
+ (0x35, "\u{1f5b5}"),
+ (0x36, "\u{1f5b6}"),
+ (0x37, "\u{1f5b7}"),
+ (0x38, "\u{1f5b8}"),
+ (0x39, "\u{1f5ad}"),
+ (0x3a, "\u{1f5af}"),
+ (0x3b, "\u{1f5b1}"),
+ (0x3c, "\u{1f592}"),
+ (0x3d, "\u{1f593}"),
+ (0x3e, "\u{1f598}"),
+ (0x3f, "\u{1f599}"),
+ (0x40, "\u{1f59a}"),
+ (0x41, "\u{1f59b}"),
+ (0x42, "\u{1f448}"),
+ (0x43, "\u{1f449}"),
+ (0x44, "\u{1f59c}"),
+ (0x45, "\u{1f59d}"),
+ (0x46, "\u{1f59e}"),
+ (0x47, "\u{1f59f}"),
+ (0x48, "\u{1f5a0}"),
+ (0x49, "\u{1f5a1}"),
+ (0x4a, "\u{1f446}"),
+ (0x4b, "\u{1f447}"),
+ (0x4c, "\u{1f5a2}"),
+ (0x4d, "\u{1f5a3}"),
+ (0x4e, "\u{1f591}"),
+ (0x4f, "\u{1f5f4}"),
+ (0x50, "\u{2713}"),
+ (0x51, "\u{1f5f5}"),
+ (0x52, "\u{2611}"),
+ (0x53, "\u{2612}"),
+ (0x54, "\u{2612}"),
+ (0x55, "\u{2bbe}"),
+ (0x56, "\u{2bbf}"),
+ (0x57, "\u{29b8}"),
+ (0x58, "\u{29b8}"),
+ (0x59, "\u{1f671}"),
+ (0x5a, "\u{1f674}"),
+ (0x5b, "\u{1f672}"),
+ (0x5c, "\u{1f673}"),
+ (0x5d, "\u{203d}"),
+ (0x5e, "\u{1f679}"),
+ (0x5f, "\u{1f67a}"),
+ (0x60, "\u{1f67b}"),
+ (0x61, "\u{1f666}"),
+ (0x62, "\u{1f664}"),
+ (0x63, "\u{1f665}"),
+ (0x64, "\u{1f667}"),
+ (0x65, "\u{1f65a}"),
+ (0x66, "\u{1f658}"),
+ (0x67, "\u{1f659}"),
+ (0x68, "\u{1f65b}"),
+ (0x69, "\u{24ea}"),
+ (0x6a, "\u{2460}"),
+ (0x6b, "\u{2461}"),
+ (0x6c, "\u{2462}"),
+ (0x6d, "\u{2463}"),
+ (0x6e, "\u{2464}"),
+ (0x6f, "\u{2465}"),
+ (0x70, "\u{2466}"),
+ (0x71, "\u{2467}"),
+ (0x72, "\u{2468}"),
+ (0x73, "\u{2469}"),
+ (0x74, "\u{24ff}"),
+ (0x75, "\u{2776}"),
+ (0x76, "\u{2777}"),
+ (0x77, "\u{2778}"),
+ (0x78, "\u{2779}"),
+ (0x79, "\u{277a}"),
+ (0x7a, "\u{277b}"),
+ (0x7b, "\u{277c}"),
+ (0x7c, "\u{277d}"),
+ (0x7d, "\u{277e}"),
+ (0x7e, "\u{277f}"),
+ (0x80, "\u{2609}"),
+ (0x81, "\u{1f315}"),
+ (0x82, "\u{263d}"),
+ (0x83, "\u{263e}"),
+ (0x84, "\u{2e3f}"),
+ (0x85, "\u{271d}"),
+ (0x86, "\u{1f547}"),
+ (0x87, "\u{1f55c}"),
+ (0x88, "\u{1f55d}"),
+ (0x89, "\u{1f55e}"),
+ (0x8a, "\u{1f55f}"),
+ (0x8b, "\u{1f560}"),
+ (0x8c, "\u{1f561}"),
+ (0x8d, "\u{1f562}"),
+ (0x8e, "\u{1f563}"),
+ (0x8f, "\u{1f564}"),
+ (0x90, "\u{1f565}"),
+ (0x91, "\u{1f566}"),
+ (0x92, "\u{1f567}"),
+ (0x93, "\u{1f668}"),
+ (0x94, "\u{1f669}"),
+ (0x95, "\u{2022}"),
+ (0x96, "\u{25cf}"),
+ (0x97, "\u{26ab}"),
+ (0x98, "\u{2b24}"),
+ (0x99, "\u{1f785}"),
+ (0x9a, "\u{1f786}"),
+ (0x9b, "\u{1f787}"),
+ (0x9c, "\u{1f788}"),
+ (0x9d, "\u{1f78a}"),
+ (0x9e, "\u{29bf}"),
+ (0x9f, "\u{25fe}"),
+ (0xa0, "\u{25a0}"),
+ (0xa1, "\u{25fc}"),
+ (0xa2, "\u{2b1b}"),
+ (0xa3, "\u{2b1c}"),
+ (0xa4, "\u{1f791}"),
+ (0xa5, "\u{1f792}"),
+ (0xa6, "\u{1f793}"),
+ (0xa7, "\u{1f794}"),
+ (0xa8, "\u{25a3}"),
+ (0xa9, "\u{1f795}"),
+ (0xaa, "\u{1f796}"),
+ (0xab, "\u{1f797}"),
+ (0xac, "\u{2b29}"),
+ (0xad, "\u{2b25}"),
+ (0xae, "\u{25c6}"),
+ (0xaf, "\u{25c7}"),
+ (0xb0, "\u{1f79a}"),
+ (0xb1, "\u{25c8}"),
+ (0xb2, "\u{1f79b}"),
+ (0xb3, "\u{1f79c}"),
+ (0xb4, "\u{1f79d}"),
+ (0xb5, "\u{2b2a}"),
+ (0xb6, "\u{2b27}"),
+ (0xb7, "\u{29eb}"),
+ (0xb8, "\u{25ca}"),
+ (0xb9, "\u{1f7a0}"),
+ (0xba, "\u{25d6}"),
+ (0xbb, "\u{25d7}"),
+ (0xbc, "\u{2bca}"),
+ (0xbd, "\u{2bcb}"),
+ (0xbe, "\u{25fc}"),
+ (0xbf, "\u{2b25}"),
+ (0xc0, "\u{2b1f}"),
+ (0xc1, "\u{2bc2}"),
+ (0xc2, "\u{2b23}"),
+ (0xc3, "\u{2b22}"),
+ (0xc4, "\u{2bc3}"),
+ (0xc5, "\u{2bc4}"),
+ (0xc6, "\u{1f7a1}"),
+ (0xc7, "\u{1f7a2}"),
+ (0xc8, "\u{1f7a3}"),
+ (0xc9, "\u{1f7a4}"),
+ (0xca, "\u{1f7a5}"),
+ (0xcb, "\u{1f7a6}"),
+ (0xcc, "\u{1f7a7}"),
+ (0xcd, "\u{1f7a8}"),
+ (0xce, "\u{1f7a9}"),
+ (0xcf, "\u{1f7aa}"),
+ (0xd0, "\u{1f7ab}"),
+ (0xd1, "\u{1f7ac}"),
+ (0xd2, "\u{1f7ad}"),
+ (0xd3, "\u{1f7ae}"),
+ (0xd4, "\u{1f7af}"),
+ (0xd5, "\u{1f7b0}"),
+ (0xd6, "\u{1f7b1}"),
+ (0xd7, "\u{1f7b2}"),
+ (0xd8, "\u{1f7b3}"),
+ (0xd9, "\u{1f7b4}"),
+ (0xda, "\u{1f7b5}"),
+ (0xdb, "\u{1f7b6}"),
+ (0xdc, "\u{1f7b7}"),
+ (0xdd, "\u{1f7b8}"),
+ (0xde, "\u{1f7b9}"),
+ (0xdf, "\u{1f7ba}"),
+ (0xe0, "\u{1f7bb}"),
+ (0xe1, "\u{1f7bc}"),
+ (0xe2, "\u{1f7bd}"),
+ (0xe3, "\u{1f7be}"),
+ (0xe4, "\u{1f7bf}"),
+ (0xe5, "\u{1f7c0}"),
+ (0xe6, "\u{1f7c2}"),
+ (0xe7, "\u{1f7c4}"),
+ (0xe8, "\u{2726}"),
+ (0xe9, "\u{1f7c9}"),
+ (0xea, "\u{2605}"),
+ (0xeb, "\u{2736}"),
+ (0xec, "\u{1f7cb}"),
+ (0xed, "\u{2737}"),
+ (0xee, "\u{1f7cf}"),
+ (0xef, "\u{1f7d2}"),
+ (0xf0, "\u{2739}"),
+ (0xf1, "\u{1f7c3}"),
+ (0xf2, "\u{1f7c7}"),
+ (0xf3, "\u{272f}"),
+ (0xf4, "\u{1f7cd}"),
+ (0xf5, "\u{1f7d4}"),
+ (0xf6, "\u{2bcc}"),
+ (0xf7, "\u{2bcd}"),
+ (0xf8, "\u{203b}"),
+ (0xf9, "\u{2042}"),
+];
+
+/// Wingdings 3: the code page Word's `w:sym` draws from (gaps are not in the font).
+static WINGDINGS_3: &[(u8, &str)] = &[
+ (0x20, "\u{20}"),
+ (0x21, "\u{2b60}"),
+ (0x22, "\u{2b62}"),
+ (0x23, "\u{2b61}"),
+ (0x24, "\u{2b63}"),
+ (0x25, "\u{2b66}"),
+ (0x26, "\u{2b67}"),
+ (0x27, "\u{2b69}"),
+ (0x28, "\u{2b68}"),
+ (0x29, "\u{2b70}"),
+ (0x2a, "\u{2b72}"),
+ (0x2b, "\u{2b71}"),
+ (0x2c, "\u{2b73}"),
+ (0x2d, "\u{2b76}"),
+ (0x2e, "\u{2b78}"),
+ (0x2f, "\u{2b7b}"),
+ (0x30, "\u{2b7d}"),
+ (0x31, "\u{2b64}"),
+ (0x32, "\u{2b65}"),
+ (0x33, "\u{2b6a}"),
+ (0x34, "\u{2b6c}"),
+ (0x35, "\u{2b6b}"),
+ (0x36, "\u{2b6d}"),
+ (0x37, "\u{2b4d}"),
+ (0x38, "\u{2ba0}"),
+ (0x39, "\u{2ba1}"),
+ (0x3a, "\u{2ba2}"),
+ (0x3b, "\u{2ba3}"),
+ (0x3c, "\u{2ba4}"),
+ (0x3d, "\u{2ba5}"),
+ (0x3e, "\u{2ba6}"),
+ (0x3f, "\u{2ba7}"),
+ (0x40, "\u{2b90}"),
+ (0x41, "\u{2b91}"),
+ (0x42, "\u{2b92}"),
+ (0x43, "\u{2b93}"),
+ (0x44, "\u{2b80}"),
+ (0x45, "\u{2b83}"),
+ (0x46, "\u{2b7e}"),
+ (0x47, "\u{2b7f}"),
+ (0x48, "\u{2b84}"),
+ (0x49, "\u{2b86}"),
+ (0x4a, "\u{2b85}"),
+ (0x4b, "\u{2b87}"),
+ (0x4c, "\u{2b8f}"),
+ (0x4d, "\u{2b8d}"),
+ (0x4e, "\u{2b8e}"),
+ (0x4f, "\u{2b8c}"),
+ (0x50, "\u{2b6e}"),
+ (0x51, "\u{2b6f}"),
+ (0x52, "\u{238b}"),
+ (0x53, "\u{2324}"),
+ (0x54, "\u{2303}"),
+ (0x55, "\u{2325}"),
+ (0x56, "\u{23b5}"),
+ (0x57, "\u{237d}"),
+ (0x58, "\u{21ea}"),
+ (0x59, "\u{2bb8}"),
+ (0x5a, "\u{1f8a0}"),
+ (0x5b, "\u{1f8a1}"),
+ (0x5c, "\u{1f8a2}"),
+ (0x5d, "\u{1f8a3}"),
+ (0x5e, "\u{1f8a4}"),
+ (0x5f, "\u{1f8a5}"),
+ (0x60, "\u{1f8a6}"),
+ (0x61, "\u{1f8a7}"),
+ (0x62, "\u{1f8a8}"),
+ (0x63, "\u{1f8a9}"),
+ (0x64, "\u{1f8aa}"),
+ (0x65, "\u{1f8ab}"),
+ (0x66, "\u{2190}"),
+ (0x67, "\u{2192}"),
+ (0x68, "\u{2191}"),
+ (0x69, "\u{2193}"),
+ (0x6a, "\u{2196}"),
+ (0x6b, "\u{2197}"),
+ (0x6c, "\u{2199}"),
+ (0x6d, "\u{2198}"),
+ (0x6e, "\u{1f858}"),
+ (0x6f, "\u{1f859}"),
+ (0x70, "\u{25b2}"),
+ (0x71, "\u{25bc}"),
+ (0x72, "\u{25b3}"),
+ (0x73, "\u{25bd}"),
+ (0x74, "\u{25c4}"),
+ (0x75, "\u{25ba}"),
+ (0x76, "\u{25c1}"),
+ (0x77, "\u{25b7}"),
+ (0x78, "\u{25e3}"),
+ (0x79, "\u{25e2}"),
+ (0x7a, "\u{25e4}"),
+ (0x7b, "\u{25e5}"),
+ (0x7c, "\u{1f780}"),
+ (0x7d, "\u{1f782}"),
+ (0x7e, "\u{1f781}"),
+ (0x80, "\u{1f783}"),
+ (0x81, "\u{25b2}"),
+ (0x82, "\u{25bc}"),
+ (0x83, "\u{25c0}"),
+ (0x84, "\u{25b6}"),
+ (0x85, "\u{2b9c}"),
+ (0x86, "\u{2b9e}"),
+ (0x87, "\u{2b9d}"),
+ (0x88, "\u{2b9f}"),
+ (0x89, "\u{1f810}"),
+ (0x8a, "\u{1f812}"),
+ (0x8b, "\u{1f811}"),
+ (0x8c, "\u{1f813}"),
+ (0x8d, "\u{1f814}"),
+ (0x8e, "\u{1f816}"),
+ (0x8f, "\u{1f815}"),
+ (0x90, "\u{1f817}"),
+ (0x91, "\u{1f818}"),
+ (0x92, "\u{1f81a}"),
+ (0x93, "\u{1f819}"),
+ (0x94, "\u{1f81b}"),
+ (0x95, "\u{1f81c}"),
+ (0x96, "\u{1f81e}"),
+ (0x97, "\u{1f81d}"),
+ (0x98, "\u{1f81f}"),
+ (0x99, "\u{1f800}"),
+ (0x9a, "\u{1f802}"),
+ (0x9b, "\u{1f801}"),
+ (0x9c, "\u{1f803}"),
+ (0x9d, "\u{1f804}"),
+ (0x9e, "\u{1f806}"),
+ (0x9f, "\u{1f805}"),
+ (0xa0, "\u{1f807}"),
+ (0xa1, "\u{1f808}"),
+ (0xa2, "\u{1f80a}"),
+ (0xa3, "\u{1f809}"),
+ (0xa4, "\u{1f80b}"),
+ (0xa5, "\u{1f820}"),
+ (0xa6, "\u{1f822}"),
+ (0xa7, "\u{1f824}"),
+ (0xa8, "\u{1f826}"),
+ (0xa9, "\u{1f828}"),
+ (0xaa, "\u{1f82a}"),
+ (0xab, "\u{1f82c}"),
+ (0xac, "\u{1f89c}"),
+ (0xad, "\u{1f89d}"),
+ (0xae, "\u{1f89e}"),
+ (0xaf, "\u{1f89f}"),
+ (0xb0, "\u{1f82e}"),
+ (0xb1, "\u{1f830}"),
+ (0xb2, "\u{1f832}"),
+ (0xb3, "\u{1f834}"),
+ (0xb4, "\u{1f836}"),
+ (0xb5, "\u{1f838}"),
+ (0xb6, "\u{1f83a}"),
+ (0xb7, "\u{1f839}"),
+ (0xb8, "\u{1f83b}"),
+ (0xb9, "\u{1f898}"),
+ (0xba, "\u{1f89a}"),
+ (0xbb, "\u{1f899}"),
+ (0xbc, "\u{1f89b}"),
+ (0xbd, "\u{1f83c}"),
+ (0xbe, "\u{1f83e}"),
+ (0xbf, "\u{1f83d}"),
+ (0xc0, "\u{1f83f}"),
+ (0xc1, "\u{1f840}"),
+ (0xc2, "\u{1f842}"),
+ (0xc3, "\u{1f841}"),
+ (0xc4, "\u{1f843}"),
+ (0xc5, "\u{1f844}"),
+ (0xc6, "\u{1f846}"),
+ (0xc7, "\u{1f845}"),
+ (0xc8, "\u{1f847}"),
+ (0xc9, "\u{2ba8}"),
+ (0xca, "\u{2ba9}"),
+ (0xcb, "\u{2baa}"),
+ (0xcc, "\u{2bab}"),
+ (0xcd, "\u{2bac}"),
+ (0xce, "\u{2bad}"),
+ (0xcf, "\u{2bae}"),
+ (0xd0, "\u{2baf}"),
+ (0xd1, "\u{1f860}"),
+ (0xd2, "\u{1f862}"),
+ (0xd3, "\u{1f861}"),
+ (0xd4, "\u{1f863}"),
+ (0xd5, "\u{1f864}"),
+ (0xd6, "\u{1f865}"),
+ (0xd7, "\u{1f867}"),
+ (0xd8, "\u{1f866}"),
+ (0xd9, "\u{1f870}"),
+ (0xda, "\u{1f872}"),
+ (0xdb, "\u{1f871}"),
+ (0xdc, "\u{1f873}"),
+ (0xdd, "\u{1f874}"),
+ (0xde, "\u{1f875}"),
+ (0xdf, "\u{1f877}"),
+ (0xe0, "\u{1f876}"),
+ (0xe1, "\u{1f880}"),
+ (0xe2, "\u{1f882}"),
+ (0xe3, "\u{1f881}"),
+ (0xe4, "\u{1f883}"),
+ (0xe5, "\u{1f884}"),
+ (0xe6, "\u{1f885}"),
+ (0xe7, "\u{1f887}"),
+ (0xe8, "\u{1f886}"),
+ (0xe9, "\u{1f890}"),
+ (0xea, "\u{1f892}"),
+ (0xeb, "\u{1f891}"),
+ (0xec, "\u{1f893}"),
+ (0xed, "\u{1f894}"),
+ (0xee, "\u{1f896}"),
+ (0xef, "\u{1f895}"),
+ (0xf0, "\u{1f897}"),
+];
+
+/// Webdings: the code page Word's `w:sym` draws from (gaps are not in the font).
+static WEBDINGS: &[(u8, &str)] = &[
+ (0x20, "\u{20}"),
+ (0x21, "\u{1f577}"),
+ (0x22, "\u{1f578}"),
+ (0x23, "\u{1f572}"),
+ (0x24, "\u{1f576}"),
+ (0x25, "\u{1f3c6}"),
+ (0x26, "\u{1f396}"),
+ (0x27, "\u{1f587}"),
+ (0x28, "\u{1f5e8}"),
+ (0x29, "\u{1f5e9}"),
+ (0x2a, "\u{1f5f0}"),
+ (0x2b, "\u{1f5f1}"),
+ (0x2c, "\u{1f336}"),
+ (0x2d, "\u{1f397}"),
+ (0x2e, "\u{1f67e}"),
+ (0x2f, "\u{1f67c}"),
+ (0x30, "\u{1f5d5}"),
+ (0x31, "\u{1f5d6}"),
+ (0x32, "\u{1f5d7}"),
+ (0x33, "\u{23f4}"),
+ (0x34, "\u{23f5}"),
+ (0x35, "\u{23f6}"),
+ (0x36, "\u{23f7}"),
+ (0x37, "\u{23ea}"),
+ (0x38, "\u{23e9}"),
+ (0x39, "\u{23ee}"),
+ (0x3a, "\u{23ed}"),
+ (0x3b, "\u{23f8}"),
+ (0x3c, "\u{23f9}"),
+ (0x3d, "\u{23fa}"),
+ (0x3e, "\u{1f5da}"),
+ (0x3f, "\u{1f5f3}"),
+ (0x40, "\u{1f6e0}"),
+ (0x41, "\u{1f3d7}"),
+ (0x42, "\u{1f3d8}"),
+ (0x43, "\u{1f3d9}"),
+ (0x44, "\u{1f3da}"),
+ (0x45, "\u{1f3dc}"),
+ (0x46, "\u{1f3ed}"),
+ (0x47, "\u{1f3db}"),
+ (0x48, "\u{1f3e0}"),
+ (0x49, "\u{1f3d6}"),
+ (0x4a, "\u{1f3dd}"),
+ (0x4b, "\u{1f6e3}"),
+ (0x4c, "\u{1f50d}"),
+ (0x4d, "\u{1f3d4}"),
+ (0x4e, "\u{1f441}"),
+ (0x4f, "\u{1f442}"),
+ (0x50, "\u{1f3de}"),
+ (0x51, "\u{1f3d5}"),
+ (0x52, "\u{1f6e4}"),
+ (0x53, "\u{1f3df}"),
+ (0x54, "\u{1f6f3}"),
+ (0x55, "\u{1f56c}"),
+ (0x56, "\u{1f56b}"),
+ (0x57, "\u{1f568}"),
+ (0x58, "\u{1f508}"),
+ (0x59, "\u{1f394}"),
+ (0x5a, "\u{1f395}"),
+ (0x5b, "\u{1f5ec}"),
+ (0x5c, "\u{1f67d}"),
+ (0x5d, "\u{1f5ed}"),
+ (0x5e, "\u{1f5ea}"),
+ (0x5f, "\u{1f5eb}"),
+ (0x60, "\u{2b94}"),
+ (0x61, "\u{2714}"),
+ (0x62, "\u{1f6b2}"),
+ (0x63, "\u{25a1}"),
+ (0x64, "\u{1f6e1}"),
+ (0x65, "\u{1f4e6}"),
+ (0x66, "\u{1f6f1}"),
+ (0x67, "\u{25a0}"),
+ (0x68, "\u{1f691}"),
+ (0x69, "\u{1f6c8}"),
+ (0x6a, "\u{1f6e9}"),
+ (0x6b, "\u{1f6f0}"),
+ (0x6c, "\u{1f7c8}"),
+ (0x6d, "\u{1f574}"),
+ (0x6e, "\u{26ab}"),
+ (0x6f, "\u{1f6e5}"),
+ (0x70, "\u{1f694}"),
+ (0x71, "\u{1f5d8}"),
+ (0x72, "\u{1f5d9}"),
+ (0x73, "\u{2753}"),
+ (0x74, "\u{1f6f2}"),
+ (0x75, "\u{1f687}"),
+ (0x76, "\u{1f68d}"),
+ (0x77, "\u{26f3}"),
+ (0x78, "\u{1f6c7}"),
+ (0x79, "\u{2296}"),
+ (0x7a, "\u{1f6ad}"),
+ (0x7b, "\u{1f5ee}"),
+ (0x7c, "\u{7c}"),
+ (0x7d, "\u{1f5ef}"),
+ (0x7e, "\u{1f5f2}"),
+ (0x80, "\u{1f6b9}"),
+ (0x81, "\u{1f6ba}"),
+ (0x82, "\u{1f6c9}"),
+ (0x83, "\u{1f6ca}"),
+ (0x84, "\u{1f6bc}"),
+ (0x85, "\u{1f47d}"),
+ (0x86, "\u{1f3cb}"),
+ (0x87, "\u{26f7}"),
+ (0x88, "\u{1f3c2}"),
+ (0x89, "\u{1f3cc}"),
+ (0x8a, "\u{1f3ca}"),
+ (0x8b, "\u{1f3c4}"),
+ (0x8c, "\u{1f3cd}"),
+ (0x8d, "\u{1f3ce}"),
+ (0x8e, "\u{1f698}"),
+ (0x8f, "\u{1f5e0}"),
+ (0x90, "\u{1f6e2}"),
+ (0x91, "\u{1f4b0}"),
+ (0x92, "\u{1f3f7}"),
+ (0x93, "\u{1f4b3}"),
+ (0x94, "\u{1f46a}"),
+ (0x95, "\u{1f5e1}"),
+ (0x96, "\u{1f5e2}"),
+ (0x97, "\u{1f5e3}"),
+ (0x98, "\u{272f}"),
+ (0x99, "\u{1f584}"),
+ (0x9a, "\u{1f585}"),
+ (0x9b, "\u{1f583}"),
+ (0x9c, "\u{1f586}"),
+ (0x9d, "\u{1f5b9}"),
+ (0x9e, "\u{1f5ba}"),
+ (0x9f, "\u{1f5bb}"),
+ (0xa0, "\u{1f575}"),
+ (0xa1, "\u{1f570}"),
+ (0xa2, "\u{1f5bd}"),
+ (0xa3, "\u{1f5be}"),
+ (0xa4, "\u{1f4cb}"),
+ (0xa5, "\u{1f5d2}"),
+ (0xa6, "\u{1f5d3}"),
+ (0xa7, "\u{1f4d6}"),
+ (0xa8, "\u{1f4da}"),
+ (0xa9, "\u{1f5de}"),
+ (0xaa, "\u{1f5df}"),
+ (0xab, "\u{1f5c3}"),
+ (0xac, "\u{1f5c2}"),
+ (0xad, "\u{1f5bc}"),
+ (0xae, "\u{1f3ad}"),
+ (0xaf, "\u{1f39c}"),
+ (0xb0, "\u{1f398}"),
+ (0xb1, "\u{1f399}"),
+ (0xb2, "\u{1f3a7}"),
+ (0xb3, "\u{1f4bf}"),
+ (0xb4, "\u{1f39e}"),
+ (0xb5, "\u{1f4f7}"),
+ (0xb6, "\u{1f39f}"),
+ (0xb7, "\u{1f3ac}"),
+ (0xb8, "\u{1f4fd}"),
+ (0xb9, "\u{1f4f9}"),
+ (0xba, "\u{1f4fe}"),
+ (0xbb, "\u{1f4fb}"),
+ (0xbc, "\u{1f39a}"),
+ (0xbd, "\u{1f39b}"),
+ (0xbe, "\u{1f4fa}"),
+ (0xbf, "\u{1f4bb}"),
+ (0xc0, "\u{1f5a5}"),
+ (0xc1, "\u{1f5a6}"),
+ (0xc2, "\u{1f5a7}"),
+ (0xc3, "\u{1f579}"),
+ (0xc4, "\u{1f3ae}"),
+ (0xc5, "\u{1f57b}"),
+ (0xc6, "\u{1f57c}"),
+ (0xc7, "\u{1f4df}"),
+ (0xc8, "\u{1f581}"),
+ (0xc9, "\u{1f580}"),
+ (0xca, "\u{1f5a8}"),
+ (0xcb, "\u{1f5a9}"),
+ (0xcc, "\u{1f5bf}"),
+ (0xcd, "\u{1f5aa}"),
+ (0xce, "\u{1f5dc}"),
+ (0xcf, "\u{1f512}"),
+ (0xd0, "\u{1f513}"),
+ (0xd1, "\u{1f5dd}"),
+ (0xd2, "\u{1f4e5}"),
+ (0xd3, "\u{1f4e4}"),
+ (0xd4, "\u{1f573}"),
+ (0xd5, "\u{1f323}"),
+ (0xd6, "\u{1f324}"),
+ (0xd7, "\u{1f325}"),
+ (0xd8, "\u{1f326}"),
+ (0xd9, "\u{2601}"),
+ (0xda, "\u{1f327}"),
+ (0xdb, "\u{1f328}"),
+ (0xdc, "\u{1f329}"),
+ (0xdd, "\u{1f32a}"),
+ (0xde, "\u{1f32c}"),
+ (0xdf, "\u{1f32b}"),
+ (0xe0, "\u{1f31c}"),
+ (0xe1, "\u{1f321}"),
+ (0xe2, "\u{1f6cb}"),
+ (0xe3, "\u{1f6cf}"),
+ (0xe4, "\u{1f37d}"),
+ (0xe5, "\u{1f378}"),
+ (0xe6, "\u{1f6ce}"),
+ (0xe7, "\u{1f6cd}"),
+ (0xe8, "\u{24c5}"),
+ (0xe9, "\u{267f}"),
+ (0xea, "\u{1f6c6}"),
+ (0xeb, "\u{1f588}"),
+ (0xec, "\u{1f393}"),
+ (0xed, "\u{1f5e4}"),
+ (0xee, "\u{1f5e5}"),
+ (0xef, "\u{1f5e6}"),
+ (0xf0, "\u{1f5e7}"),
+ (0xf1, "\u{1f6ea}"),
+ (0xf2, "\u{1f43f}"),
+ (0xf3, "\u{1f426}"),
+ (0xf4, "\u{1f41f}"),
+ (0xf5, "\u{1f415}"),
+ (0xf6, "\u{1f408}"),
+ (0xf7, "\u{1f66c}"),
+ (0xf8, "\u{1f66e}"),
+ (0xf9, "\u{1f66d}"),
+ (0xfa, "\u{1f66f}"),
+ (0xfb, "\u{1f5fa}"),
+ (0xfc, "\u{1f30d}"),
+ (0xfd, "\u{1f30f}"),
+ (0xfe, "\u{1f30e}"),
+ (0xff, "\u{1f54a}"),
+];
+
+/// Symbol: the code page Word's `w:sym` draws from (gaps are not in the font).
+static SYMBOL: &[(u8, &str)] = &[
+ (0x20, "\u{20}"),
+ (0x21, "\u{21}"),
+ (0x22, "\u{2200}"),
+ (0x23, "\u{23}"),
+ (0x24, "\u{2203}"),
+ (0x25, "\u{25}"),
+ (0x26, "\u{26}"),
+ (0x27, "\u{220d}"),
+ (0x28, "\u{28}"),
+ (0x29, "\u{29}"),
+ (0x2a, "\u{2217}"),
+ (0x2b, "\u{2b}"),
+ (0x2c, "\u{2c}"),
+ (0x2d, "\u{2212}"),
+ (0x2e, "\u{2e}"),
+ (0x2f, "\u{2f}"),
+ (0x30, "\u{30}"),
+ (0x31, "\u{31}"),
+ (0x32, "\u{32}"),
+ (0x33, "\u{33}"),
+ (0x34, "\u{34}"),
+ (0x35, "\u{35}"),
+ (0x36, "\u{36}"),
+ (0x37, "\u{37}"),
+ (0x38, "\u{38}"),
+ (0x39, "\u{39}"),
+ (0x3a, "\u{3a}"),
+ (0x3b, "\u{3b}"),
+ (0x3c, "\u{3c}"),
+ (0x3d, "\u{3d}"),
+ (0x3e, "\u{3e}"),
+ (0x3f, "\u{3f}"),
+ (0x40, "\u{2245}"),
+ (0x41, "\u{391}"),
+ (0x42, "\u{392}"),
+ (0x43, "\u{3a7}"),
+ (0x44, "\u{394}"),
+ (0x45, "\u{395}"),
+ (0x46, "\u{3a6}"),
+ (0x47, "\u{393}"),
+ (0x48, "\u{397}"),
+ (0x49, "\u{399}"),
+ (0x4a, "\u{3d1}"),
+ (0x4b, "\u{39a}"),
+ (0x4c, "\u{39b}"),
+ (0x4d, "\u{39c}"),
+ (0x4e, "\u{39d}"),
+ (0x4f, "\u{39f}"),
+ (0x50, "\u{3a0}"),
+ (0x51, "\u{398}"),
+ (0x52, "\u{3a1}"),
+ (0x53, "\u{3a3}"),
+ (0x54, "\u{3a4}"),
+ (0x55, "\u{3a5}"),
+ (0x56, "\u{3c2}"),
+ (0x57, "\u{3a9}"),
+ (0x58, "\u{39e}"),
+ (0x59, "\u{3a8}"),
+ (0x5a, "\u{396}"),
+ (0x5b, "\u{5b}"),
+ (0x5c, "\u{2234}"),
+ (0x5d, "\u{5d}"),
+ (0x5e, "\u{22a5}"),
+ (0x5f, "\u{5f}"),
+ (0x61, "\u{3b1}"),
+ (0x62, "\u{3b2}"),
+ (0x63, "\u{3c7}"),
+ (0x64, "\u{3b4}"),
+ (0x65, "\u{3b5}"),
+ (0x66, "\u{3c6}"),
+ (0x67, "\u{3b3}"),
+ (0x68, "\u{3b7}"),
+ (0x69, "\u{3b9}"),
+ (0x6a, "\u{3d5}"),
+ (0x6b, "\u{3ba}"),
+ (0x6c, "\u{3bb}"),
+ (0x6d, "\u{3bc}"),
+ (0x6e, "\u{3bd}"),
+ (0x6f, "\u{3bf}"),
+ (0x70, "\u{3c0}"),
+ (0x71, "\u{3b8}"),
+ (0x72, "\u{3c1}"),
+ (0x73, "\u{3c3}"),
+ (0x74, "\u{3c4}"),
+ (0x75, "\u{3c5}"),
+ (0x76, "\u{3d6}"),
+ (0x77, "\u{3c9}"),
+ (0x78, "\u{3be}"),
+ (0x79, "\u{3c8}"),
+ (0x7a, "\u{3b6}"),
+ (0x7b, "\u{7b}"),
+ (0x7c, "\u{7c}"),
+ (0x7d, "\u{7d}"),
+ (0x7e, "\u{223c}"),
+ (0xa1, "\u{3d2}"),
+ (0xa2, "\u{2032}"),
+ (0xa3, "\u{2264}"),
+ (0xa4, "\u{2044}"),
+ (0xa5, "\u{221e}"),
+ (0xa6, "\u{192}"),
+ (0xa7, "\u{2663}"),
+ (0xa8, "\u{2666}"),
+ (0xa9, "\u{2665}"),
+ (0xaa, "\u{2660}"),
+ (0xab, "\u{2194}"),
+ (0xac, "\u{2190}"),
+ (0xad, "\u{2191}"),
+ (0xae, "\u{2192}"),
+ (0xaf, "\u{2193}"),
+ (0xb0, "\u{b0}"),
+ (0xb1, "\u{b1}"),
+ (0xb2, "\u{2033}"),
+ (0xb3, "\u{2265}"),
+ (0xb4, "\u{d7}"),
+ (0xb5, "\u{221d}"),
+ (0xb6, "\u{2202}"),
+ (0xb7, "\u{2022}"),
+ (0xb8, "\u{f7}"),
+ (0xb9, "\u{2260}"),
+ (0xba, "\u{2261}"),
+ (0xbb, "\u{2248}"),
+ (0xbc, "\u{2026}"),
+ (0xbd, "\u{23d0}"),
+ (0xbe, "\u{23af}"),
+ (0xbf, "\u{21b5}"),
+ (0xc0, "\u{2135}"),
+ (0xc1, "\u{2111}"),
+ (0xc2, "\u{211c}"),
+ (0xc3, "\u{2118}"),
+ (0xc4, "\u{2297}"),
+ (0xc5, "\u{2295}"),
+ (0xc6, "\u{2205}"),
+ (0xc7, "\u{2229}"),
+ (0xc8, "\u{222a}"),
+ (0xc9, "\u{2283}"),
+ (0xca, "\u{2287}"),
+ (0xcb, "\u{2284}"),
+ (0xcc, "\u{2282}"),
+ (0xcd, "\u{2286}"),
+ (0xce, "\u{2208}"),
+ (0xcf, "\u{2209}"),
+ (0xd0, "\u{2220}"),
+ (0xd1, "\u{2207}"),
+ (0xd2, "\u{ae}"),
+ (0xd3, "\u{a9}"),
+ (0xd4, "\u{2122}"),
+ (0xd5, "\u{220f}"),
+ (0xd6, "\u{221a}"),
+ (0xd7, "\u{22c5}"),
+ (0xd8, "\u{ac}"),
+ (0xd9, "\u{2227}"),
+ (0xda, "\u{2228}"),
+ (0xdb, "\u{21d4}"),
+ (0xdc, "\u{21d0}"),
+ (0xdd, "\u{21d1}"),
+ (0xde, "\u{21d2}"),
+ (0xdf, "\u{21d3}"),
+ (0xe0, "\u{25ca}"),
+ (0xe1, "\u{2329}"),
+ (0xe2, "\u{ae}"),
+ (0xe3, "\u{a9}"),
+ (0xe4, "\u{2122}"),
+ (0xe5, "\u{2211}"),
+ (0xe6, "\u{239b}"),
+ (0xe7, "\u{239c}"),
+ (0xe8, "\u{239d}"),
+ (0xe9, "\u{23a1}"),
+ (0xea, "\u{23a2}"),
+ (0xeb, "\u{23a3}"),
+ (0xec, "\u{23a7}"),
+ (0xed, "\u{23a8}"),
+ (0xee, "\u{23a9}"),
+ (0xef, "\u{23aa}"),
+ (0xf0, "\u{20ac}"),
+ (0xf1, "\u{232a}"),
+ (0xf2, "\u{222b}"),
+ (0xf3, "\u{2320}"),
+ (0xf4, "\u{23ae}"),
+ (0xf5, "\u{2321}"),
+ (0xf6, "\u{239e}"),
+ (0xf7, "\u{239f}"),
+ (0xf8, "\u{23a0}"),
+ (0xf9, "\u{23a4}"),
+ (0xfa, "\u{23a5}"),
+ (0xfb, "\u{23a6}"),
+ (0xfc, "\u{23ab}"),
+ (0xfd, "\u{23ac}"),
+ (0xfe, "\u{23ad}"),
+];
+