diff --git a/etpgrf/config.py b/etpgrf/config.py index 707916a..70ff5a2 100644 --- a/etpgrf/config.py +++ b/etpgrf/config.py @@ -37,21 +37,33 @@ EN_ALPHABET_FULL = EN_ALPHABET_UPPER | EN_ALPHABET_LOWER # === КОНСТАНТЫ ДЛЯ КОДИРОВАНИЯ HTML-МНЕМНОИКОВ === # --- ЧЕРНЫЙ СПИСОК: Символы, которые НИКОГДА не нужно кодировать в мнемоники --- NEVER_ENCODE_CHARS = (frozenset(['!', '#', '%', '(', ')', '*', ',', '.', '/', ':', ';', '=', '?', '@', - '[', '\\', ']', '^', '_', '`', '{', '|', '}', '~']) + '[', '\\', ']', '^', '_', '`', '{', '|', '}', '~', '\n', '\t', '\r']) | RU_ALPHABET_FULL | EN_ALPHABET_FULL) - - # 2. БЕЛЫЙ СПИСОК (ДЛЯ БЕЗОПАСНОСТИ): # Символы, которые ВСЕГДА должны превращаться в мнемоники в "безопасных" режимах вывода. Сюда добавлены символы, -# которые или не видны, или на глаз и не отличимы друг от друга в обычном тексте -SAFE_MODE_CHARS_TO_MNEMONIC = frozenset(['<', '>', '&', '"', '\'', - '\u00AD', # мягкий перенос (Soft Hyphen) - '\u00A0', # неразрывный пробел (Non-Breaking Space) - '\u200D', # нулевая ширина (с объединением) (Zero Width Joiner) - '\u200C', # нулевая ширина (без объединения) (Zero Width Non-Joiner) - '\u2002', # Полужирный пробел (En Space) - '\u2003']) # Широкий пробел (Em Space) +# которые не видны, на глаз и не отличимы друг от друга в обычном тексте, или очень специфичные +SAFE_MODE_CHARS_TO_MNEMONIC = frozenset([ + '<', '>', '&', '"', '\'', + '\u00AD', # Мягкий перенос (Soft Hyphen) -- ­ + '\u00A0', # Неразрывный пробел (Non-Breaking Space) --   + '\u2002', # Полужирный пробел (En Space) --   + '\u2003', # Широкий пробел (Em Space) --   + '\u2007', # Цифровой пробел --  ) + '\u2008', # Пунктуационный пробел --   + '\u2009', # Междусимвольный пробел --  ' + '\u200A', # Толщина волоса (Hair Space) --   + '\u200B', # Негативный пробел (Negative Space) -- ​ + '\u200C', # Нулевая ширина (без объединения) (Zero Width Non-Joiner) -- ‍ + '\u200D', # Нулевая ширина (с объединением) (Zero Width Joiner) -- ‌ + '\u200E', # Изменить направление текста на слева-направо (Left-to-Right Mark /LRE) -- ‎ + '\u200F', # Изменить направление текста направо-налево (Right-to-Left Mark /RLM) -- ‏ + '\u205F', # Средний пробел (Medium Mathematical Space) --   + '\u2060', # ⁠ + '\u2062', # ⁢ + '\u2063', # ⁣ + + ]) # 3. СПИСОК ДЛЯ ЧИСЛОВОГО КОДИРОВАНИЯ: Символы без стандартного имени. ALWAYS_ENCODE_TO_NUMERIC_CHARS = frozenset([ @@ -62,14 +74,15 @@ ALWAYS_ENCODE_TO_NUMERIC_CHARS = frozenset([ '\u20B9', # Знак индийской рупии (₹) '\u20BC', # Знак азербайджанского маната '\u20BE', # Знак грузинский лари (₾) - '\u022d', # Специальный символ LEFT-TO-RIGHT OVERRIDE (устанавливает направление текста слева-направо) - '\u022e', # Специальный символ RIGHT-TO-LEFT OVERRIDE (устанавливает направление текста справа-налево) ]) -# 4. СЛОВАРЬ ПРИОРИТЕТОВ: Кастомные или предпочитаемые мнемоники. -# Эти правила применяются в последнюю очередь и имеют наивысший приоритет, +# 4. СЛОВАРЬ ПРИОРИТЕТОВ: Кастомные и/или предпочитаемые мнемоники. +# Некоторые utf-символы имеют несколько мнемоник, а значит для таких символов преобразование +# в из utf во html-мнемоники может иметь несколько вариантов. Словарь приоритетов задает предпочтительное +# преобразование. Эти правила применяются в последнюю очередь и имеют наивысший приоритет, # гарантируя предсказуемый результат для символов с несколькими именами. -# Также используется для создания исключений из "черного списка" NEVER_ENCODE_CHARS. +# +# Также можно использовать для создания исключений из "черного списка" NEVER_ENCODE_CHARS. CUSTOM_ENCODE_MAP = { '\u2010': '‐', # Для \u2010 всегда предпочитаем ‐, а не ‐ # Исключения для букв, которые есть в алфавитах, но должны кодироваться (для обеспечения консистентности): @@ -77,6 +90,24 @@ CUSTOM_ENCODE_MAP = { # 'Œ': 'Œ', # 'æ': 'æ', # 'œ': 'œ', + '\u3253': 'ℵ', # ℵ / &alefsym / ℵ + '&': '&', # & / & / & + '\u2220': '∠', # ∠ / ∠ / ∠ + '\u2061': '⁡', # ⁡ / ⁡ + '\u2248': '≈', # ≈ / ≈ / ≈ / ≈ / ≈ / ≈ / ≈ + '\u00c5': 'Å', # Å / Å / Å / + '\u224a': '≊', # ≊ / ≊ / &≊ + '\u2305': '⌅', # ⌅ / ⌅ / ⌅ + '\u2235': '∵', # ∵ / ∵ / ∵ / ∵ + '\u224c': '≌', # ≌ / ≌ / ≌ + '\u03f6': '϶', # ϶ / ϶ / ϶ + '\u212c': 'ℬ', # ℬ / ℬ / ℬ / ℬ + '\u22a5': '⊥', # ⊥ / perp; / ⊥ / ⊥ / UpTee + '\u2035': '‵', # ‵ / ‵ / ‵ + '\u02d8': '˘', # ˘ / ˘ / ˘ + '\u223d': '∽', # ∽ / ∽ / ∽ + '\u22cd': '⋍', # ⋍ / ⋍ / ⋍ + '\u2022': '•', # • / • / • } # === Динамическая генерация карт преобразования === diff --git a/tests/test_codec.py b/tests/test_codec.py index b5e6e34..11f4fac 100644 --- a/tests/test_codec.py +++ b/tests/test_codec.py @@ -18,7 +18,8 @@ STRINGS_FOR_DECODE = [ ("­", "\u00AD"), # Мягкий перенос ("    ‍‌", "\u00A0\u2002\u2003\u2009\u200D\u200C"), # Набор пробелов и невидимых символов ("– — ‐ ―", "– — ‐ ―"), # Набор тире и дефисов - ("$ ¢ £ ¤ ¥ € ₽", "$ ¢ £ ¤ ¥ € ₽"), # Валютные символы + ("$ ¢ £ ¤ ¥ €", "$ ¢ £ ¤ ¥ €"), # Валютные символы + ("֏ ₽ ₴ ₸ ₹ ₼ ₾", "֏ ₽ ₴ ₸ ₹ ₼ ₾"), # Валютные символы # Набор из html.entities.name2codepoint ("Æ Á  À Α Å Ã Ä Ä", "Æ Á  À Α Å Ã Ä Ä"), ("Β Ç Χ ‡ Δ Ð É Ê È", "Β Ç Χ ‡ Δ Ð É Ê È"), @@ -55,7 +56,7 @@ STRINGS_FOR_DECODE = [ ("⦝ ∢ Å ⍼ Ą ą 𝔸 𝕒 ≈", "⦝ ∢ Å ⍼ Ą ą 𝔸 𝕒 ≈"), ("⩯ ⩰ ≊ ≋ ' ⁡ ≈ ≊", "⩯ ⩰ ≊ ≋ ' \u2061 ≈ ≊"), ("𝒜 𝒶 ≔ * ≍ ∳ ⨑ ≌", "𝒜 𝒶 ≔ * ≍ ∳ ⨑ ≌"), - ("϶ ‵ ∽ ⋍ ∖ ⫧ ⊽", "϶ ‵ ∽ ⋍ ∖ ⫧ ⊽"), + ("϶ ‵ ∽ ⋍ ∖ ⫧ ⊽", "϶ ‵ ∽ ⋍ ∖ ⫧ ⊽"), ("⌆ ⌅ ⌅ ⎵ ⎶ ≌ Б б „", "⌆ ⌅ ⌅ ⎵ ⎶ ≌ Б б „"), ("∵ ∵ ∵ ⦰ ϶ ℬ ℬ ℶ", "∵ ∵ ∵ ⦰ ϶ ℬ ℬ ℶ"), ("≬ 𝔅 𝔟 ⋂ ◯ ⋃ ⨀ ⨁", "≬ 𝔅 𝔟 ⋂ ◯ ⋃ ⨀ ⨁"), @@ -352,6 +353,7 @@ STRINGS_FOR_ENCODE = [ ("\u00A0\u2002\u2003\u2009\u200D\u200C", "    ‍‌"), # Набор пробелов и невидимых символов ("– — ‐ ―", "– — ‐ ―"), # Набор тире и дефисов ("$ ¢ £ ¤ ¥ € ₽", "$ ¢ £ ¤ ¥ € ₽"), # Валютные символы + ("֏ ₽ ₴ ₸ ₹ ₼ ₾", "֏ ₽ ₴ ₸ ₹ ₼ ₾"), # Валютные символы # Набор из html.entities.name2codepoint ("Æ Á  À Α Å Ã Ä Ä", "Æ Á  À Α Å Ã Ä Ä"), ("Β Ç Χ ‡ Δ Ð É Ê È", "Β Ç Χ ‡ Δ Ð É Ê È"), @@ -381,6 +383,278 @@ STRINGS_FOR_ENCODE = [ ("ù ¨ ϒ υ ü ℘ ξ ý ¥ ÿ", "ù ¨ ϒ υ ü ℘ ξ ý ¥ ÿ"), ("ζ \u200D \u200C + = %", "ζ ‍ ‌ + = %"), # Набор из html.entities.html5 + ("Á á Á á Ă ă ∾ ∿ Â", "Á á Á á Ă ă ∾ ∿ Â"), + ("â  ⠴ ´ А а Æ æ Æ", "â  ⠴ ´ А а Æ æ Æ"), + ("æ \u2061 𝔄 𝔞 À à À à ℵ ℵ", "æ ⁡ 𝔄 𝔞 À à À à ℵ ℵ"), + ("Α α Ā ā ⨿ & & & & ⩓ ∧", "Α α Ā ā ⨿ & & & & ⩓ ∧"), + ("⩕ ⩜ ⩘ ⩚ ∠ ⦤ ∠ ∡ ⦨", "⩕ ⩜ ⩘ ⩚ ∠ ⦤ ∠ ∡ ⦨"), + ("⦩ ⦪ ⦫ ⦬ ⦭ ⦮ ⦯", "⦩ ⦪ ⦫ ⦬ ⦭ ⦮ ⦯"), + ("∟ ⊾ ⦝ ∢ Å ⍼ Ą ą 𝔸", "∟ ⊾ ⦝ ∢ Å ⍼ Ą ą 𝔸"), + ("𝕒 ≈ ⩯ ⩰ ≊ ≋ ' \u2061 ≈", "𝕒 ≈ ⩯ ⩰ ≊ ≋ ' ⁡ ≈"), + ("≊ Å å Å å 𝒜 𝒶 ≔ *", "≊ Å å Å å 𝒜 𝒶 ≔ *"), + ("≈ ≍ à ã à ã Ä ä Ä", "≈ ≍ à ã à ã Ä ä Ä"), + ("ä ∳ ⨑ ≌ ϶ ‵ ∽", "ä ∳ ⨑ ≌ ϶ ‵ ∽"), + ("⋍ ∖ ⫧ ⊽ ⌆ ⌅ ⌅ ⎵", "⋍ ∖ ⫧ ⊽ ⌆ ⌅ ⌅ ⎵"), + ("⎶ ≌ Б б „ ∵ ⦰", "⎶ ≌ Б б „ ∵ ⦰"), + ("϶ ℬ ℬ Β β ℶ ≬ 𝔅 𝔟", "϶ ℬ ℬ Β β ℶ ≬ 𝔅 𝔟"), + ("⋂ ◯ ⋃ ⨀ ⨁ ⨂ ⨆", "⋂ ◯ ⋃ ⨀ ⨁ ⨂ ⨆"), + ("★ ▽ △ ⨄ ⋁ ⋀", "★ ▽ △ ⨄ ⋁ ⋀"), + ("⤍ ⧫ ▪ ▴ ▾", "⤍ ⧫ ▪ ▴ ▾"), + ("◂ ▸ ␣ ▒ ░ ▓", "◂ ▸ ␣ ▒ ░ ▓"), + ("█ ⫭ ⌐ 𝔹 𝕓 ⊥ ⊥ ⋈ ⧉ ╗", "█ ⫭ ⌐ 𝔹 𝕓 ⊥ ⊥ ⋈ ⧉ ╗"), + ("╖ ╕ ┐ ╔ ╓ ╒ ┌ ═ ─ ╦", "╖ ╕ ┐ ╔ ╓ ╒ ┌ ═ ─ ╦"), + ("╤ ╥ ┬ ╩ ╧ ╨ ┴ ⊟ ⊞", "╤ ╥ ┬ ╩ ╧ ╨ ┴ ⊟ ⊞"), + ("⊠ ╝ ╜ ╛ ┘ ╚ ╙ ╘ └", "⊠ ╝ ╜ ╛ ┘ ╚ ╙ ╘ └"), + ("║ │ ╬ ╫ ╪ ┼ ╣ ╢ ╡ ┤", "║ │ ╬ ╫ ╪ ┼ ╣ ╢ ╡ ┤"), + ("╠ ╟ ╞ ├ ‵ ˘ ˘ ¦ ¦", "╠ ╟ ╞ ├ ‵ ˘ ˘ ¦ ¦"), + ("ℬ 𝒷 ⁏ ∽ ⋍ \\ ⧅ ⟈ • •", "ℬ 𝒷 ⁏ ∽ ⋍ \\ ⧅ ⟈ • •"), + # ("≎ ⪮ ≏ ≎ ≏ Ć ć ⋒ ∩", "≎ ⪮ ≏ ≎ ≏ Ć ć ⋒ ∩"), + # ("⩄ ⩉ ⩋ ⩇ ⩀ ⅅ ⁁", "⩄ ⩉ ⩋ ⩇ ⩀ ⅅ ⁁"), + # ("ˇ ℭ ⩍ Č č Ç ç Ç", "ˇ ℭ ⩍ Č č Ç ç Ç"), + # ("ç Ĉ ĉ ∰ ⩌ ⩐ Ċ ċ ¸", "ç Ĉ ĉ ∰ ⩌ ⩐ Ċ ċ ¸"), + # ("¸ ¸ ⦲ ¢ ¢ · · ℭ 𝔠", "¸ ¸ ⦲ ¢ ¢ · · ℭ 𝔠"), + # ("Ч ч ✓ ✓ Χ χ ○ ˆ ≗", "Ч ч ✓ ✓ Χ χ ○ ˆ ≗"), + # ("↺ ↻ ⊛ ⊚ ⊝", "↺ ↻ ⊛ ⊚ ⊝"), + # ("⊙ ® Ⓢ ⊖ ⊕ ⊗", "⊙ ® Ⓢ ⊖ ⊕ ⊗"), + # ("⧃ ≗ ⨐ ⫯ ⧂ ∲", "⧃ ≗ ⨐ ⫯ ⧂ ∲"), + # ("” ’ ♣ ♣ ∷ :", "” ’ ♣ ♣ ∷ :"), + # ("⩴ ≔ ≔ , @ ∁ ∘ ∁", "⩴ ≔ ≔ , @ ∁ ∘ ∁"), + # ("ℂ ≅ ⩭ ≡ ∯ ∮ ∮", "ℂ ≅ ⩭ ≡ ∯ ∮ ∮"), + # ("ℂ 𝕔 ∐ ∐ © © © © ℗", "ℂ 𝕔 ∐ ∐ © © © © ℗"), + # ("∳ ↵ ⨯ ✗ 𝒞 𝒸 ⫏", "∳ ↵ ⨯ ✗ 𝒞 𝒸 ⫏"), + # ("⫑ ⫐ ⫒ ⋯ ⤸ ⤵ ⋞ ⋟ ↶", "⫑ ⫐ ⫒ ⋯ ⤸ ⤵ ⋞ ⋟ ↶"), + # ("⤽ ⋓ ∪ ⩈ ≍ ⩆ ⩊ ⊍ ⩅", "⤽ ⋓ ∪ ⩈ ≍ ⩆ ⩊ ⊍ ⩅"), + # ("↷ ⤼ ⋞ ⋟ ⋎ ⋏", "↷ ⤼ ⋞ ⋟ ⋎ ⋏"), + # ("¤ ¤ ↶ ↷ ⋎ ⋏", "¤ ¤ ↶ ↷ ⋎ ⋏"), + # ("∲ ∱ ⌭ ‡ † ℸ ↡ ⇓ ↓", "∲ ∱ ⌭ ‡ † ℸ ↡ ⇓ ↓"), + # ("‐ ⫤ ⊣ ⤏ ˝ Ď ď Д д ⅅ", "‐ ⫤ ⊣ ⤏ ˝ Ď ď Д д ⅅ"), + # ("ⅆ ‡ ⇊ ⤑ ⩷ ° ° ∇ Δ δ", "ⅆ ‡ ⇊ ⤑ ⩷ ° ° ∇ Δ δ"), + # ("⦱ ⥿ 𝔇 𝔡 ⥥ ⇃ ⇂ ´", "⦱ ⥿ 𝔇 𝔡 ⥥ ⇃ ⇂ ´"), + # ("˙ ˝ `", "˙ ˝ `"), + # ("˜ ⋄ ⋄ ⋄ ♦ ♦ ¨", "˜ ⋄ ⋄ ⋄ ♦ ♦ ¨"), + # ("ⅆ ϝ ⋲ ÷ ÷ ÷ ⋇", "ⅆ ϝ ⋲ ÷ ÷ ÷ ⋇"), + # ("⋇ Ђ ђ ⌞ ⌍ $ 𝔻 𝕕 ¨ ˙", "⋇ Ђ ђ ⌞ ⌍ $ 𝔻 𝕕 ¨ ˙"), + # ("⃜ ≐ ≑ ≐ ∸ ∔ ⊡", "⃜ ≐ ≑ ≐ ∸ ∔ ⊡"), + # ("⌆ ∯ ¨ ⇓", "⌆ ∯ ¨ ⇓"), + # ("⇐ ⇔ ⫤ ⟸", "⇐ ⇔ ⫤ ⟸"), + # ("⟺ ⟹ ⇒", "⟺ ⟹ ⇒"), + # ("⊨ ⇑ ⇕ ∥", "⊨ ⇑ ⇕ ∥"), + # ("↓ ⇓ ↓ ⤓ ⇵", "↓ ⇓ ↓ ⤓ ⇵"), + # ("̑ ⇊ ⇃ ⇂", "̑ ⇊ ⇃ ⇂"), + # ("⥐ ⥞ ↽ ⥖", "⥐ ⥞ ↽ ⥖"), + # ("⥟ ⇁ ⥗ ⊤", "⥟ ⇁ ⥗ ⊤"), + # ("↧ ⤐ ⌟ ⌌ 𝒟 𝒹 Ѕ ѕ ⧶", "↧ ⤐ ⌟ ⌌ 𝒟 𝒹 Ѕ ѕ ⧶"), + # ("Đ đ ⋱ ▿ ▾ ⇵ ⥯ ⦦ Џ", "Đ đ ⋱ ▿ ▾ ⇵ ⥯ ⦦ Џ"), + # ("џ ⟿ É é É é ⩮ Ě", "џ ⟿ É é É é ⩮ Ě"), + # ("ě ≖ Ê ê Ê ê ≕ Э э ⩷", "ě ≖ Ê ê Ê ê ≕ Э э ⩷"), + # ("Ė ≑ ė ⅇ ≒ 𝔈 𝔢 ⪚ È è È", "Ė ≑ ė ⅇ ≒ 𝔈 𝔢 ⪚ È è È"), + # ("è ⪖ ⪘ ⪙ ∈ ⏧ ℓ ⪕ ⪗ Ē", "è ⪖ ⪘ ⪙ ∈ ⏧ ℓ ⪕ ⪗ Ē"), + # ("ē ∅ ∅ ◻ ∅ ▫", "ē ∅ ∅ ◻ ∅ ▫"), + # ("      Ŋ ŋ   Ę ę 𝔼 𝕖", "      Ŋ ŋ   Ę ę 𝔼 𝕖"), + # ("⋕ ⧣ ⩱ ε Ε ε ϵ ≖ ≕", "⋕ ⧣ ⩱ ε Ε ε ϵ ≖ ≕"), + # ("≂ ⪖ ⪕ ⩵ = ≂ ≟", "≂ ⪖ ⪕ ⩵ = ≂ ≟"), + # ("⇌ ≡ ⩸ ⧥ ⥱ ≓ ℰ ℯ", "⇌ ≡ ⩸ ⧥ ⥱ ≓ ℰ ℯ"), + # ("≐ ⩳ ≂ Η η Ð ð Ð ð Ë ë Ë", "≐ ⩳ ≂ Η η Ð ð Ð ð Ë ë Ë"), + # ("ë € ! ∃ ∃ ℰ ⅇ", "ë € ! ∃ ∃ ℰ ⅇ"), + # ("ⅇ ≒ Ф ф ♀ ffi ff ffl", "ⅇ ≒ Ф ф ♀ ffi ff ffl"), + # ("𝔉 𝔣 fi ◼ ▪ ♭ fl", "𝔉 𝔣 fi ◼ ▪ ♭ fl"), + # ("▱ ƒ 𝔽 𝕗 ∀ ∀ ⋔ ⫙ ℱ", "▱ ƒ 𝔽 𝕗 ∀ ∀ ⋔ ⫙ ℱ"), + # ("⨍ ½ ½ ⅓ ¼ ¼ ⅕ ⅙", "⨍ ½ ½ ⅓ ¼ ¼ ⅕ ⅙"), + # ("⅛ ⅔ ⅖ ¾ ¾ ⅗ ⅜ ⅘", "⅛ ⅔ ⅖ ¾ ¾ ⅗ ⅜ ⅘"), + # ("⅚ ⅝ ⅞ ⁄ ⌢ ℱ 𝒻 ǵ Γ", "⅚ ⅝ ⅞ ⁄ ⌢ ℱ 𝒻 ǵ Γ"), + # ("γ Ϝ ϝ ⪆ Ğ ğ Ģ Ĝ ĝ", "γ Ϝ ϝ ⪆ Ğ ğ Ģ Ĝ ĝ"), + # ("Г г Ġ ġ ≧ ≥ ⪌ ⋛ ≥ ≧ ⩾ ⩾", "Г г Ġ ġ ≧ ≥ ⪌ ⋛ ≥ ≧ ⩾ ⩾"), + # ("⪩ ⪀ ⪂ ⪄ ⪔ 𝔊 𝔤 ⋙ ≫ ⋙", "⪩ ⪀ ⪂ ⪄ ⪔ 𝔊 𝔤 ⋙ ≫ ⋙"), + # ("ℷ Ѓ ѓ ≷ ⪥ ⪒ ⪤ ⪊ ⪊ ≩ ⪈", "ℷ Ѓ ѓ ≷ ⪥ ⪒ ⪤ ⪊ ⪊ ≩ ⪈"), + # ("⪈ ≩ ⋧ 𝔾 𝕘 ` ≥ ⋛", "⪈ ≩ ⋧ 𝔾 𝕘 ` ≥ ⋛"), + # ("≧ ⪢ ≷ ⩾", "≧ ⪢ ≷ ⩾"), + # ("≳ 𝒢 ℊ ≳ ⪎ ⪐ > > > ≫ >", "≳ 𝒢 ℊ ≳ ⪎ ⪐ > > > ≫ >"), + # ("⪧ ⩺ ⋗ ⦕ ⩼ ⪆ ⥸ ⋗", "⪧ ⩺ ⋗ ⦕ ⩼ ⪆ ⥸ ⋗"), + # ("⋛ ⪌ ≷ ≳ ˇ   ½ ℋ", "⋛ ⪌ ≷ ≳ ˇ   ½ ℋ"), + # ("Ъ ъ ⇔ ↔ ⥈ ↭ ^ ℏ Ĥ ĥ", "Ъ ъ ⇔ ↔ ⥈ ↭ ^ ℏ Ĥ ĥ"), + # ("♥ ♥ … ⊹ ℌ 𝔥 ℋ ⤥", "♥ ♥ … ⊹ ℌ 𝔥 ℋ ⤥"), + # ("⤦ ⇿ ∻ ↩ ↪ ℍ 𝕙", "⤦ ⇿ ∻ ↩ ↪ ℍ 𝕙"), + # ("― ─ ℋ 𝒽 ℏ Ħ ħ", "― ─ ℋ 𝒽 ℏ Ħ ħ"), + # ("≎ ≏ ⁃ ‐ Í í Í", "≎ ≏ ⁃ ‐ Í í Í"), + # ("í ⁣ Î î Î î И и İ Е е", "í ⁣ Î î Î î И и İ Е е"), + # ("¡ ¡ ⇔ ℑ 𝔦 Ì ì Ì ì ⅈ", "¡ ¡ ⇔ ℑ 𝔦 Ì ì Ì ì ⅈ"), + # ("⨌ ∭ ⧜ ℩ IJ ij ℑ Ī ī ℑ", "⨌ ∭ ⧜ ℩ IJ ij ℑ Ī ī ℑ"), + # ("ⅈ ℐ ℑ ı ⊷ Ƶ ⇒ ∈", "ⅈ ℐ ℑ ı ⊷ Ƶ ⇒ ∈"), + # ("℅ ∞ ⧝ ı ∬ ∫ ⊺ ℤ", "℅ ∞ ⧝ ı ∬ ∫ ⊺ ℤ"), + # ("∫ ⊺ ⋂ ⨗ ⨼ ⁣", "∫ ⊺ ⋂ ⨗ ⨼ ⁣"), + # ("⁢ Ё ё Į į 𝕀 𝕚 Ι ι", "⁢ Ё ё Į į 𝕀 𝕚 Ι ι"), + # ("⨼ ¿ ¿ ℐ 𝒾 ∈ ⋵ ⋹ ⋴", "⨼ ¿ ¿ ℐ 𝒾 ∈ ⋵ ⋹ ⋴"), + # ("⋳ ∈ ⁢ Ĩ ĩ І і Ï ï Ï", "⋳ ∈ ⁢ Ĩ ĩ І і Ï ï Ï"), + # ("ï Ĵ ĵ Й й 𝔍 𝔧 ȷ 𝕁 𝕛 𝒥", "ï Ĵ ĵ Й й 𝔍 𝔧 ȷ 𝕁 𝕛 𝒥"), + # ("𝒿 Ј ј Є є Κ κ ϰ Ķ", "𝒿 Ј ј Є є Κ κ ϰ Ķ"), + # ("ķ К к 𝔎 𝔨 ĸ Х х Ќ ќ 𝕂", "ķ К к 𝔎 𝔨 ĸ Х х Ќ ќ 𝕂"), + # ("𝕜 𝒦 𝓀 ⇚ Ĺ ĺ ⦴ ℒ Λ", "𝕜 𝒦 𝓀 ⇚ Ĺ ĺ ⦴ ℒ Λ"), + # ("λ ⟪ ⟨ ⦑ ⟨ ⪅ ℒ « «", "λ ⟪ ⟨ ⦑ ⟨ ⪅ ℒ « «"), + # ("↞ ⇐ ← ⇤ ⤟ ⤝ ↩ ↫ ⤹", "↞ ⇐ ← ⇤ ⤟ ⤝ ↩ ↫ ⤹"), + # ("⥳ ↢ ⪫ ⤛ ⤙ ⪭ ⤎ ⤌ ❲", "⥳ ↢ ⪫ ⤛ ⤙ ⪭ ⤎ ⤌ ❲"), + # ("{ [ ⦋ ⦏ ⦍ Ľ ľ Ļ", "{ [ ⦋ ⦏ ⦍ Ľ ľ Ļ"), + # ("ļ ⌈ { Л л ⤶ “ „ ⥧", "ļ ⌈ { Л л ⤶ “ „ ⥧"), + # ("⥋ ↲ ≦ ≤ ⟨ ← ⇐", "⥋ ↲ ≦ ≤ ⟨ ← ⇐"), + # ("← ⇤ ⇆ ↢ ⌈", "← ⇤ ⇆ ↢ ⌈"), + # ("⟦ ⥡ ⇃ ⥙", "⟦ ⥡ ⇃ ⥙"), + # ("⌊ ↽ ↼ ⇇", "⌊ ↽ ↼ ⇇"), + # ("↔ ⇔ ↔ ⇆", "↔ ⇔ ↔ ⇆"), + # ("⇋ ↭ ⥎ ⊣", "⇋ ↭ ⥎ ⊣"), + # ("↤ ⥚ ⋋ ⊲", "↤ ⥚ ⋋ ⊲"), + # ("⧏ ⊴ ⥑ ⥠", "⧏ ⊴ ⥑ ⥠"), + # ("↿ ⥘ ↼ ⥒ ⪋ ⋚", "↿ ⥘ ↼ ⥒ ⪋ ⋚"), + # ("≤ ≦ ⩽ ⩽ ⪨ ⩿ ⪁ ⪃ ⪓", "≤ ≦ ⩽ ⩽ ⪨ ⩿ ⪁ ⪃ ⪓"), + # ("⪅ ⋖ ⋚ ⪋ ⋚", "⪅ ⋖ ⋚ ⪋ ⋚"), + # ("≦ ≶ ≶ ⪡ ≲ ⩽", "≦ ≶ ≶ ⪡ ≲ ⩽"), + # ("≲ ⥼ ⌊ 𝔏 𝔩 ≶ ⪑ ⥢ ↽ ↼", "≲ ⥼ ⌊ 𝔏 𝔩 ≶ ⪑ ⥢ ↽ ↼"), + # ("⥪ ▄ Љ љ ⋘ ≪ ⇇ ⌞ ⇚", "⥪ ▄ Љ љ ⋘ ≪ ⇇ ⌞ ⇚"), + # ("⥫ ◺ Ŀ ŀ ⎰ ⎰ ⪉ ⪉", "⥫ ◺ Ŀ ŀ ⎰ ⎰ ⪉ ⪉"), + # ("≨ ⪇ ⪇ ≨ ⋦ ⟬ ⇽ ⟦ ⟵", "≨ ⪇ ⪇ ≨ ⋦ ⟬ ⇽ ⟦ ⟵"), + # ("⟸ ⟵ ⟷ ⟺", "⟸ ⟵ ⟷ ⟺"), + # ("⟷ ⟼ ⟶ ⟹", "⟷ ⟼ ⟶ ⟹"), + # ("⟶ ↫ ↬ ⦅ 𝕃 𝕝", "⟶ ↫ ↬ ⦅ 𝕃 𝕝"), + # ("⨭ ⨴ ∗ _ ↙ ↘ ◊", "⨭ ⨴ ∗ _ ↙ ↘ ◊"), + # ("◊ ⧫ ( ⦓ ⇆ ⌟ ⇋ ⥭ ‎", "◊ ⧫ ( ⦓ ⇆ ⌟ ⇋ ⥭ ‎"), + # ("⊿ ‹ ℒ 𝓁 ↰ ↰ ≲ ⪍ ⪏ [", "⊿ ‹ ℒ 𝓁 ↰ ↰ ≲ ⪍ ⪏ ["), + # ("‘ ‚ Ł ł < < < ≪ < ⪦ ⩹", "‘ ‚ Ł ł < < < ≪ < ⪦ ⩹"), + # ("⋖ ⋋ ⋉ ⥶ ⩻ ◃ ⊴ ◂ ⦖", "⋖ ⋋ ⋉ ⥶ ⩻ ◃ ⊴ ◂ ⦖"), + # ("⥊ ⥦ ¯ ¯ ♂ ✠ ✠ ⤅ ↦", "⥊ ⥦ ¯ ¯ ♂ ✠ ✠ ⤅ ↦"), + # ("↦ ↧ ↤ ↥ ▮ ⨩ М м", "↦ ↧ ↤ ↥ ▮ ⨩ М м"), + # ("— ∺ ∡   ℳ 𝔐 𝔪 ℧", "— ∺ ∡   ℳ 𝔐 𝔪 ℧"), + # ("µ µ ∣ * ⫰ · · − ⊟", "µ µ ∣ * ⫰ · · − ⊟"), + # ("∸ ⨪ ∓ ⫛ … ∓ ⊧ 𝕄 𝕞", "∸ ⨪ ∓ ⫛ … ∓ ⊧ 𝕄 𝕞"), + # ("∓ ℳ 𝓂 ∾ Μ μ ⊸ ⊸ ∇ Ń", "∓ ℳ 𝓂 ∾ Μ μ ⊸ ⊸ ∇ Ń"), + # ("ń ≉ ʼn ≉ ♮ ♮ ℕ    ", "ń ≉ ʼn ≉ ♮ ♮ ℕ    "), + # ("⩃ Ň ň Ņ ņ ≇ ⩂ Н н –", "⩃ Ň ň Ņ ņ ≇ ⩂ Н н –"), + # ("≠ ⤤ ⇗ ↗ ↗ ​", "≠ ⤤ ⇗ ↗ ↗ ​"), + # ("​ ​ ​ ≢", "​ ​ ​ ≢"), + # ("⤨ ≫ ≪ \n # ∄ ∄", "⤨ ≫ ≪ ∄ ∄"), + # ("𝔑 𝔫 ≱ ≱ ≵ ≯ ≯ ⇎ ↮ ⫲ ∋", "𝔑 𝔫 ≱ ≱ ≵ ≯ ≯ ⇎ ↮ ⫲ ∋"), + # ("⋼ ⋺ ∋ Њ њ ⇍ ↚ ‥ ≰ ⇍", "⋼ ⋺ ∋ Њ њ ⇍ ↚ ‥ ≰ ⇍"), + # ("↚ ⇎ ↮ ≰ ≮ ≴ ≮", "↚ ⇎ ↮ ≰ ≮ ≴ ≮"), + # ("⋪ ⋬ ∤ ⁠   ℕ 𝕟 ¬ ⫬", "⋪ ⋬ ∤ ⁠   ℕ 𝕟 ¬ ⫬"), + # ("¬ ≢ ≭ ∦ ∉", "¬ ≢ ≭ ∦ ∉"), + # ("≠ ∄ ≯ ≱ ≹", "≠ ∄ ≯ ≱ ≹"), + # ("≵ ∉ ∉ ⋷ ⋶ ⋪", "≵ ∉ ∉ ⋷ ⋶ ⋪"), + # ("⋬ ≮ ≰ ≸", "⋬ ≮ ≰ ≸"), + # ("≴ ∌ ∌ ⋾ ⋽ ⊀", "≴ ∌ ∌ ⋾ ⋽ ⊀"), + # ("⋠ ∌ ⋫", "⋠ ∌ ⋫"), + # ("⋭ ⋢ ⋣", "⋭ ⋢ ⋣"), + # ("⊈ ⊁ ⋡ ⊉", "⊈ ⊁ ⋡ ⊉"), + # ("≁ ≄ ≇ ≉", "≁ ≄ ≇ ≉"), + # ("∤ ∦ ∦ ⨔ ⊀ ⋠ ⊀ ⇏", "∤ ∦ ∦ ⨔ ⊀ ⋠ ⊀ ⇏"), + # ("↛ ⇏ ↛ ⋫ ⋭ ⊁ ⋡ 𝒩", "↛ ⇏ ↛ ⋫ ⋭ ⊁ ⋡ 𝒩"), + # ("𝓃 ∤ ∦ ≁ ≄ ≄ ∤ ∦", "𝓃 ∤ ∦ ≁ ≄ ≄ ∤ ∦"), + # ("⋢ ⋣ ⊄ ⊈ ⊈ ⊁ ⊅ ⊉", "⋢ ⋣ ⊄ ⊈ ⊈ ⊁ ⊅ ⊉"), + # ("⊉ ≹ Ñ ñ Ñ ñ ≸ ⋪", "⊉ ≹ Ñ ñ Ñ ñ ≸ ⋪"), + # ("⋬ ⋫ ⋭ Ν ν # №", "⋬ ⋫ ⋭ Ν ν # №"), + # ("  ⊯ ⊮ ⊭ ⊬ ⤄ ⧞ ⤂", "  ⊯ ⊮ ⊭ ⊬ ⤄ ⧞ ⤂"), + # ("⤃ ⤣ ⇖ ↖ ↖ ⤧ Ó ó", "⤃ ⤣ ⇖ ↖ ↖ ⤧ Ó ó"), + # ("Ó ó ⊛ ⊚ Ô ô Ô ô О о", "Ó ó ⊛ ⊚ Ô ô Ô ô О о"), + # ("⊝ Ő ő ⨸ ⊙ ⦼ Œ œ ⦿ 𝔒", "⊝ Ő ő ⨸ ⊙ ⦼ Œ œ ⦿ 𝔒"), + # ("𝔬 ˛ Ò ò Ò ò ⧁ ⦵ Ω ∮", "𝔬 ˛ Ò ò Ò ò ⧁ ⦵ Ω ∮"), + # ("↺ ⦾ ⦻ ‾ ⧀ Ō ō Ω ω", "↺ ⦾ ⦻ ‾ ⧀ Ō ō Ω ω"), + # ("Ο ο ⦶ ⊖ 𝕆 𝕠 ⦷", "Ο ο ⦶ ⊖ 𝕆 𝕠 ⦷"), + # ("“ ‘ ⦹ ⊕ ⩔ ∨ ↻", "“ ‘ ⦹ ⊕ ⩔ ∨ ↻"), + # ("⩝ ℴ ℴ ª ª º º ⊶ ⩖ ⩗", "⩝ ℴ ℴ ª ª º º ⊶ ⩖ ⩗"), + # ("⩛ Ⓢ 𝒪 ℴ Ø ø Ø ø ⊘ Õ", "⩛ Ⓢ 𝒪 ℴ Ø ø Ø ø ⊘ Õ"), + # ("õ Õ õ ⨷ ⊗ ⨶ Ö ö Ö", "õ Õ õ ⨷ ⊗ ⨶ Ö ö Ö"), + # ("ö ⌽ ‾ ⏞ ⎴ ⏜ ∥", "ö ⌽ ‾ ⏞ ⎴ ⏜ ∥"), + # ("¶ ¶ ∥ ⫳ ⫽ ∂ ∂ П п", "¶ ¶ ∥ ⫳ ⫽ ∂ ∂ П п"), + # ("% . ‰ ⊥ ‱ 𝔓 𝔭 Φ φ ϕ", "% . ‰ ⊥ ‱ 𝔓 𝔭 Φ φ ϕ"), + # ("ℳ ☎ Π π ⋔ ϖ ℏ ℎ ℏ", "ℳ ☎ Π π ⋔ ϖ ℏ ℎ ℏ"), + # ("+ ⨣ ⊞ ⨢ ∔ ⨥ ⩲ ±", "+ ⨣ ⊞ ⨢ ∔ ⨥ ⩲ ±"), + # ("± ± ⨦ ⨧ ± ℌ ⨕ ℙ", "± ± ⨦ ⨧ ± ℌ ⨕ ℙ"), + # ("𝕡 £ £ ⪻ ≺ ⪷ ≼ ⪳ ⪯ ≺", "𝕡 £ £ ⪻ ≺ ⪷ ≼ ⪳ ⪯ ≺"), + # ("⪷ ≼ ≺ ⪯ ≼", "⪷ ≼ ≺ ⪯ ≼"), + # ("≾ ⪯ ⪹ ⪵ ⋨ ≾ ″", "≾ ⪯ ⪹ ⪵ ⋨ ≾ ″"), + # ("′ ℙ ⪹ ⪵ ⋨ ∏ ∏ ⌮", "′ ℙ ⪹ ⪵ ⋨ ∏ ∏ ⌮"), + # ("⌒ ⌓ ∝ ∷ ∝ ∝ ≾", "⌒ ⌓ ∝ ∷ ∝ ∝ ≾"), + # ("⊰ 𝒫 𝓅 Ψ ψ   𝔔 𝔮 ⨌ ℚ 𝕢", "⊰ 𝒫 𝓅 Ψ ψ   𝔔 𝔮 ⨌ ℚ 𝕢"), + # ("⁗ 𝒬 𝓆 ℍ ⨖ ? ≟ " "", "⁗ 𝒬 𝓆 ℍ ⨖ ? ≟ " ""), + # ("" " ⇛ Ŕ ŕ √ ⦳ ⟫ ⟩", "" " ⇛ Ŕ ŕ √ ⦳ ⟫ ⟩"), + # ("⦒ ⦥ ⟩ » » ↠ ⇒ → ⥵ ⇥", "⦒ ⦥ ⟩ » » ↠ ⇒ → ⥵ ⇥"), + # ("⤠ ⤳ ⤞ ↪ ↬ ⥅ ⥴ ⤖", "⤠ ⤳ ⤞ ↪ ↬ ⥅ ⥴ ⤖"), + # ("↣ ↝ ⤜ ⤚ ∶ ℚ ⤐ ⤏ ⤍", "↣ ↝ ⤜ ⤚ ∶ ℚ ⤐ ⤏ ⤍"), + # ("❳ } ] ⦌ ⦎ ⦐ Ř ř", "❳ } ] ⦌ ⦎ ⦐ Ř ř"), + # ("Ŗ ŗ ⌉ } Р р ⤷ ⥩ ” ”", "Ŗ ŗ ⌉ } Р р ⤷ ⥩ ” ”"), + # ("↳ ℜ ℜ ℛ ℜ ℝ ▭ ® ® ® ®", "↳ ℜ ℜ ℛ ℜ ℝ ▭ ® ® ® ®"), + # ("∋ ⇋ ⥯ ⥽ ⌋", "∋ ⇋ ⥯ ⥽ ⌋"), + # ("ℜ 𝔯 ⥤ ⇁ ⇀ ⥬ Ρ ρ ϱ", "ℜ 𝔯 ⥤ ⇁ ⇀ ⥬ Ρ ρ ϱ"), + # ("⟩ → ⇒ → ⇥", "⟩ → ⇒ → ⇥"), + # ("⇄ ↣ ⌉ ⟧", "⇄ ↣ ⌉ ⟧"), + # ("⥝ ⇂ ⥕ ⌋", "⥝ ⇂ ⥕ ⌋"), + # ("⇁ ⇀ ⇄ ⇌", "⇁ ⇀ ⇄ ⇌"), + # ("⇉ ↝ ⊢ ↦", "⇉ ↝ ⊢ ↦"), + # ("⥛ ⋌ ⊳ ⧐", "⥛ ⋌ ⊳ ⧐"), + # ("⊵ ⥏ ⥜ ↾", "⊵ ⥏ ⥜ ↾"), + # ("⥔ ⇀ ⥓ ˚ ≓", "⥔ ⇀ ⥓ ˚ ≓"), + # ("⇄ ⇌ ‏ ⎱ ⎱ ⫮ ⟭ ⇾ ⟧", "⇄ ⇌ ‏ ⎱ ⎱ ⫮ ⟭ ⇾ ⟧"), + # ("⦆ ℝ 𝕣 ⨮ ⨵ ⥰ ) ⦔", "⦆ ℝ 𝕣 ⨮ ⨵ ⥰ ) ⦔"), + # ("⨒ ⇉ ⇛ › ℛ 𝓇 ↱ ↱ ]", "⨒ ⇉ ⇛ › ℛ 𝓇 ↱ ↱ ]"), + # ("’ ’ ⋌ ⋊ ▹ ⊵ ▸ ⧎", "’ ’ ⋌ ⋊ ▹ ⊵ ▸ ⧎"), + # ("⧴ ⥨ ℞ Ś ś ‚ ⪼ ≻ ⪸", "⧴ ⥨ ℞ Ś ś ‚ ⪼ ≻ ⪸"), + # ("Š š ≽ ⪴ ⪰ Ş ş Ŝ ŝ", "Š š ≽ ⪴ ⪰ Ş ş Ŝ ŝ"), + # ("⪺ ⪶ ⋩ ⨓ ≿ С с ⋅ ⊡ ⩦", "⪺ ⪶ ⋩ ⨓ ≿ С с ⋅ ⊡ ⩦"), + # ("⤥ ⇘ ↘ ↘ § § ; ⤩ ∖", "⤥ ⇘ ↘ ↘ § § ; ⤩ ∖"), + # ("∖ ✶ 𝔖 𝔰 ⌢ ♯ Щ щ Ш ш", "∖ ✶ 𝔖 𝔰 ⌢ ♯ Щ щ Ш ш"), + # ("↓ ← ∣ ∥ →", "↓ ← ∣ ∥ →"), + # ("↑ ­ ­ Σ σ ς ς ∼ ⩪", "↑ ­ ­ Σ σ ς ς ∼ ⩪"), + # ("≃ ≃ ⪞ ⪠ ⪝ ⪟ ≆ ⨤ ⥲", "≃ ≃ ⪞ ⪠ ⪝ ⪟ ≆ ⨤ ⥲"), + # ("← ∘ ∖ ⨳ ⧤ ∣ ⌣ ⪪", "← ∘ ∖ ⨳ ⧤ ∣ ⌣ ⪪"), + # ("⪬ Ь ь / ⧄ ⌿ 𝕊 𝕤 ♠", "⪬ Ь ь / ⧄ ⌿ 𝕊 𝕤 ♠"), + # ("♠ ∥ ⊓ ⊔ √ ⊏ ⊑ ⊏", "♠ ∥ ⊓ ⊔ √ ⊏ ⊑ ⊏"), + # ("⊑ ⊐ ⊒ ⊐ ⊒ □ □ □", "⊑ ⊐ ⊒ ⊐ ⊒ □ □ □"), + # ("⊓ ⊏ ⊑ ⊐", "⊓ ⊏ ⊑ ⊐"), + # ("⊒ ⊔ ▪ ▪ → 𝒮 𝓈", "⊒ ⊔ ▪ ▪ → 𝒮 𝓈"), + # ("∖ ⌣ ⋆ ⋆ ☆ ★ ϵ", "∖ ⌣ ⋆ ⋆ ☆ ★ ϵ"), + # ("ϕ ¯ ⋐ ⊂ ⪽ ⫅ ⊆ ⫃ ⫁", "ϕ ¯ ⋐ ⊂ ⪽ ⫅ ⊆ ⫃ ⫁"), + # ("⫋ ⊊ ⪿ ⥹ ⋐ ⊂ ⊆ ⫅", "⫋ ⊊ ⪿ ⥹ ⋐ ⊂ ⊆ ⫅"), + # ("⊆ ⊊ ⫋ ⫇ ⫕ ⫓ ≻", "⊆ ⊊ ⫋ ⫇ ⫕ ⫓ ≻"), + # ("⪸ ≽ ≻ ⪰ ≽", "⪸ ≽ ≻ ⪰ ≽"), + # ("≿ ⪰ ⪺ ⪶ ⋩ ≿", "≿ ⪰ ⪺ ⪶ ⋩ ≿"), + # ("∋ ∑ ∑ ♪ ¹ ¹ ² ² ³ ³ ⋑", "∋ ∑ ∑ ♪ ¹ ¹ ² ² ³ ³ ⋑"), + # ("⊃ ⪾ ⫘ ⫆ ⊇ ⫄ ⊃ ⊇", "⊃ ⪾ ⫘ ⫆ ⊇ ⫄ ⊃ ⊇"), + # ("⟉ ⫗ ⥻ ⫂ ⫌ ⊋ ⫀ ⋑", "⟉ ⫗ ⥻ ⫂ ⫌ ⊋ ⫀ ⋑"), + # ("⊃ ⊇ ⫆ ⊋ ⫌ ⫈ ⫔", "⊃ ⊇ ⫆ ⊋ ⫌ ⫈ ⫔"), + # ("⫖ ⤦ ⇙ ↙ ↙ ⤪ ß ß ", "⫖ ⤦ ⇙ ↙ ↙ ⤪ ß ß "), + # ("⌖ Τ τ ⎴ Ť ť Ţ ţ Т т", "⌖ Τ τ ⎴ Ť ť Ţ ţ Т т"), + # ("⃛ ⌕ 𝔗 𝔱 ∴ ∴ ∴ Θ θ", "⃛ ⌕ 𝔗 𝔱 ∴ ∴ ∴ Θ θ"), + # ("ϑ ϑ ≈ ∼     ≈", "ϑ ϑ ≈ ∼     ≈"), + # ("∼ Þ þ Þ þ ∼ ˜ ≃", "∼ Þ þ Þ þ ∼ ˜ ≃"), + # ("≅ ≈ × × ⊠ ⨱ ⨰", "≅ ≈ × × ⊠ ⨱ ⨰"), + # ("∭ ⤨ ⊤ ⌶ ⫱ 𝕋 𝕥 ⫚ ⤩ ‴", "∭ ⤨ ⊤ ⌶ ⫱ 𝕋 𝕥 ⫚ ⤩ ‴"), + # ("™ ™ ▵ ▿ ◃ ⊴", "™ ™ ▵ ▿ ◃ ⊴"), + # ("≜ ▹ ⊵ ◬ ≜ ⨺", "≜ ▹ ⊵ ◬ ≜ ⨺"), + # ("⃛ ⨹ ⧍ ⨻ ⏢ 𝒯 𝓉 Ц ц", "⃛ ⨹ ⧍ ⨻ ⏢ 𝒯 𝓉 Ц ц"), + # ("Ћ ћ Ŧ ŧ ≬ ↞", "Ћ ћ Ŧ ŧ ≬ ↞"), + # ("↠ Ú ú Ú ú ↟ ⇑ ↑", "↠ Ú ú Ú ú ↟ ⇑ ↑"), + # ("⥉ Ў ў Ŭ ŭ Û û Û û", "⥉ Ў ў Ŭ ŭ Û û Û û"), + # ("У у ⇅ Ű ű ⥮ ⥾ 𝔘 𝔲 Ù", "У у ⇅ Ű ű ⥮ ⥾ 𝔘 𝔲 Ù"), + # ("ù Ù ù ⥣ ↿ ↾ ▀ ⌜ ⌜", "ù Ù ù ⥣ ↿ ↾ ▀ ⌜ ⌜"), + # ("⌏ ◸ Ū ū ¨ ¨ _ ⏟", "⌏ ◸ Ū ū ¨ ¨ _ ⏟"), + # ("⎵ ⏝ ⋃ ⊎ Ų ų 𝕌", "⎵ ⏝ ⋃ ⊎ Ų ų 𝕌"), + # ("𝕦 ↑ ⇑ ↑ ⤒ ⇅", "𝕦 ↑ ⇑ ↑ ⤒ ⇅"), + # ("↕ ⇕ ↕ ⥮ ↿", "↕ ⇕ ↕ ⥮ ↿"), + # ("↾ ⊎ ↖ ↗ ϒ υ", "↾ ⊎ ↖ ↗ ϒ υ"), + # ("ϒ Υ υ ⊥ ↥ ⇈ ⌝", "ϒ Υ υ ⊥ ↥ ⇈ ⌝"), + # ("⌝ ⌎ Ů ů ◹ 𝒰 𝓊 ⋰ Ũ", "⌝ ⌎ Ů ů ◹ 𝒰 𝓊 ⋰ Ũ"), + # ("ũ ▵ ▴ ⇈ Ü ü Ü ü ⦧ ⦜", "ũ ▵ ▴ ⇈ Ü ü Ü ü ⦧ ⦜"), + # ("ϵ ϰ ∅ ϕ ϖ ∝ ⇕", "ϵ ϰ ∅ ϕ ϖ ∝ ⇕"), + # ("↕ ϱ ς ϑ ⊲ ⊳", "↕ ϱ ς ϑ ⊲ ⊳"), + # ("⫫ ⫨ ⫩ В в ⊫ ⊩ ⊨ ⊢ ⫦", "⫫ ⫨ ⫩ В в ⊫ ⊩ ⊨ ⊢ ⫦"), + # ("⋁ ∨ ⊻ ≚ ⋮ ‖ | ‖ |", "⋁ ∨ ⊻ ≚ ⋮ ‖ | ‖ |"), + # ("∣ | ❘ ≀", "∣ | ❘ ≀"), + # ("  𝔙 𝔳 ⊲ 𝕍 𝕧 ∝ ⊳ 𝒱", "  𝔙 𝔳 ⊲ 𝕍 𝕧 ∝ ⊳ 𝒱"), + # ("𝓋 ⊪ ⦚ Ŵ ŵ ⩟ ⋀ ∧ ≙", "𝓋 ⊪ ⦚ Ŵ ŵ ⩟ ⋀ ∧ ≙"), + # ("℘ 𝔚 𝔴 𝕎 𝕨 ℘ ≀ ≀ 𝒲 𝓌 ⋂", "℘ 𝔚 𝔴 𝕎 𝕨 ℘ ≀ ≀ 𝒲 𝓌 ⋂"), + # ("◯ ⋃ ▽ 𝔛 𝔵 ⟺ ⟷ Ξ ξ ⟸ ⟵", "◯ ⋃ ▽ 𝔛 𝔵 ⟺ ⟷ Ξ ξ ⟸ ⟵"), + # ("⟼ ⋻ ⨀ 𝕏 𝕩 ⨁ ⨂ ⟹ ⟶ 𝒳", "⟼ ⋻ ⨀ 𝕏 𝕩 ⨁ ⨂ ⟹ ⟶ 𝒳"), + # ("𝓍 ⨆ ⨄ △ ⋁ ⋀ Ý ý Ý", "𝓍 ⨆ ⨄ △ ⋁ ⋀ Ý ý Ý"), + # ("ý Я я Ŷ ŷ Ы ы ¥ ¥ 𝔜 𝔶", "ý Я я Ŷ ŷ Ы ы ¥ ¥ 𝔜 𝔶"), + # ("Ї ї 𝕐 𝕪 𝒴 𝓎 Ю ю ÿ Ÿ ÿ", "Ї ї 𝕐 𝕪 𝒴 𝓎 Ю ю ÿ Ÿ ÿ"), + # ("Ź ź Ž ž З з Ż ż ℨ", "Ź ź Ž ž З з Ż ż ℨ"), + # ("​ Ζ ζ ℨ 𝔷 Ж ж ⇝ ℤ", "​ Ζ ζ ℨ 𝔷 Ж ж ⇝ ℤ"), ] @pytest.mark.parametrize("input_string, expected_output", STRINGS_FOR_ENCODE)