// Original by Markus Kuhn, adapted for HTML by Martin Dürst.
// UTF-8 encoded sample plain-text file
// ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
// Markus Kuhn [ˈmaʳkʊs kuːn] <mkuhn@acm.org> — 1999-08-20

// Mathematics and Sciences
string text1 = "∮ E⋅da = Q,  n → ∞, ∑ f(i) = ∏ g(i), ∀x∈ℝ: ⌈x⌉ = −⌊−x⌋, α ∧ ¬β = ¬(¬α ∨ β)";
string text2 = "ℕ ⊆ ℕ₀ ⊂ ℤ ⊂ ℚ ⊂ ℝ ⊂ ℂ, ⊥" + " < a ≠ b ≡ c ≤ d ≪ ⊤ ⇒ (A ⇔ B)" +
"2H₂ + O₂ ⇌ 2H₂O, R = 4.7 kΩ, ⌀ 200 mm";

// Linguistics and dictionaries:
string text3 = @UTF8
ði ıntəˈnæʃənəl fəˈnɛtık əsoʊsiˈeıʃn
Y [ˈʏpsilɔn], Yen [jɛn], Yoga [ˈjoːgɑ]
UTF8;

// APL:
string text4 = "(V⍳V)=⍳⍴V)/V←,V    ⌷←⍳→⍴∆∇⊃‾⍎⍕⌈";

// Nicer typography in plain text files:
string *text5 = @@UTF8
╔══════════════════════════════════════════╗
║                                          ║
║   • ‘single’ and “double” quotes         ║
║                                          ║
║   • Curly apostrophes: “We’ve been here” ║
║                                          ║
║   • Latin-1 apostrophe and accents: '´`  ║
║                                          ║
║   • ‚deutsche‘ „Anführungszeichen“       ║
║                                          ║
║   • †, ‡, ‰, •, 3–4, —, −5/+5, ™, …      ║
║                                          ║
║   • ASCII safety test: 1lI|, 0OD, 8B     ║
║                      ╭─────────╮         ║
║   • the euro symbol: │ 14.95 € │         ║
║                      ╰─────────╯         ║
╚══════════════════════════════════════════╝
UTF8;

// Greek (in Polytonic)
string text6 = @LONGUTF8
The Greek anthem:

  Σὲ γνωρίζω ἀπὸ τὴν κόψη
  τοῦ σπαθιοῦ τὴν τρομερή,
  σὲ γνωρίζω ἀπὸ τὴν ὄψη
  ποὺ μὲ βία μετράει τὴ γῆ.

  ᾿Απ᾿ τὰ κόκκαλα βγαλμένη
  τῶν ῾Ελλήνων τὰ ἱερά
  καὶ σὰν πρῶτα ἀνδρειωμένη
  χαῖρε, ὦ χαῖρε, ᾿Ελευθεριά!

  From a speech of Demosthenes in the 4th century BC:

  Οὐχὶ ταὐτὰ παρίσταταί μοι γιγνώσκειν, ὦ ἄνδρες ᾿Αθηναῖοι,
  ὅταν τ᾿ εἰς τὰ πράγματα ἀποβλέψω καὶ ὅταν πρὸς τοὺς
  λόγους οὓς ἀκούω· τοὺς μὲν γὰρ λόγους περὶ τοῦ
  τιμωρήσασθαι Φίλιππον ὁρῶ γιγνομένους, τὰ δὲ πράγματ᾿
  εἰς τοῦτο προήκοντα,  ὥσθ᾿ ὅπως μὴ πεισόμεθ᾿ αὐτοὶ
  πρότερον κακῶς σκέψασθαι δέον. οὐδέν οὖν ἄλλο μοι δοκοῦσιν
  οἱ τὰ τοιαῦτα λέγοντες ἢ τὴν ὑπόθεσιν, περὶ ἧς βουλεύεσθαι,
  οὐχὶ τὴν οὖσαν παριστάντες ὑμῖν ἁμαρτάνειν. ἐγὼ δέ, ὅτι μέν
  ποτ᾿ ἐξῆν τῇ πόλει καὶ τὰ αὑτῆς ἔχειν ἀσφαλῶς καὶ Φίλιππον
  τιμωρήσασθαι, καὶ μάλ᾿ ἀκριβῶς οἶδα· ἐπ᾿ ἐμοῦ γάρ, οὐ πάλαι
  γέγονεν ταῦτ᾿ ἀμφότερα· νῦν μέντοι πέπεισμαι τοῦθ᾿ ἱκανὸν
  προλαβεῖν ἡμῖν εἶναι τὴν πρώτην, ὅπως τοὺς συμμάχους
  σώσομεν. ἐὰν γὰρ τοῦτο βεβαίως ὑπάρξῃ, τότε καὶ περὶ τοῦ
  τίνα τιμωρήσεταί τις καὶ ὃν τρόπον ἐξέσται σκοπεῖν· πρὶν δὲ
  τὴν ἀρχὴν ὀρθῶς ὑποθέσθαι, μάταιον ἡγοῦμαι περὶ τῆς
  τελευτῆς ὁντινοῦν ποιεῖσθαι λόγον.

  Δημοσθένους, Γ´ ᾿Ολυνθιακὸς

Georgian:

  From a Unicode conference invitation:

  გთხოვთ ახლავე გაიაროთ რეგისტრაცია Unicode-ის მეათე საერთაშორისო
  კონფერენციაზე დასასწრებად, რომელიც გაიმართება 10-12 მარტს,
  ქ. მაინცში, გერმანიაში. კონფერენცია შეჰკრებს ერთად მსოფლიოს
  ექსპერტებს ისეთ დარგებში როგორიცაა ინტერნეტი და Unicode-ი,
  ინტერნაციონალიზაცია და ლოკალიზაცია, Unicode-ის გამოყენება
  ოპერაციულ სისტემებსა, და გამოყენებით პროგრამებში, შრიფტებში,
  ტექსტების დამუშავებასა და მრავალენოვან კომპიუტერულ სისტემებში.

Russian:

  From a Unicode conference invitation:

  Зарегистрируйтесь сейчас на Десятую Международную Конференцию по
  Unicode, которая состоится 10-12 марта 1997 года в Майнце в Германии.
  Конференция соберет широкий круг экспертов по  вопросам глобального
  Интернета и Unicode, локализации и интернационализации, воплощению и
  применению Unicode в различных операционных системах и программных
  приложениях, шрифтах, верстке и многоязычных компьютерных системах.

Thai (UCS Level 2):

  Excerpt from a poetry on The Romance of The Three Kingdoms (a Chinese
  classic 'San Gua'):

  [----------------------------|------------------------]
    ๏ แผ่นดินฮั่นเสื่อมโทรมแสนสังเวช  พระปกเกศกองบู๊กู้ขึ้นใหม่
  สิบสองกษัตริย์ก่อนหน้าแลถัดไป       สององค์ไซร้โง่เขลาเบาปัญญา
    ทรงนับถือขันทีเป็นที่พึ่ง           บ้านเมืองจึงวิปริตเป็นนักหนา
  โฮจิ๋นเรียกทัพทั่วหัวเมืองมา         หมายจะฆ่ามดชั่วตัวสำคัญ
    เหมือนขับไสไล่เสือจากเคหา      รับหมาป่าเข้ามาเลยอาสัญ
  ฝ่ายอ้องอุ้นยุแยกให้แตกกัน          ใช้สาวนั้นเป็นชนวนชื่นชวนใจ
    พลันลิฉุยกุยกีกลับก่อเหตุ          ช่างอาเพศจริงหนาฟ้าร้องไห้
  ต้องรบราฆ่าฟันจนบรรลัย           ฤๅหาใครค้ำชูกู้บรรลังก์ ฯ

  (The above is a two-column text. If combining characters are handled
  correctly, the lines of the second column should be aligned with the
  | character above.)

Ethiopian:

  Proverbs in the Amharic language:

  ሰማይ አይታረስ ንጉሥ አይከሰስ።
  ብላ ካለኝ እንደአባቴ በቆመጠኝ።
  ጌጥ ያለቤቱ ቁምጥና ነው።
  ደሀ በሕልሙ ቅቤ ባይጠጣ ንጣት በገደለው።
  የአፍ ወለምታ በቅቤ አይታሽም።
  አይጥ በበላ ዳዋ ተመታ።
  ሲተረጉሙ ይደረግሙ።
  ቀስ በቀስ፥ ዕንቁላል በእግሩ ይሄዳል።
  ድር ቢያብር አንበሳ ያስር።
  ሰው እንደቤቱ እንጅ እንደ ጉረቤቱ አይተዳደርም።
  እግዜር የከፈተውን ጉሮሮ ሳይዘጋው አይድርም።
  የጎረቤት ሌባ፥ ቢያዩት ይስቅ ባያዩት ያጠልቅ።
  ሥራ ከመፍታት ልጄን ላፋታት።
  ዓባይ ማደሪያ የለው፥ ግንድ ይዞ ይዞራል።
  የእስላም አገሩ መካ የአሞራ አገሩ ዋርካ።
  ተንጋሎ ቢተፉ ተመልሶ ባፉ።
  ወዳጅህ ማር ቢሆን ጨርስህ አትላሰው።
  እግርህን በፍራሽህ ልክ ዘርጋ።

Runes:

  ᚻᛖ ᚳᚹᚫᚦ ᚦᚫᛏ ᚻᛖ ᛒᚢᛞᛖ ᚩᚾ ᚦᚫᛗ ᛚᚪᚾᛞᛖ ᚾᚩᚱᚦᚹᛖᚪᚱᛞᚢᛗ ᚹᛁᚦ ᚦᚪ ᚹᛖᛥᚫ

  (Old English, which transcribed into Latin reads 'He cwaeth that he
  bude thaem lande northweardum with tha Westsae.' and means 'He said
  that he lived in the northern land near the Western Sea.')

Braille:

  ⡌⠁⠧⠑ ⠼⠁⠒  ⡍⠜⠇⠑⠹⠰⠎ ⡣⠕⠌

  ⡍⠜⠇⠑⠹ ⠺⠁⠎ ⠙⠑⠁⠙⠒ ⠞⠕ ⠃⠑⠛⠔ ⠺⠊⠹⠲ ⡹⠻⠑ ⠊⠎ ⠝⠕ ⠙⠳⠃⠞
  ⠱⠁⠞⠑⠧⠻ ⠁⠃⠳⠞ ⠹⠁⠞⠲ ⡹⠑ ⠗⠑⠛⠊⠌⠻ ⠕⠋ ⠙⠊⠎ ⠃⠥⠗⠊⠁⠇ ⠺⠁⠎
  ⠎⠊⠛⠝⠫ ⠃⠹ ⠹⠑ ⠊⠇⠻⠛⠹⠍⠁⠝⠂ ⠹⠑ ⠊⠇⠻⠅⠂ ⠹⠑ ⠥⠝⠙⠻⠞⠁⠅⠻⠂
  ⠁⠝⠙ ⠹⠑ ⠡⠊⠑⠋ ⠍⠳⠗⠝⠻⠲ ⡎⠊⠗⠕⠕⠛⠑ ⠎⠊⠛⠝⠫ ⠊⠞⠲ ⡁⠝⠙
  ⡎⠊⠗⠕⠕⠛⠑⠰⠎ ⠝⠁⠍⠑ ⠺⠁⠎ ⠛⠕⠕⠙ ⠥⠏⠕⠝ ⠰⡡⠁⠝⠛⠑⠂ ⠋⠕⠗ ⠁⠝⠹⠹⠔⠛ ⠙⠑
  ⠡⠕⠎⠑ ⠞⠕ ⠏⠥⠞ ⠙⠊⠎ ⠙⠁⠝⠙ ⠞⠕⠲

  ⡕⠇⠙ ⡍⠜⠇⠑⠹ ⠺⠁⠎ ⠁⠎ ⠙⠑⠁⠙ ⠁⠎ ⠁ ⠙⠕⠕⠗⠤⠝⠁⠊⠇⠲

  ⡍⠔⠙⠖ ⡊ ⠙⠕⠝⠰⠞ ⠍⠑⠁⠝ ⠞⠕ ⠎⠁⠹ ⠹⠁⠞ ⡊ ⠅⠝⠪⠂ ⠕⠋ ⠍⠹
  ⠪⠝ ⠅⠝⠪⠇⠫⠛⠑⠂ ⠱⠁⠞ ⠹⠻⠑ ⠊⠎ ⠏⠜⠞⠊⠊⠥⠇⠜⠇⠹ ⠙⠑⠁⠙ ⠁⠃⠳⠞
  ⠁ ⠙⠕⠕⠗⠤⠝⠁⠊⠇⠲ ⡊ ⠍⠊⠣⠞ ⠙⠁⠧⠑ ⠃⠑⠲ ⠔⠊⠇⠔⠫⠂ ⠍⠹⠎⠑⠇⠋⠂ ⠞⠕
  ⠗⠑⠛⠜⠙ ⠁ ⠊⠕⠋⠋⠔⠤⠝⠁⠊⠇ ⠁⠎ ⠹⠑ ⠙⠑⠁⠙⠑⠌ ⠏⠊⠑⠊⠑ ⠕⠋ ⠊⠗⠕⠝⠍⠕⠝⠛⠻⠹
  ⠔ ⠹⠑ ⠞⠗⠁⠙⠑⠲ ⡃⠥⠞ ⠹⠑ ⠺⠊⠎⠙⠕⠍ ⠕⠋ ⠳⠗ ⠁⠝⠊⠑⠌⠕⠗⠎
  ⠊⠎ ⠔ ⠹⠑ ⠎⠊⠍⠊⠇⠑⠆ ⠁⠝⠙ ⠍⠹ ⠥⠝⠙⠁⠇⠇⠪⠫ ⠙⠁⠝⠙⠎
  ⠩⠁⠇⠇ ⠝⠕⠞ ⠙⠊⠌⠥⠗⠃ ⠊⠞⠂ ⠕⠗ ⠹⠑ ⡊⠳⠝⠞⠗⠹⠰⠎ ⠙⠕⠝⠑ ⠋⠕⠗⠲ ⡹⠳
  ⠺⠊⠇⠇ ⠹⠻⠑⠋⠕⠗⠑ ⠏⠻⠍⠊⠞ ⠍⠑ ⠞⠕ ⠗⠑⠏⠑⠁⠞⠂ ⠑⠍⠏⠙⠁⠞⠊⠊⠁⠇⠇⠹⠂ ⠹⠁⠞
  ⡍⠜⠇⠑⠹ ⠺⠁⠎ ⠁⠎ ⠙⠑⠁⠙ ⠁⠎ ⠁ ⠙⠕⠕⠗⠤⠝⠁⠊⠇⠲

  (The first couple of paragraphs of "A Christmas Carol" by Dickens)

Compact font selection example text:

  ABCDEFGHIJKLMNOPQRSTUVWXYZ /0123456789
  abcdefghijklmnopqrstuvwxyz £©µÀÆÖÞßéöÿ
  –—‘“”„†•…‰™œŠŸž€ ΑΒΓΔΩαβγδω АБВГДабвгд
  ∀∂∈ℝ∧∪≡∞ ↑↗↨↻⇣ ┐┼╔╘░►☺♀ ﬁ�⑀₂ἠḂӥẄɐː⍎אԱა

Greetings in various languages:

  Hello world, Καλημέρα κόσμε, コンニチハ
LONGUTF8;

string text7 = @UTF8
Box drawing alignment tests:                                          █
                                                                      ▉
  ╔══╦══╗  ┌──┬──┐  ╭──┬──╮  ╭──┬──╮  ┏━━┳━━┓  ┎┒┏┑   ╷  ╻ ┏┯┓ ┌┰┐    ▊ ╱╲╱╲╳╳╳
  ║┌─╨─┐║  │╔═╧═╗│  │╒═╪═╕│  │╓─╁─╖│  ┃┌─╂─┐┃  ┗╃╄┙  ╶┼╴╺╋╸┠┼┨ ┝╋┥    ▋ ╲╱╲╱╳╳╳
  ║│╲ ╱│║  │║   ║│  ││ │ ││  │║ ┃ ║│  ┃│ ╿ │┃  ┍╅╆┓   ╵  ╹ ┗┷┛ └┸┘    ▌ ╱╲╱╲╳╳╳
  ╠╡ ╳ ╞╣  ├╢   ╟┤  ├┼─┼─┼┤  ├╫─╂─╫┤  ┣┿╾┼╼┿┫  ┕┛┖┚     ┌┄┄┐ ╎ ┏┅┅┓ ┋ ▍ ╲╱╲╱╳╳╳
  ║│╱ ╲│║  │║   ║│  ││ │ ││  │║ ┃ ║│  ┃│ ╽ │┃  ░░▒▒▓▓██ ┊  ┆ ╎ ╏  ┇ ┋ ▎
  ║└─╥─┘║  │╚═╤═╝│  │╘═╪═╛│  │╙─╀─╜│  ┃└─╂─┘┃  ░░▒▒▓▓██ ┊  ┆ ╎ ╏  ┇ ┋ ▏
  ╚══╩══╝  └──┴──┘  ╰──┴──╯  ╰──┴──╯  ┗━━┻━━┛           └╌╌┘ ╎ ┗╍╍┛ ┋  ▁▂▃▄▅▆▇█
UTF8;

string text8 = @UNICODE
UTF-8 encoded sample plain-text file
‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
Source https://antofthy.gitlab.io/info/data/utf8-demo.txt


Original version from  Markus Kuhn [ˈmaʳkʊs kuːn]  from University of Cambridge
  http://www.cl.cam.ac.uk/~mgk25/
   https://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-demo.txt
   https://antofthy.gitlab.io/info/data/unicode_examples/UTF-8-demo.txt
   https://gist.github.com/msabramo/3921955
A UTF-8 program stress test file...
   https://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt
   https://antofthy.gitlab.io/info/data/unicode_examples/UTF-8-test.txt

This version has been updated with more sets, and some other symbols as
a reference.

This page started from the above fore mentioned example page but has expanded
far beyond the original.  It is particularly focused on the interactions
between of Unicode characters, so they work as a seamless whole.

It is meant to provide a reference of Unicode that work well together, and
report what doesn't work, even though it should work.  This document will often
show up any problems a particular font or application has very quickly.

Before using Unicode in applications  I recommend you also look at
"unicode.txt" in this directory...
   https://antofthy.gitlab.io/info/data/unicode.txt

Many examples below are designed to work with a fixed-width or non-proportional
font.  I have also made notes about a number of fonts that I found 'promising'.
See "unicode_fonts.txt" in this directory...
   https://antofthy.gitlab.io/info/data/unicode_font.txt

So far no font has been found to be absolutely 'perfect', though a few
are pretty close.


General Unicode Notes and Problems...

If the first non-space character in a line is special (braille, some math
characters, diacritic), then all the spaces before that character may be
inexplicably replaced with matching half-width spaces, even in
a fixed-width font. Aargh...

"Combining Diacritical Marks" generally work in all GTK applications,
but often do NOT handle of "Combining Symbols" (block U+20D0) properly.
EG: These very useful combined characters   X⃞ ╳⃞ ✓⃞ ✗⃞   do not always work...

Anthony Thyssen, July 2020

===============================================================================
Typographical Usage of Unicode:

            ╔═══════════════════════════════════════════╗
            ║                                           ║
            ║   • ‘single’ and “double” quotes ❛ ❜ ❝ ❞  ║
            ║                                           ║
            ║   • Curly apostrophes: “We’ve been here”  ║
            ║                                           ║
            ║   • Latin-1 apostrophe and accents: '´`   ║
            ║                                           ║
            ║   • ‚deutsche‘ „Anführungszeichen“        ║
            ║                                           ║
            ║   • †, ‡, %, ‰, •, 3–4, —, −5/+5, ™, …    ║
            ║                                           ║
            ║   • Underline using the line below        ║
            ║     ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾        ║
            ║   • ASCII safety test: 1lI|, 0ODQ, 8B     ║
            ║                      ╭────────────────╮   ║
            ║   • Currency in Box: │ 14.95€  5£  2¢ │   ║
            ║                      ╰────────────────╯   ║
            ╚═══════════════════════════════════════════╝

Mathematics and Science Usage:

  ∮ e⋅da = q,  n → ∞,  ∑ f(i) = ∏ g(i),

  ∀x∈ℝ: ⌈x⌉ = −⌊−x⌋, α ∧ ¬β = ¬(¬α ∨ β),

  ⟦ ℤ ⊂ ℚ ⊂ ℝ ⊂ ℂ ⊂ ℕ ⊆ ℕ₀ ⟧,

  a ≠ b ≡ c ≤ d ≥ e   (⟪a⟫ ⇔ ⟪b⟫)

  2h₂ + o₂ ⇌ 2h₂o,   r = 4.7 kω,

  ∆d ≈ √2,  ∛5,  ⌀200 mm,  ∠±30°, ⊾⊿

  ⎧ ⎡ ⎛   ⎞ ⎤ ⎫   ⌠    ┌─────┐   ∞
  ⎪ ⎢ ⎜   ⎟ ⎥ ⎪   ⎮    │a²+b³    ⎲
  ⎨ ⎢ ⎜   ⎟ ⎥ ⎬   ⎮    │─────    ⎳aⁱ-bⁱ
  ⎪ ⎢ ⎜   ⎟ ⎥ ⎪   ⎮    ⎷ c₈     i=1
  ⎩ ⎣ ⎝   ⎠ ⎦ ⎭   ⌡

In the above examples, extended bracket alignment requires a fixed with font.
X Window 'fixed' fonts work correctly for all the above.  True-type
"Monospace","Terminus" fonts also works well for the extended brackets.

The X window Misc fonts treat square root base, "Radical Symbol Bottom", '⎷',
so that it joins with vertical box character so you can create larger
multi-line square root symbols.  However most true-type fonts implement the
glyph more like a normal square-root symbol ('√'), and will sometime join
while other times it does not.

Also most truetype fonts do not ensure the double height summation (like '∑')
correctly join up, leaving glaring gap vertically in the final larger symbol.

-------------------------------------------------------------------------------
Character Symbol Groupings...

Typographical:
    dash:  -       ‘single’      apostrophe '
    ndash: –       “double”      ascents    ´
    mdash: —       ellipsis …    decent     `
           ❛ fancy ❜      ❝ quotes ❞

Spaces:
  I use this as a reference of 'invisible characters'.
  No Break Space  ' '  \u00A0 (also called meta-space)
  Narrow No break ' '  \u202F
  Space Unicode:  \u2000 to \u200F '           ​‌‍‎‏'
    ' '       \u205F   Math Space
    '⠀'       \u2800   Braile Space (not blank in GTK "Monospace")
    '　'      \u3000   Chinese Ideograph Space (double width)
    '⁠⁠'        \u2060   Word Joiner (vim has trouble, and stuffs rest of line)
    '﻿'        \uFEFF   Zero Width - no break space

Various Symbols Grouped by simularity:

  Ticks & Crosses:  ✓ ✔ √ ⍻   ✗ ✘ ✕ ✖   ❌ ❎
                    ╳ ☓ Ⅹ × x    (last is a normal 'x')
                    ☐ ☑ ☒ 〿 ⛝   X⃞ ╳⃞ ✓⃞ ✗⃞       (last group are combined symbols)
  Dot Centered:     • ․ · ‧ ٠ ᛫ ･   ⋅ ∙ ●
  Circle Centered:  ◦ ◌ ○ ◯ ●   ⋄ ᛜ ∘ ๐ ໐ o   0 O
  Circled Dot:      ⊙ ⊚ ◉ ◎ ๏ ⌾ ☉ ʘ ⨀         (goes wierd in GTK)
  Misc Dots:        . ․   ⡀ ⢀ ⠠ ⠄             (period and braile dots)
  Misc Sm Circles:  ｡ ⋄ ° ﾟ ˚ ﹾ
  Diamonds:         ⋄ ᛜ ⌔ ◇ ⟐ ◈ ◆   ◊
  Sm Squares:       ▫ ▪ ⌑ ◻ ◼ ▢ □ ⊡ ▣   ■ ∎
  Boxed Symbols:    ⌸ ⌹ ⌻ ⌺ ⌼ ⍁ ⍂ ⍇ ⍈ ⍌ ⍓ ⍃ ⍄ ⍍ ⍔ ⍐ ⍗ ⍞
  Combined Dots:    .⃝ ⋅⃝ ∘⃝ •⃝   •⃟   •⃞ ▫⃞         (these are combined symbols)

  Triangles:        ▵ ▴ Δ △ ◬
                    ▲ ▼ ▶ ◀ △ ▽ ▷ ◁
                    ▴ ▾ ▸ ◂ ▵ ▿ ▹ ◃

  Stars:            ⋆ ★ ☆ ✩ ✫ ✬ ✭ ✮ ✯ ✰
                    ˖ + ⊹ ᛭ ✛ ✜ ✚
                    ☩ ⌖ ✢ ✣ ✤ ✥ ⟡ ✧ ✦ ⌖
                    * ⁎ ᛡ ✶ ✲ ✱ ✻ ✼ ✽ ✾

  Arrows:           ← ↖ ↑ ↗ → ↘ ↓ ↙ ↔ ↕   ⇄ ⇅
                    ⇦ ⇨ ⇧ ⇩ ⬅ ⇐ ⇑ ⇒ ⇓ ⇔ ⇕
                    ⏎ ↲ ☇ ↪ ➥ ➞ ➡ ➟ ➠
                    ↶ ↷ ⟲ ⟳ ↺ ↻
                    ⟹   ⟶   ⟵   ⟸   ⟷      Very long in proportional truetype
  Arrows Multichar: ──➤   ══━━➤   ◅――▻  ⊲――⊳  ≺――≻  ◁――▷  ◀――▶

  Punctuation:      ? ¿ ␦ ! ‼ ¡ ❢
  Quote Pairs:      ''  `´  ""  ‘’  “”  ‚‛  „‟  ❛ ❜  ❝ ❞
  Ellipses:         ․ ‥ … ⋯   ┈ ┉ ┄ ┅
  Hyphens:          -   ‐ ‒ – — ―         ( ‑ no break hyphen )
  Brackets:         ( ⸨ ⸩ ) ⁽ ₍ ⁾ ₎ [ ⟦ ⟧ ]
                    ≺ ‹ < ⟨ ⟩ > › ≻   ˂ ˃ ˒ ˓
                    ⟪ « ≪ ⋘ ⋙ ≫ » ⟫

  Vertical Bars:    | ¦ ❘ ❙ ❚   │ ╎ ┆ ┊   ˌ╷❘ﺍ╵ˈ
  Maths:            × ÷ ±   √ ∛   % ‰ ‱ ⁒   ∵ ∴ ⸪ ⸫

  Footnotes:        ¶ ¥ § ¬ † ‡ ⁋ ⁑ ⌘ ϯ Ϯ ϟ ☥
  Other symbols:    ❤ ♡ ♂ ♀ ☆ ☾ ☽ ☠ ✄ ☢ ∞ ⌑ ␥ ⑅
                    ♠ ♣ ♥ ♦   ♩ ♪ ♫ ♬ ♭ ♮   ⚐ ⚑ ⛿ ⛳
                    € £ ¢ ℃ ℉ © ® ™
                    ␛ ␠ ␡ ␄   ‸ ˬ ﬩ ␣ ˪ ¬ ˍ ⁺
                    ∵ ∴ ∶ ∷   ∶ ⋮ ┊ ┋
                    ❖ ⸭ ⸪ ⸫ ⁖ ⸬ ⁙ ። ፡ : ፧  ⡇ ⠶ ⣿
                    ⌚ ⌛                     (double width in xterm/vim)
  Smiley, faces:    ☺ ☹ ☻ ⍨
                    ㋡ ㋛ 〠 シ ッ ツ ヅ      (double width, not in X misc)

  Morphology
    ⊙ ⊚ ⊗ ⊕ ⊖ ⊘ ⊛ ⊜ ⊝   ⊞ ⊟ ⊠ ⊡
  Part circle
    ● ◐ ◑ ◒ ◓ ◔ ◕ ◖ ◗
  Super-scripts (are not in sequence)...
    ⁰ ¹ ² ³ ⁴ ⁵ ⁶ ⁷ ⁸ ⁹ ⁺ ⁻ ⁼ ⁽ ⁾ ⁱ ⁿ ˂ ˃ ˣ ˢ ˡ
  Sub-scripts
    ₀ ₁ ₂ ₃ ₄ ₅ ₆ ₇ ₈ ₉ ₊ ₋ ₌ ₍ ₎
    ₐ ₑ ₒ ₓ ₔ ₕ ₖ ₗ ₘ ₙ ₚ ₛ ₜ
  Fractions
    ¼ ½ ¾ ⅓ ⅔ ⅕ ⅖ ⅗ ⅘ ⅙ ⅚ ⅛ ⅜ ⅝ ⅞ % ℅ ‰ ‱
  Roman numerals
    Ⅰ Ⅱ Ⅲ Ⅳ Ⅴ Ⅵ Ⅶ Ⅷ Ⅸ Ⅹ Ⅺ Ⅻ Ⅼ Ⅽ Ⅾ Ⅿ
    ⅰ ⅱ ⅲ ⅳ ⅴ ⅵ ⅶ ⅷ ⅸ ⅹ ⅺ ⅻ ⅼ ⅽ ⅾ ⅿ
  Number Period
    ⒈ ⒉ ⒊ ⒋ ⒌ ⒍ ⒎ ⒏ ⒐ ⒑ ⒒ ⒓ ⒔ ⒕ ⒖ ⒗ ⒘ ⒙ ⒚ ⒛
  Bracket Numbers
    ⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾ ⑿ ⒀ ⒁ ⒂ ⒃ ⒄ ⒅ ⒆ ⒇
  Circle Numbers
    ➀ ➁ ➂ ➃ ➄ ➅ ➆ ➇ ➈ ➉
    ➊ ➋ ➌ ➍ ➎ ➏ ➐ ➑ ➒ ➓
    ⓪ ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨
    ⑩ ⑪ ⑫ ⑬ ⑭ ⑮ ⑯ ⑰ ⑱ ⑲ ⑳
  Braille
    ⡀ ⡄ ⡆ ⡇ ⣇ ⣧ ⣷ ⣿   ⣤ ⠶ ⠛
    ⡀ ⠄ ⠂ ⠁ ⠈ ⠐ ⠠ ⢀   ⣀ ⠤ ⠒ ⠉   ⡈ ⠔ ⠢ ⢁

These are all pretty good. Though GTK fonts do replace some characters
with emoji equivalents.

Also see Spinners for many unicode glyph animation sequences...
  https://antofthy.gitlab.io/info/ascii/Spinners.txt

-------------------------------------------------------------------------------
Drawing Characters...

Box Drawing, Block Elements & Geometric Shapes U+2500:

  Box Character Examples...

    ┌┬┐ ╓╥╖  ┌┬┐ ┎┰┒  ┌╷┐  ╃╀╄  ╆╈╅  │╎┆┊ ┃╏┇┋  █                 ▄████▄
    ├┼┤─╟╫╢  ├┼┤─┠╂┨  ╶┼╴  ┽┼┾  ╊╋╉  │╎┆┊ ┃╏┇┋  ▉  ╱╲╱╲╳╳╳       ▐▌    ▐▌
    └┴┘ ╙╨╜  └┴┘ ┖┸┚  └╵┘  ╅╁╆  ╄╇╃  │╎┆┊ ┃╏┇┋  ▊  ╲╱╲╱╳╳╳    ▄▀▀█▀    ▐▌
     │   ║    │   ┃                             ▋  ╱╲╱╲╳╳╳    ▄ ▐▄     ▐▌▀▀▄
    ╒╤╕ ╔╦╗  ┍┯┑ ┏┳┓  ┏╻┓ ╭╽╮  ┟┲┱┧  ──── ━━━━  ▌  ╲╱╲╱╳╳╳  ▐▀ ▄▄ ▀▌ ▄▀▀ ▀▄ ▀
    ╞╪╡═╠╬╣  ┝┿┥━┣╋┫  ╺╋╸ ╼╋╾  ┞┺┹┦  ╌╌╌╌ ╍╍╍╍  ▍           ▐ ▀██▀ ▌▐ ▄██▄ ▌
    ╘╧╛ ╚╩╝  ┕┷┙ ┗┻┛  ┗╹┛ ╰╿╯  ┢┭┮┪  ┄┄┄┄ ┅┅┅┅  ▎ ▁▂▃▄▅▆▇█   ▀▄ ▄▄▀ ▐  ▀▀  ▌
    ╔═╦═╗  ┌─┬─┐  ╭─┬─╮  ╭─┬─╮ ┡┵┶┩  ┉┉┉┉ ┉┉┉┉  ▏               █    ▀▄▄ ▄▀
    ║┌╨┐║  │╔╧╗│  │╒╪╕│  │╓╁╖│                    ░░▒▒▓▓██      █ █    █ ▐
    ╠╡╳╞╣  ├╢╳╟┤  ├┼┼┼┤  ├╫╂╫┤  ▞▚  ▗▄▖  ▛▀▜  ╭╮  ░░▒▒▓▓██      █ █   ▐▌ █
    ║└╥┘║  │╚╤╝│  │╘╪╛│  │╙╀╜│  ▚▞  ▐ ▌  ▌█▐  ╰╯                █ █   ▐▌ █
    ╚═╩═╝  └─┴─┘  ╰─┴─╯  ╰─┴─╯      ▝▀▘  ▙▄▟  ╭╮  ╭╮            ▐▌▐▌   █ █
    ┌─┬┐  ┌─┬┒  ┌─┲┓  ╓─╥╖  ╒═╤╕  ╔═╦╗        ╰┼──┼╯            ▐▌ █▄ ▐▌ █
    │ ││  │ │┃  │ ┃┃  ║ ║║  │ ││  ║ ║║  ╲│╱    │  │              █  ▀▀▀  ▐▌
    ├─┼┤  ├─╆┫  ┢━╋┫  ╟─╫╢  ╞═╪╡  ╠═╬╣  ─╳─   ╭┼──┼╮             ▐▌      █
    └─┴┘  ┕━┻┛  ┗━┻┛  ╙─╨╜  ╘═╧╛  ╚═╩╝  ╱│╲   ╰╯  ╰╯              █▄    ▄█
    ┌─┬─────────┬─────────┐                                        ▀████▀
    │ └─┐ ┌───┐ ├───┬───┐ │  ┌───────────────────┐   ┌┮┭┬┬┲┱┬┬┬┐
    ├─┐ │ └─┐ │ │ ╷ ╵ ╷ ╵ │  │  ╔═══╗ Some Text  │▒  ┟┼┼┼┼╄╃┼┼┼┧
    │ │ │ ╷ │ ╵ │ └───┴─┐ │  │  ╚═╦═╝ in the box │▒  ┞┼┼┼┼┼┼┼┼┼┦
    │ │ └─┤ │ ╶─┴─────╴ │ │  ╞═╤══╩══╤═══════════╡▒  ┢╅┼┼┼┼┼┼┼╆┪ \_wrong in
    │ └─╴ │ │ ┌─────┬───┤ │  │ ├──┬──┤           │▒  ┡╃┼┼┼┼┼┼┼╄┩ / X 9x15 font
    │ ╶─┬─┤ └─┘ ╶─┐ │ ┌─┘ │  │ └──┴──┘           │▒  ├┼╆╈╅┼┼╁┼┼┤
    ├─┐ │ ╵ ┌─────┤ │ ╵ ╶─┤  └───────────────────┘▒  ├┼╊╋╉┼┾╋┽┼┤
    │ │ └─┐ │ ┌─╴ │ └─┬─┐ │   ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒  ├┼╄╇╃┼┼╀┼┼┤
    │ └─┐ └─┘ │ ╶─┴─┐ │ ╵ │                          ├┼┼┼┼╆╅┼┼┼┤
    │ ╶─┴─────┴───╴ ╵ │ ╶─┤                          └┶┵┴┴┺┹┴┴┴┘
    └─────────────────┴───┘

  Matching Sets Geometric Shapes in U+2500:
    Squares:      ■ □ ▣ ▤ ▥ ▦ ▧ ▨ ▩ ◧ ◨ ◩ ◪ ◫
                  ◧ ◨ ◩ ◪ ◫ ◰ ◱ ◲ ◳
                  ■ □ ◼ ◻ ▪ ▫
                  ◸ ◹ ◺ ◿ ◢ ◣ ◤ ◥
                  ▢ ◴ ◵ ◶ ◷
    Triangles:    ▲ △ ◬ ◭ ◮
                  ▲ ▼ ▶ ◀ △ ▽ ▷ ◁
                  ▴ ▾ ▸ ◂ ▵ ▿ ▹ ◃
                      ► ◄     ▻ ◅
                  ⏯ ⏮ ⏭ ⏪ ⏩ ⏫ ⏬
    Diamonds:     ◇ ◈ ◊
    Circles:      ● ○ ◉ ◌ ◍ ◎
                  ◐ ◑ ◒ ◓ ◔ ◕ ◖ ◗
                  ◦ ○ ◯
                  ◜ ◝ ◞ ◟◠ ◡
    Rectangles:   ▬ ▭ ▮ ▯

  Note these do not connect to each other, but can be good for framing...
  Includes simularly matching chars are from other sets...

    ◿ ◺  ◢◣  ◜◝  ⌌ ⌍  ⌜ ⌝   ⌈ ⌉   ⎾ ⏋       ⌢ ◠ ⌃ ⎴ ˆ ⁀ ⎺
    ◹ ◸  ◥◤  ◟◞  ⌎ ⌏  ⌞ ⌟   ⌊ ⌋   ⎿ ⏌       ⌣ ◡ ⌄ ⎵ ˬ ‿ ⎽
       Wrong in X misc 9x15 font ───╯    ╷
        CJK or blank in Truetype fonts ──╯

Other Examples...
    https://en.wikipedia.org/wiki/Box-drawing_character
    https://www.vidarholen.net/cgi-bin/labyrinth?w=13&h=13
    http://xahlee.info/comp/unicode_drawing_shapes.html
    http://tamivox.org/dave/boxchar/index.html
    http://clubmate.fi/using-pseudographics-in-blogposts-drawing-ascii-diagrams-and-boxes/

Using Box drawing with other unicode sets...

  Warning: box lines do not always work with other shapes. But should!
  Obviously font designers do not care about box drawing fonts all that much!
  As such they really only work in fixed width terminals, like xterms ☹

       ╷       ∧       ⊤
    ◁──╯╭──▷  ╱ ╲ ╱   ⊢┼──◠─◡──⌃─⌄──⊣   ⊢──⊣   ⊩──   ⊪──   ──══━━──
        ╵        ∨     ⊥

    ⇐═══⇒  ⊨═══  ⊫══⋕══≒≑≓≐≗══˭══≔══≖══≕══≡══≣══

    ⟸═══⟹             Longer prop font double line arrows \u27f8-9

    ─────➤   ═════➤   Right arrow heads (X windows and GTK "Monospace")

-------------------------------------------------------------------------------
Horizontal Lines:

        ╭────── overbar punctuation (underline using line below)
        │      ╭────── horizontal line extension
        ∨      ∨
    ▔▔ ‾‾ ⎺⎺⎻⎻⎯⎯⎼⎼⎽⎽ ▁▁
     ∧                ∧
     ╰────────────────╰──── 1/8 block, top and bottom

    ▷───◁             \u2500  box drawing horizontal line
         ▷―――◁        \u2015  horizontal bar (can be 'long' in some fonts)
              ▷⎯⎯⎯◁   \u23af  horizontal line extension (fails in "Monospace")

    ─────―――――⎯⎯⎯⎯⎯   The three together (aligned with above)

  Arrows using horizontal bar \u2015
  (seems to be the best choice overall, though 'dashy' in some fonts)

    ◅―――▻   ◄―――►   ⊲―――⊳   ≺―――≻   ⇐―――⇒
    ◃―――▹   ◂―――▸   ⊢―――⊣   ⊰―――⊱   ⋖―――⋗
    ◁―――▷   ◀―――▶   ⟵―――⟶   «―――»   ⟝―――⟞

  Notes:
    \u2500 box drawing line, should work but often doesn't.
    \u23af horizontal line extension works well, though "chrome" replaces it.
    \u2015 horizontal bar, works but is very long in proportional fonts.

  All work perfectly for X window "misc-fixed" fonts.
  Only "horizontal bar" works for GTK "Monospace" and Truetype "Terminus" fonts.

-------------------------------------------------------------------------------
Vertical Lines:

  There is a lot of vertical bars for extended brackets in the U+2300 unicode
  block.  You should ensure you use the right one for each bracket type.  See
  example in the "Mathematics and Sciences" section above.

                _used with_
    ⎸   \u23b8                 left box line (bad in many fonts)
    ▏   \u258f                 1/8 block left
    ⎢   \u23a2   ⎡ ⎣           left square bracket
    ⎜   \u239c   ⎛ ⎝           left parenthesis
    ⎪   \u23aa   ⎧ ⎨ ⎩ ⎫ ⎬ ⎭   curly braces (extension bad in GTK)
    │   \u2502   ⎷ ┌ ─ ┐       box drawing vertical line (see above)
    ⎮   \u23ae   ⌠ ⌡           intergral sign
    ⎟   \u239f   ⎞ ⎠           right parenthesis
    ⎥   \u23a5   ⎤ ⎦           right square bracket
    ▕   \u2595                 1/8 block right
    ⎹   \u23b9                 right box line (bad in many fonts)

    ⏐   \u23d0 vertical line extension (missing in X window fonts)

    △  ▵  ▲  ▴  ∆  ⋏  ∧  ⋀  ⊤  ⟙  ┃  <-- \u2503 box vert line bold
    │  │  │  │  │  │  │  │  │  │  │  <-- \u2502 box vert line
    ▽  ▿  ▼  ▾  ∇  ⋎  ∨  ⋁  ⊥  ⟘  ║  <-- \u2551 box vert line doubled

  Just about all the centered vertical lines work for vertical arrows.
  No problems for X windows "fixed" font (as always).

  GTK "Monospace" works okay, except for '⊤' '⊥' '⎷'
      It also loses prefix spaces for many characters in "gedit"
  But "Terminus" has proportional width faults
  unless you are using "gvim" which 'squares' all characters anyway.

-------------------------------------------------------------------------------
Upside Down Letters:
  NB: Characters are from all over the unicode, some are not always available

    Z⅄XMᴧ∩⊥SᴚΌԀOᴎW⅂⋊ſIH⅁ℲƎ◖Ↄ𐐒∀
    zʎxʍʌnʇsɹbdouɯƖʞɾᴉɥƃɟǝpɔqɐ
    068ㄥ9ϛㄣƐᄅƖ
     ˙ ʻ ؛ ¿ ¡ „ ⅋

  Alternatives
    i ->  ı ᴉ
    l ->  Ɩ ʅ
    2 ->  Z ᄅ
    G ->  ⅁ פ
    . ->  ˙⠐  ° ˚
    , ->  ' ʻ ‘

  Example Phrases

    ¡ɐᴉlɐɹʇsn∀ ʻɹǝpun uʍop ɯoɹɟ sƃuᴉʇǝǝɹ⅁

    ¡ɹǝpun uʍop ɯoɹɟ ʻʎɐp,ɐ⅁

    ¡sǝᴉqɯoz noʎ ƖƖɐ ʎǝɥ ʎǝH

    ˙˙˙unɟ ǝʌɐH  ˙sǝıqɯoz noʎ ƖƖɐ ʇɥƃıu poo⅁

  Converters...
    http://www.upsidedowntext.com/
    https://fsymbols.com/generators/aboqe-flip/
    https://www.fileformat.info/convert/text/upside-down.htm
    https://www.fileformat.info/convert/text/upside-down-map.htm
    http://xahlee.info/comp/unicode_invert_text.html

  Other types of text substitution converters....
    https://fsymbols.com/generators/wavy
    https://fsymbols.com/generators/zalgo
    https://fsymbols.com/generators/carty/
    https://fsymbols.com/generators/smallcaps/
    ...

===============================================================================
Unicode Block Tables...

Spacing Modifier Letters U+02B0
    ʰ ʱ ʲ ʳ ʴ ʵ ʶ ʷ ʸ ʹ ʺ ʻ ʼ ʽ ʾ ʿ
    ˀ ˁ ˂ ˃ ˄ ˅ ˆ ˇ ˈ ˉ ˊ ˋ ˌ ˍ ˎ ˏ
    ː ˑ ˒ ˓ ˔ ˕ ˖ ˗ ˘ ˙ ˚ ˛ ˜ ˝ ˞ ˟
    ˠ ˡ ˢ ˣ ˤ ˥ ˦ ˧ ˨ ˩ ˪ ˫ ˬ ˭ ˮ ˯
    ˰ ˱ ˲ ˳ ˴ ˵ ˶ ˷ ˸ ˹ ˺ ˻ ˼ ˽ ˾ ˿

Tolkan Runes  U+16A0
    ᚠ ᚡ ᚢ ᚣ ᚤ ᚥ ᚦ ᚧ ᚨ ᚩ ᚪ ᚫ ᚬ ᚭ ᚮ ᚯ
    ᚰ ᚱ ᚲ ᚳ ᚴ ᚵ ᚶ ᚷ ᚸ ᚹ ᚺ ᚻ ᚼ ᚽ ᚾ ᚿ
    ᛀ ᛁ ᛂ ᛃ ᛄ ᛅ ᛆ ᛇ ᛈ ᛉ ᛊ ᛋ ᛌ ᛍ ᛎ ᛏ
    ᛐ ᛑ ᛒ ᛓ ᛔ ᛕ ᛖ ᛗ ᛘ ᛙ ᛚ ᛛ ᛜ ᛝ ᛞ ᛟ
    ᛠ ᛡ ᛢ ᛣ ᛤ ᛥ ᛦ ᛧ ᛨ ᛩ ᛪ ᛫ ᛬ ᛭ ᛮ ᛯ

---
Punctuation U+2000
    ‐ ‑ ‒ – — ― ‖ ‗ ‘ ’ ‚ ‛ “ ” „ ‟
    † ‡ • ‣ ․ ‥ … ‧
    ‰ ‱ ′ ″ ‴ ‵ ‶ ‷ ‸ ‹ › ※ ‼ ‽ ‾ ‿
    ⁀ ⁁ ⁂ ⁃ ⁄ ⁅ ⁆ ⁇ ⁈ ⁉ ⁊ ⁋ ⁌ ⁍ ⁎ ⁏
    ⁐ ⁑ ⁒ ⁓ ⁔ ⁕ ⁖ ⁗ ⁘ ⁙ ⁚ ⁛ ⁜ ⁝ ⁞

Superscripts & Subscripts U+2070
    ⁰ ⁱ   ⁴ ⁵ ⁶ ⁷ ⁸ ⁹ ⁺ ⁻ ⁼ ⁽ ⁾ ⁿ
    ₀ ₁ ₂ ₃ ₄ ₅ ₆ ₇ ₈ ₉ ₊ ₋ ₌ ₍ ₎
    ₐ ₑ ₒ ₓ ₔ ₕ ₖ ₗ ₘ ₙ ₚ ₛ ₜ


---
Arrows U+2190
    ← ↑ → ↓ ↔ ↕ ↖ ↗ ↘ ↙ ↚ ↛ ↜ ↝ ↞ ↟
    ↠ ↡ ↢ ↣ ↤ ↥ ↦ ↧ ↨ ↩ ↪ ↫ ↬ ↭ ↮ ↯
    ↰ ↱ ↲ ↳ ↴ ↵ ↶ ↷ ↸ ↹ ↺ ↻ ↼ ↽ ↾ ↿
    ⇀ ⇁ ⇂ ⇃ ⇄ ⇅ ⇆ ⇇ ⇈ ⇉ ⇊ ⇋ ⇌ ⇍ ⇎ ⇏
    ⇐ ⇑ ⇒ ⇓ ⇔ ⇕ ⇖ ⇗ ⇘ ⇙ ⇚ ⇛ ⇜ ⇝ ⇞ ⇟
    ⇠ ⇡ ⇢ ⇣ ⇤ ⇥ ⇦ ⇧ ⇨ ⇩ ⇪ ⇫ ⇬ ⇭ ⇮ ⇯
    ⇰ ⇱ ⇲ ⇳ ⇴ ⇵ ⇶ ⇷ ⇸ ⇹ ⇺ ⇻ ⇼ ⇽ ⇾ ⇿
  Dingbat Arrows (U+2790)
    ➔ ➘ ➙ ➚ ➛ ➜ ➝ ➞ ➟ ➠ ➡ ➢ ➣
    ➤ ➥ ➦ ➧ ➨ ➩ ➪ ➫ ➬ ➭ ➮ ➯ ➱
    ➳ ➴ ➵ ➶ ➷ ➸ ➹ ➺ ➻ ➼ ➽ ➾ ➿
  Supplement-A (U+27F0)
    ⟰ ⟱ ⟲ ⟳ ⟴ ⟵ ⟶ ⟷ ⟸ ⟹ ⟺ ⟻ ⟼ ⟽ ⟾ ⟿
  Supplement-B (U+2900, not in X fonts)
    ⤀ ⤁ ⤂ ⤃ ⤄ ⤅ ⤆ ⤇ ⤈ ⤉ ⤊ ⤋ ⤌ ⤍ ⤎ ⤏
    ⤐ ⤑ ⤒ ⤓ ⤔ ⤕ ⤖ ⤗ ⤘ ⤙ ⤚ ⤛ ⤜ ⤝ ⤞ ⤟
    ⤠ ⤡ ⤢ ⤣ ⤤ ⤥ ⤦ ⤧ ⤨ ⤩ ⤪ ⤫ ⤬ ⤭ ⤮ ⤯
    ⤰ ⤱ ⤲ ⤳ ⤴ ⤵ ⤶ ⤷ ⤸ ⤹ ⤺ ⤻ ⤼ ⤽ ⤾ ⤿
    ⥀ ⥁ ⥂ ⥃ ⥄ ⥅ ⥆ ⥇ ⥈ ⥉ ⥊ ⥋ ⥌ ⥍ ⥎ ⥏
    ⥐ ⥑ ⥒ ⥓ ⥔ ⥕ ⥖ ⥗ ⥘ ⥙ ⥚ ⥛ ⥜ ⥝ ⥞ ⥟
    ⥠ ⥡ ⥢ ⥣ ⥤ ⥥ ⥦ ⥧ ⥨ ⥩ ⥪ ⥫ ⥬ ⥭ ⥮ ⥯
    ⥰ ⥱ ⥲ ⥳ ⥴ ⥵ ⥶ ⥷ ⥸ ⥹ ⥺ ⥻ ⥼ ⥽ ⥾ ⥿
  Arrows from other sets...
    ᛎ ᛏ ↩ ↪ ↫ ↬ ⏎   ≺ ≻
    ◄ ► ◅ ▻  ◂ ▸ ◃ ▹  ⊲ ⊳ ⊴ ⊵  ◀ ▶ ◁ ▷  ▲ ▼ △ ▽
  Diacritical Arrows...
     ⃐  ⃑  ⃔  ⃕  ⃖  ⃗  ⃡  ⃪      | Protect from end of line space removal
  See "Combining Characters" below for more info

---
Mathematical U+2200:
    ∀ ∁ ∂ ∃ ∄ ∅ ∆ ∇ ∈ ∉ ∊ ∋ ∌ ∍ ∎ ∏
    ∐ ∑ − ∓ ∔ ∕ ∖ ∗ ∘ ∙ √ ∛ ∜ ∝ ∞ ∟
    ∠ ∡ ∢ ∣ ∤ ∥ ∦ ∧ ∨ ∩ ∪ ∫ ∬ ∭ ∮ ∯
    ∰ ∱ ∲ ∳ ∴ ∵ ∶ ∷ ∸ ∹ ∺ ∻ ∼ ∽ ∾ ∿
    ≀ ≁ ≂ ≃ ≄ ≅ ≆ ≇ ≈ ≉ ≊ ≋ ≌ ≍ ≎ ≏
    ≐ ≑ ≒ ≓ ≔ ≕ ≖ ≗ ≘ ≙ ≚ ≛ ≜ ≝ ≞ ≟
    ≠ ≡ ≢ ≣ ≤ ≥ ≦ ≧ ≨ ≩ ≪ ≫ ≬ ≭ ≮ ≯
    ≰ ≱ ≲ ≳ ≴ ≵ ≶ ≷ ≸ ≹ ≺ ≻ ≼ ≽ ≾ ≿
    ⊀ ⊁ ⊂ ⊃ ⊄ ⊅ ⊆ ⊇ ⊈ ⊉ ⊊ ⊋ ⊌ ⊍ ⊎ ⊏
    ⊐ ⊑ ⊒ ⊓ ⊔ ⊕ ⊖ ⊗ ⊘ ⊙ ⊚ ⊛ ⊜ ⊝ ⊞ ⊟
    ⊠ ⊡ ⊢ ⊣ ⊤ ⊥ ⊦ ⊧ ⊨ ⊩ ⊪ ⊫ ⊬ ⊭ ⊮ ⊯
    ⊰ ⊱ ⊲ ⊳ ⊴ ⊵ ⊶ ⊷ ⊸ ⊹ ⊺ ⊻ ⊼ ⊽ ⊾ ⊿
    ⋀ ⋁ ⋂ ⋃ ⋄ ⋅ ⋆ ⋇ ⋈ ⋉ ⋊ ⋋ ⋌ ⋍ ⋎ ⋏
    ⋐ ⋑ ⋒ ⋓ ⋔ ⋕ ⋖ ⋗ ⋘ ⋙ ⋚ ⋛ ⋜ ⋝ ⋞ ⋟
    ⋠ ⋡ ⋢ ⋣ ⋤ ⋥ ⋦ ⋧ ⋨ ⋩ ⋪ ⋫ ⋬ ⋭ ⋮ ⋯
    ⋰ ⋱ ⋲ ⋳ ⋴ ⋵ ⋶ ⋷ ⋸ ⋹ ⋺ ⋻ ⋼ ⋽ ⋾ ⋿
Math Supplemental U+2A00
    ⨀ ⨁ ⨂ ⨃ ⨄ ⨅ ⨆ ⨇ ⨈ ⨉ ⨊ ⨋ ⨌ ⨍ ⨎ ⨏
    ⨐ ⨑ ⨒ ⨓ ⨔ ⨕ ⨖ ⨗ ⨘ ⨙ ⨚ ⨛ ⨜ ⨝

---
Technical U+2300:
    ⌀ ⌁ ⌂ ⌃ ⌄ ⌅ ⌆ ⌇ ⌈ ⌉ ⌊ ⌋ ⌌ ⌍ ⌎ ⌏
    ⌐ ⌑ ⌒ ⌓ ⌔ ⌕ ⌖ ⌗ ⌘ ⌙ ⌚ ⌛ ⌜ ⌝ ⌞ ⌟
    ⌠ ⌡ ⌢ ⌣ ⌤ ⌥ ⌦ ⌧ ⌨ 〈 〉 ⌫ ⌬ ⌭ ⌮ ⌯
    ⌰ ⌱ ⌲ ⌳ ⌴ ⌵ ⌶ ⌷ ⌸ ⌹ ⌺ ⌻ ⌼ ⌽ ⌾ ⌿
    ⍀ ⍁ ⍂ ⍃ ⍄ ⍅ ⍆ ⍇ ⍈ ⍉ ⍊ ⍋ ⍌ ⍍ ⍎ ⍏
    ⍐ ⍑ ⍒ ⍓ ⍔ ⍕ ⍖ ⍗ ⍘ ⍙ ⍚ ⍛ ⍜ ⍝ ⍞ ⍟
    ⍠ ⍡ ⍢ ⍣ ⍤ ⍥ ⍦ ⍧ ⍨ ⍩ ⍪ ⍫ ⍬ ⍭ ⍮ ⍯
    ⍰ ⍱ ⍲ ⍳ ⍴ ⍵ ⍶ ⍷ ⍸ ⍹ ⍺ ⍻ ⍼ ⍽ ⍾ ⍿
    ⎀ ⎁ ⎂ ⎃ ⎄ ⎅ ⎆ ⎇ ⎈ ⎉ ⎊ ⎋ ⎌ ⎍ ⎎ ⎏
    ⎐ ⎑ ⎒ ⎓ ⎔ ⎕ ⎖ ⎗ ⎘ ⎙ ⎚ ⎛ ⎜ ⎝ ⎞ ⎟
    ⎠ ⎡ ⎢ ⎣ ⎤ ⎥ ⎦ ⎧ ⎨ ⎩ ⎪ ⎫ ⎬ ⎭ ⎮ ⎯
    ⎰ ⎱ ⎲ ⎳ ⎴ ⎵ ⎶ ⎷ ⎸ ⎹ ⎺ ⎻ ⎼ ⎽ ⎾ ⎿
    ⏀ ⏁ ⏂ ⏃ ⏄ ⏅ ⏆ ⏇ ⏈ ⏉ ⏊ ⏋ ⏌ ⏍ ⏎ ⏏
    ⏐  ⏑  ⏒  ⏓  ⏔  ⏕  ⏖  ⏗  ⏘  ⏙  ⏚  ⏛  ⏜  ⏝  ⏞  ⏟
    ⏠  ⏡  ⏢  ⏣  ⏤  ⏥  ⏦  ⏧  ⏨  ⏩ ⏪ ⏫ ⏬ ⏭  ⏮  ⏯
    ⏰ ⏱  ⏲  ⏳ ⏴  ⏵  ⏶  ⏷  ⏸  ⏹  ⏺  ⏻  ⏼  ⏽  ⏾  ⏿

---
Miscellaneous U+2400:
    ␀ ␁ ␂ ␃ ␄ ␅ ␆ ␇ ␈ ␉ ␊ ␋ ␌ ␍ ␎ ␏
    ␐ ␑ ␒ ␓ ␔ ␕ ␖ ␗ ␘ ␙ ␚ ␛ ␜ ␝ ␞ ␟
    ␠ ␡ ␢ ␣ ␤ ␥ ␦

    ⑀ ⑁ ⑂ ⑃ ⑄ ⑅ ⑆ ⑇ ⑈ ⑉ ⑊

    ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ ⑫ ⑬ ⑭ ⑮ ⑯
    ⑰ ⑱ ⑲ ⑳ ⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾ ⑿
    ⒀ ⒁ ⒂ ⒃ ⒄ ⒅ ⒆ ⒇ ⒈ ⒉ ⒊ ⒋ ⒌ ⒍ ⒎ ⒏
    ⒐ ⒑ ⒒ ⒓ ⒔ ⒕ ⒖ ⒗ ⒘ ⒙ ⒚ ⒛ ⒜ ⒝ ⒞ ⒟
    ⒠ ⒡ ⒢ ⒣ ⒤ ⒥ ⒦ ⒧ ⒨ ⒩ ⒪ ⒫ ⒬ ⒭ ⒮ ⒯
    ⒰ ⒱ ⒲ ⒳ ⒴ ⒵ Ⓐ Ⓑ Ⓒ Ⓓ Ⓔ Ⓕ Ⓖ Ⓗ Ⓘ Ⓙ
    Ⓚ Ⓛ Ⓜ Ⓝ Ⓞ Ⓟ Ⓠ Ⓡ Ⓢ Ⓣ Ⓤ Ⓥ Ⓦ Ⓧ Ⓨ Ⓩ
    ⓐ ⓑ ⓒ ⓓ ⓔ ⓕ ⓖ ⓗ ⓘ ⓙ ⓚ ⓛ ⓜ ⓝ ⓞ ⓟ
    ⓠ ⓡ ⓢ ⓣ ⓤ ⓥ ⓦ ⓧ ⓨ ⓩ ⓪ ⓫ ⓬ ⓭ ⓮ ⓯
    ⓰ ⓱ ⓲ ⓳ ⓴ ⓵ ⓶ ⓷ ⓸ ⓹ ⓺ ⓻ ⓼ ⓽ ⓾ ⓿

---
Graphics U+2500:
    ─ ━ │ ┃ ┄ ┅ ┆ ┇ ┈ ┉ ┊ ┋ ┌ ┍ ┎ ┏
    ┐ ┑ ┒ ┓ └ ┕ ┖ ┗ ┘ ┙ ┚ ┛ ├ ┝ ┞ ┟
    ┠ ┡ ┢ ┣ ┤ ┥ ┦ ┧ ┨ ┩ ┪ ┫ ┬ ┭ ┮ ┯
    ┰ ┱ ┲ ┳ ┴ ┵ ┶ ┷ ┸ ┹ ┺ ┻ ┼ ┽ ┾ ┿
    ╀ ╁ ╂ ╃ ╄ ╅ ╆ ╇ ╈ ╉ ╊ ╋ ╌ ╍ ╎ ╏
    ═ ║ ╒ ╓ ╔ ╕ ╖ ╗ ╘ ╙ ╚ ╛ ╜ ╝ ╞ ╟
    ╠ ╡ ╢ ╣ ╤ ╥ ╦ ╧ ╨ ╩ ╪ ╫ ╬ ╭ ╮ ╯
    ╰ ╱ ╲ ╳ ╴ ╵ ╶ ╷ ╸ ╹ ╺ ╻ ╼ ╽ ╾ ╿
    ▀ ▁ ▂ ▃ ▄ ▅ ▆ ▇ █ ▉ ▊ ▋ ▌ ▍ ▎ ▏
    ▐ ░ ▒ ▓ ▔ ▕ ▖ ▗ ▘ ▙ ▚ ▛ ▜ ▝ ▞ ▟
    ■ □ ▢ ▣ ▤ ▥ ▦ ▧ ▨ ▩ ▪ ▫ ▬ ▭ ▮ ▯
    ▰ ▱ ▲ △ ▴ ▵ ▶ ▷ ▸ ▹ ► ▻ ▼ ▽ ▾ ▿
    ◀ ◁ ◂ ◃ ◄ ◅ ◆ ◇ ◈ ◉ ◊ ○ ◌ ◍ ◎ ●
    ◐ ◑ ◒ ◓ ◔ ◕ ◖ ◗ ◘ ◙ ◚ ◛ ◜ ◝ ◞ ◟
    ◠ ◡ ◢ ◣ ◤ ◥ ◦ ◧ ◨ ◩ ◪ ◫ ◬ ◭ ◮ ◯
    ◰ ◱ ◲ ◳ ◴ ◵ ◶ ◷ ◸ ◹ ◺ ◻ ◼ ◽ ◾ ◿

---
Miscellaneous Symbols U+2600:
    ☀ ☁ ☂ ☃ ☄ ★ ☆ ☇ ☈ ☉ ☊ ☋ ☌ ☍ ☎ ☏
    ☐ ☑ ☒ ☓ ☔ ☕ ☖ ☗ ☘ ☙ ☚ ☛ ☜ ☝ ☞ ☟
    ☠ ☡ ☢ ☣ ☤ ☥ ☦ ☧ ☨ ☩ ☪ ☫ ☬ ☭ ☮ ☯
    ☰ ☱ ☲ ☳ ☴ ☵ ☶ ☷ ☸ ☹ ☺ ☻ ☼ ☽ ☾ ☿
    ♀ ♁ ♂ ♃ ♄ ♅ ♆ ♇ ♈ ♉ ♊ ♋ ♌ ♍ ♎ ♏
    ♐ ♑ ♒ ♓ ♔ ♕ ♖ ♗ ♘ ♙ ♚ ♛ ♜ ♝ ♞ ♟
    ♠ ♡ ♢ ♣ ♤ ♥ ♦ ♧ ♨ ♩ ♪ ♫ ♬ ♭ ♮ ♯

---
Dingbats U+2700:
Many of the original are defined elsewhere:
    ✀ ✁ ✂ ✃ ✄ ✅ ✆ ✇ ✈ ✉ ✊ ✋ ✌ ✍ ✎ ✏
    ✐ ✑ ✒ ✓ ✔ ✕ ✖ ✗ ✘ ✙ ✚ ✛ ✜ ✝ ✞ ✟
    ✠ ✡ ✢ ✣ ✤ ✥ ✦ ✧ ✨ ✩ ✪ ✫ ✬ ✭ ✮ ✯
    ✰ ✱ ✲ ✳ ✴ ✵ ✶ ✷ ✸ ✹ ✺ ✻ ✼ ✽ ✾ ✿
    ❀ ❁ ❂ ❃ ❄ ❅ ❆ ❇ ❈ ❉ ❊ ❋   ❍   ❏
    ❐ ❑ ❒ ❓ ❔ ❕ ❖ ❗ ❘ ❙ ❚ ❛ ❜ ❝ ❞
      ❡ ❢ ❣ ❤ ❥ ❦ ❧ ❨ ❩ ❪ ❫ ❬ ❭ ❮ ❯
    ❰ ❱ ❲ ❳ ❴ ❵ ❶ ❷ ❸ ❹ ❺ ❻ ❼ ❽ ❾ ❿
    ➀ ➁ ➂ ➃ ➄ ➅ ➆ ➇ ➈ ➉ ➊ ➋ ➌ ➍ ➎ ➏
    ➐ ➑ ➒ ➓ ➔ ➕ ➖ ➗ ➘ ➙ ➚ ➛ ➜ ➝ ➞ ➟
    ➠ ➡ ➢ ➣ ➤ ➥ ➦ ➧ ➨ ➩ ➪ ➫ ➬ ➭ ➮ ➯
    ➰ ➱ ➲ ➳ ➴ ➵ ➶ ➷ ➸ ➹ ➺ ➻ ➼ ➽ ➾ ➿
    ⟀ ⟁ ⟂ ⟃ ⟄ ⟅ ⟆ ⟇ ⟈ ⟉ ⟊ ⟋ ⟌ ⟍ ⟎ ⟏
    ⟐ ⟑ ⟒ ⟓ ⟔ ⟕ ⟖ ⟗ ⟘ ⟙ ⟚ ⟛ ⟜ ⟝ ⟞ ⟟
    ⟠ ⟡ ⟢ ⟣ ⟤ ⟥ ⟦ ⟧ ⟨ ⟩ ⟪ ⟫ ⟬ ⟭ ⟮ ⟯
    ⟰ ⟱ ⟲ ⟳ ⟴ ⟵ ⟶ ⟷ ⟸ ⟹ ⟺ ⟻ ⟼ ⟽ ⟾ ⟿

---
Braille U+2800:
    ⠀ ⠁ ⠂ ⠃ ⠄ ⠅ ⠆ ⠇ ⠈ ⠉ ⠊ ⠋ ⠌ ⠍ ⠎ ⠏
    ⠐ ⠑ ⠒ ⠓ ⠔ ⠕ ⠖ ⠗ ⠘ ⠙ ⠚ ⠛ ⠜ ⠝ ⠞ ⠟
    ⠠ ⠡ ⠢ ⠣ ⠤ ⠥ ⠦ ⠧ ⠨ ⠩ ⠪ ⠫ ⠬ ⠭ ⠮ ⠯
    ⠰ ⠱ ⠲ ⠳ ⠴ ⠵ ⠶ ⠷ ⠸ ⠹ ⠺ ⠻ ⠼ ⠽ ⠾ ⠿
    ⡀ ⡁ ⡂ ⡃ ⡄ ⡅ ⡆ ⡇ ⡈ ⡉ ⡊ ⡋ ⡌ ⡍ ⡎ ⡏
    ⡐ ⡑ ⡒ ⡓ ⡔ ⡕ ⡖ ⡗ ⡘ ⡙ ⡚ ⡛ ⡜ ⡝ ⡞ ⡟
    ⡠ ⡡ ⡢ ⡣ ⡤ ⡥ ⡦ ⡧ ⡨ ⡩ ⡪ ⡫ ⡬ ⡭ ⡮ ⡯
    ⡰ ⡱ ⡲ ⡳ ⡴ ⡵ ⡶ ⡷ ⡸ ⡹ ⡺ ⡻ ⡼ ⡽ ⡾ ⡿
    ⢀ ⢁ ⢂ ⢃ ⢄ ⢅ ⢆ ⢇ ⢈ ⢉ ⢊ ⢋ ⢌ ⢍ ⢎ ⢏
    ⢐ ⢑ ⢒ ⢓ ⢔ ⢕ ⢖ ⢗ ⢘ ⢙ ⢚ ⢛ ⢜ ⢝ ⢞ ⢟
    ⢠ ⢡ ⢢ ⢣ ⢤ ⢥ ⢦ ⢧ ⢨ ⢩ ⢪ ⢫ ⢬ ⢭ ⢮ ⢯
    ⢰ ⢱ ⢲ ⢳ ⢴ ⢵ ⢶ ⢷ ⢸ ⢹ ⢺ ⢻ ⢼ ⢽ ⢾ ⢿
    ⣀ ⣁ ⣂ ⣃ ⣄ ⣅ ⣆ ⣇ ⣈ ⣉ ⣊ ⣋ ⣌ ⣍ ⣎ ⣏
    ⣐ ⣑ ⣒ ⣓ ⣔ ⣕ ⣖ ⣗ ⣘ ⣙ ⣚ ⣛ ⣜ ⣝ ⣞ ⣟
    ⣠ ⣡ ⣢ ⣣ ⣤ ⣥ ⣦ ⣧ ⣨ ⣩ ⣪ ⣫ ⣬ ⣭ ⣮ ⣯
    ⣰ ⣱ ⣲ ⣳ ⣴ ⣵ ⣶ ⣷ ⣸ ⣹ ⣺ ⣻ ⣼ ⣽ ⣾ ⣿

    Character Code (in hex) =
      U+2800 +  1    8
                2   10
                4   20
               40   80
    so the lower four dots is (in hex) =
       U+2800 + 40 + 80 + 4 + 20 => U+28E4 => ⣤

NOTE: Almost all Truetype fonts (except "Terminus") uses circles and dots,
rather than just dots as such the first 'Braille Space' glyph is not blank!
Monospace for example does this.

---
Full Width Characters: U+FF10
These are the same as per Chinese/Japanese glyphs,
typically used with these glyphs.
They are not defined in standard X window fonts (neither are asian glyphs)

   ０ １ ２ ３ ４ ５ ６ ７ ８ ９ Ａ Ｂ Ｃ Ｄ Ｅ Ｆ
   Ｇ Ｈ Ｉ Ｊ Ｋ Ｌ Ｍ Ｎ Ｏ Ｐ Ｑ Ｒ Ｓ Ｔ Ｕ Ｖ
   Ｗ Ｘ Ｙ Ｚ ａ ｂ ｃ ｄ ｅ ｆ ｇ ｈ ｉ ｊ ｋ ｌ
   ｍ ｎ ｏ ｐ ｑ ｒ ｓ ｔ ｕ ｖ ｗ ｘ ｙ ｚ ， ．
   ： ； ！ ？ ＂ ＇ ｀ ＾ ～ ￣ ＿ ＆ ＠ ＃ ％ ＋
   － ＊ ＝ ＜ ＞ （ ） ［ ］ ｛ ｝ ｟ ｠ ｜ ￤ ／
   ＼ ￢ ＄ ￡ ￠ ￦ ￥

---
Miscelanious X window defined glyphs..
These are often not defined the same in other fonts

                   
             

                   
                   
                   

    ﬀ ﬁ ﬂ ﬃ ﬄ ﬅ   ﬆ ﬓ ﬔ ﬕ ﬖ ﬗ יִ   ײַ
    ﬠ ﬡ ﬢ ﬣ ﬤ ﬥ ﬦ ﬧ ﬨ ﬩ שׁ שׂ שּׁ שּׂ אַ אָ
    אּ בּ גּ דּ הּ וּ זּ טּ יּ ךּ כּ לּ מּ
    נּ סּ ףּ פּ צּ קּ רּ שּ תּ וֹ בֿ כֿ פֿ ﭏ
    ﭖ ﭗ ﭘ ﭙ ﭪ ﭫ ﭬ ﭭ ﭺ ﭻ ﭼ ﭽ
    ﮆ ﮇ ﮎ ﮏ ﮐ ﮑ ﮒ ﮓ ﮔ ﮕ ﯼ ﯽ ﯾ ﯿ

    ﹰ  ﹲ  ﹴ    ﹶ ﹸ ﹺ  ﹼ ﹽ ﹾ
    ﺀ ﺁ ﺂ ﺃ ﺄ ﺅ ﺆ ﺇ ﺈ ﺉ ﺊ ﺋ ﺌ ﺍ ﺎ ﺏ
    ﺐ ﺑ ﺒ ﺓ ﺔ ﺕ ﺖ ﺗ ﺘ ﺙ ﺚ ﺛ ﺜ ﺝ ﺞ ﺟ
    ﺠ ﺡ ﺢ ﺣ ﺤ ﺥ ﺦ ﺧ ﺨ ﺩ ﺪ ﺫ ﺬ ﺭ ﺮ ﺯ
    ﺰ ﺱ ﺲ ﺳ ﺴ ﺵ ﺶ ﺷ ﺸ ﺹ ﺺ ﺻ ﺼ ﺽ ﺾ ﺿ
    ﻀ ﻁ ﻂ ﻃ ﻄ ﻅ ﻆ ﻇ ﻈ ﻉ ﻊ ﻋ ﻌ ﻍ ﻎ ﻏ
    ﻐ ﻑ ﻒ ﻓ ﻔ ﻕ ﻖ ﻗ ﻘ ﻙ ﻚ ﻛ ﻜ ﻝ ﻞ ﻟ
    ﻠ ﻡ ﻢ ﻣ ﻤ ﻥ ﻦ ﻧ ﻨ ﻩ ﻪ ﻫ ﻬ ﻭ ﻮ ﻯ
    ﻰ ﻱ ﻲ ﻳ ﻴ ﻵ ﻶ ﻷ ﻸ ﻹ ﻺ ﻻ ﻼ


Greek Alphabet
    Α  Β  Γ  Δ  Ε  Π  Τ
    α  β  γ  δ  ε  π  τ

Specials Block U+FFF0:

    ￹  \uFFF9  Annotation Anchor
    ￺  \uFFFA  Annotation Separator
    ￻  \uFFFB  Annotation Terminator
    ￼    \uFFFC  Replacement Object (placeholder for unspecified document)
    �    \uFFFD  Replacement character (the official not-defined character)
    �   \uFFFE, \uFFFF   not a character (generally something is wrong!)

  The most important character in this block is � \uFFFD
  And is rendered as a filled diamond with question mark.
  Used to indicate a problem within the Unicode stream,
  such as display a windows code page as Unicode.

===============================================================================
Combining Characters...

  Diacritical Marks, are characters that accent the previous character.
  Generally you have a main character then a combining character which overlays
  on the previous character.  Some characters are pre-combined to provide
  direct compatibility with the older ISO8859 fonts.

    A + Diaeresis (u0308):  Ä
    PreCombined   (u00C4):  Ä

  Combining Characters tend to fail in unexpected ways. With marks appearing
  over the next character (Chrome), or not centered over/below the previous
  character.  XTerms seem to work the best.

  Note that the Thai Script needs up to two combining characters
  over a single base character.

  Examples...

    STARGΛ̊TE SG-1, a = v̇ = r̈, a⃑ ⊥ b⃑                | Protect
                                               ̭    | from end of line
    .⃝ ⋅⃝ ∘⃝ •⃝ •⃟ •⃞ ▫⃞ X⃞ ╳⃞ ✔⃞ v⃤   •⃕   ∘͎ ∘̭̌ ∘̮̑ •̮̑ •̬̂ ◇̬̂ °⃘̊  ̌    | space removal


Diacritical Mark Blocks (formatted over a space)

  Combining Diacritical Marks U+0300 - U+036F

     ̃  ̄  ̅  ̂  ̌  ̑  ̆   ̐  ̀  ́  ̇  ̈  ͡  ̚  ̊    | Protect from end of line space removal
     ̴  ̵  ̶           ̷  ̸                | as these are all combined with a space!
       ̱  ̲  ̭  ̬  ̯  ̮   ͎  ͢        ͜        |

  Non-combining Diacritical Marks U+02B0 - U+02FF
    ˘ ˙ ˚ ˜ ˟ ˆ ˇ
  Punctuation Non-combining simular glyphs
    ‾ ⎽ ⁀ ‿  ⎵

  Combining Diacritical Marks for Symbols U+20D0 - U+20FF

     ⃐  ⃑  ⃒  ⃓  ⃔  ⃕  ⃖  ⃗  ⃘  ⃙  ⃚  ⃛  ⃜         | Protect from end of line space removal
     ⃝  ⃞  ⃟  ⃠  ⃡  ⃢  ⃣  ⃤  ⃥  ⃦  ⃧  ⃨  ⃩  ⃪       | Works in "vim" but in little else


Variation Selector...

  When fonts contain both Text and Emoji variants, some symbols are in both
  The symbols generally have a preference for what it should be displayed as.

  Example...  ↔   is a math symbol.
  But some web browsers will prefer to use the emoji variant! That means some
  mathematical formulas simply do not render as it was originally intended.

  "Variation Selector" is a invisible character. It indicates a rendering
  preference for the character before it.

  This is generally needed for web rendering, in terminals the indicator is not
  understood at this time and comes out as a unknown composing character.

    U+FE0E     indicator for text rendering     Example: ↔︎
    U+FE0F     indicator for emoji rendering    Example: ↔️

  See http://xahlee.info/comp/text_vs_emoji.html

-----------------------------------------------------
Language Examples...

APL:

  ((V⍳V)=⍳⍴V)/V←,V    ⌷←⍳→⍴∆∇⊃‾⍎⍕⌈

Linguistics and dictionaries:

  ði ıntəˈnæʃənəl fəˈnɛtık əsoʊsiˈeıʃn
  Y [ˈʏpsilɔn], Yen [jɛn], Yoga [ˈjoːgɑ]

Some Chinese (double width characters)
  测试用的汉字

Greek (in Polytonic):

  From a speech of Demosthenes in the 4th century BC:

  Οὐχὶ ταὐτὰ παρίσταταί μοι γιγνώσκειν, ὦ ἄνδρες ᾿Αθηναῖοι,
  ὅταν τ᾿ εἰς τὰ πράγματα ἀποβλέψω καὶ ὅταν πρὸς τοὺς
  λόγους οὓς ἀκούω· τοὺς μὲν γὰρ λόγους περὶ τοῦ
  τιμωρήσασθαι Φίλιππον ὁρῶ γιγνομένους, τὰ δὲ πράγματ᾿
  εἰς τοῦτο προήκοντα,  ὥσθ᾿ ὅπως μὴ πεισόμεθ᾿ αὐτοὶ
  πρότερον κακῶς σκέψασθαι δέον. οὐδέν οὖν ἄλλο μοι δοκοῦσιν
  οἱ τὰ τοιαῦτα λέγοντες ἢ τὴν ὑπόθεσιν, περὶ ἧς βουλεύεσθαι,
  οὐχὶ τὴν οὖσαν παριστάντες ὑμῖν ἁμαρτάνειν. ἐγὼ δέ, ὅτι μέν
  ποτ᾿ ἐξῆν τῇ πόλει καὶ τὰ αὑτῆς ἔχειν ἀσφαλῶς καὶ Φίλιππον
  τιμωρήσασθαι, καὶ μάλ᾿ ἀκριβῶς οἶδα· ἐπ᾿ ἐμοῦ γάρ, οὐ πάλαι
  γέγονεν ταῦτ᾿ ἀμφότερα· νῦν μέντοι πέπεισμαι τοῦθ᾿ ἱκανὸν
  προλαβεῖν ἡμῖν εἶναι τὴν πρώτην, ὅπως τοὺς συμμάχους
  σώσομεν. ἐὰν γὰρ τοῦτο βεβαίως ὑπάρξῃ, τότε καὶ περὶ τοῦ
  τίνα τιμωρήσεταί τις καὶ ὃν τρόπον ἐξέσται σκοπεῖν· πρὶν δὲ
  τὴν ἀρχὴν ὀρθῶς ὑποθέσθαι, μάταιον ἡγοῦμαι περὶ τῆς
  τελευτῆς ὁντινοῦν ποιεῖσθαι λόγον.

  Δημοσθένους, Γ´ ᾿Ολυνθιακὸς

Georgian:

  From a Unicode conference invitation:

  გთხოვთ ახლავე გაიაროთ რეგისტრაცია Unicode-ის მეათე საერთაშორისო
  კონფერენციაზე დასასწრებად, რომელიც გაიმართება 10-12 მარტს,
  ქ. მაინცში, გერმანიაში. კონფერენცია შეჰკრებს ერთად მსოფლიოს
  ექსპერტებს ისეთ დარგებში როგორიცაა ინტერნეტი და Unicode-ი,
  ინტერნაციონალიზაცია და ლოკალიზაცია, Unicode-ის გამოყენება
  ოპერაციულ სისტემებსა, და გამოყენებით პროგრამებში, შრიფტებში,
  ტექსტების დამუშავებასა და მრავალენოვან კომპიუტერულ სისტემებში.

Russian:

  From a Unicode conference invitation:

  Зарегистрируйтесь сейчас на Десятую Международную Конференцию по
  Unicode, которая состоится 10-12 марта 1997 года в Майнце в Германии.
  Конференция соберет широкий круг экспертов по  вопросам глобального
  Интернета и Unicode, локализации и интернационализации, воплощению и
  применению Unicode в различных операционных системах и программных
  приложениях, шрифтах, верстке и многоязычных компьютерных системах.

Thai (UCS Level 2):

  Excerpt from a poetry on The Romance of The Three Kingdoms
  (a Chinese classic 'San Gua'):

  [----------------------------|------------------------]
    ๏ แผ่นดินฮั่นเสื่อมโทรมแสนสังเวช  พระปกเกศกองบู๊กู้ขึ้นใหม่
  สิบสองกษัตริย์ก่อนหน้าแลถัดไป       สององค์ไซร้โง่เขลาเบาปัญญา
    ทรงนับถือขันทีเป็นที่พึ่ง           บ้านเมืองจึงวิปริตเป็นนักหนา
  โฮจิ๋นเรียกทัพทั่วหัวเมืองมา         หมายจะฆ่ามดชั่วตัวสำคัญ
    เหมือนขับไสไล่เสือจากเคหา      รับหมาป่าเข้ามาเลยอาสัญ
  ฝ่ายอ้องอุ้นยุแยกให้แตกกัน          ใช้สาวนั้นเป็นชนวนชื่นชวนใจ
    พลันลิฉุยกุยกีกลับก่อเหตุ          ช่างอาเพศจริงหนาฟ้าร้องไห้
  ต้องรบราฆ่าฟันจนบรรลัย           ฤๅหาใครค้ำชูกู้บรรลังก์ ฯ

  (The above is a two-column text. If combining characters are handled
  correctly, the lines of the second column should be aligned with the
  '|' character above.)

Ethiopian:

  Proverbs in the Amharic language:

  ሰማይ አይታረስ ንጉሥ አይከሰስ።
  ብላ ካለኝ እንደአባቴ በቆመጠኝ።
  ጌጥ ያለቤቱ ቁምጥና ነው።
  ደሀ በሕልሙ ቅቤ ባይጠጣ ንጣት በገደለው።
  የአፍ ወለምታ በቅቤ አይታሽም።
  አይጥ በበላ ዳዋ ተመታ።
  ሲተረጉሙ ይደረግሙ።
  ቀስ በቀስ፥ ዕንቁላል በእግሩ ይሄዳል።
  ድር ቢያብር አንበሳ ያስር።
  ሰው እንደቤቱ እንጅ እንደ ጉረቤቱ አይተዳደርም።
  እግዜር የከፈተውን ጉሮሮ ሳይዘጋው አይድርም።
  የጎረቤት ሌባ፥ ቢያዩት ይስቅ ባያዩት ያጠልቅ።
  ሥራ ከመፍታት ልጄን ላፋታት።
  ዓባይ ማደሪያ የለው፥ ግንድ ይዞ ይዞራል።
  የእስላም አገሩ መካ የአሞራ አገሩ ዋርካ።
  ተንጋሎ ቢተፉ ተመልሶ ባፉ።
  ወዳጅህ ማር ቢሆን ጨርስህ አትላሰው።
  እግርህን በፍራሽህ ልክ ዘርጋ።

Runes:

  ᚻᛖ ᚳᚹᚫᚦ ᚦᚫᛏ ᚻᛖ ᛒᚢᛞᛖ ᚩᚾ ᚦᚫᛗ ᛚᚪᚾᛞᛖ ᚾᚩᚱᚦᚹᛖᚪᚱᛞᚢᛗ ᚹᛁᚦ ᚦᚪ ᚹᛖᛥᚫ

  (Old English, which transcribed into Latin reads
  'He cwaeth that he bude thaem lande northweardum with tha Westsae.'
  or translated to modern english
  'He said that he lived in the northern land near the Western Sea.')

Braille:

  ⡌⠁⠧⠑ ⠼⠁⠒  ⡍⠜⠇⠑⠹⠰⠎ ⡣⠕⠌

  ⡍⠜⠇⠑⠹ ⠺⠁⠎ ⠙⠑⠁⠙⠒ ⠞⠕ ⠃⠑⠛⠔ ⠺⠊⠹⠲ ⡹⠻⠑ ⠊⠎ ⠝⠕ ⠙⠳⠃⠞
  ⠱⠁⠞⠑⠧⠻ ⠁⠃⠳⠞ ⠹⠁⠞⠲ ⡹⠑ ⠗⠑⠛⠊⠌⠻ ⠕⠋ ⠙⠊⠎ ⠃⠥⠗⠊⠁⠇ ⠺⠁⠎
  ⠎⠊⠛⠝⠫ ⠃⠹ ⠹⠑ ⠊⠇⠻⠛⠹⠍⠁⠝⠂ ⠹⠑ ⠊⠇⠻⠅⠂ ⠹⠑ ⠥⠝⠙⠻⠞⠁⠅⠻⠂
  ⠁⠝⠙ ⠹⠑ ⠡⠊⠑⠋ ⠍⠳⠗⠝⠻⠲ ⡎⠊⠗⠕⠕⠛⠑ ⠎⠊⠛⠝⠫ ⠊⠞⠲ ⡁⠝⠙
  ⡎⠊⠗⠕⠕⠛⠑⠰⠎ ⠝⠁⠍⠑ ⠺⠁⠎ ⠛⠕⠕⠙ ⠥⠏⠕⠝ ⠰⡡⠁⠝⠛⠑⠂ ⠋⠕⠗ ⠁⠝⠹⠹⠔⠛ ⠙⠑
  ⠡⠕⠎⠑ ⠞⠕ ⠏⠥⠞ ⠙⠊⠎ ⠙⠁⠝⠙ ⠞⠕⠲

  (The first couple of paragraphs of "A Christmas Carol" by Dickens)

Greetings in various languages:

  Hello world, Καλημέρα κόσμε, コンニチハ

===============================================================================
Simple Unicode Line Art...
http://xahlee.info/comp/unicode_smilies.html

  These often make big use of Diacritical Marks and as such often fail
  in spectacular ways.

    (°͡ʖ͜°͡)          "Lenny Face"
    ( ͡° ͜ʖ ͡°)       For GTK fonts and web browsers (proportional fonts)

    ( ͡~ ͜ʖ ͡°)       Lenny Wink

    (⟃ ͜ʖ ⟄)        Goggly Eyes

   ¯\_(ツ)_/¯      The double-wide face fails in XTerms

   ӽd̲̅a̲̅r̲̅w̲̅i̲̅ɳ̲̅ᕗ    ӽe̲̅v̲̅o̲̅l̲̅u̲̅t̲̅i̲̅o̲̅ɳ̲̅ᕗ      Darwin evolution fish

   ┌∩┐(◣_◢)┌∩┐     Monster

   (´סּ︵סּ`)        Sad

    (¬_¬)          Meh

    ლ(ಠ益ಠ)ლ       Angry

     •͡˘㇁•͡˘        Face  (not in xterm, gedit, or chrome)

    (◔/‿\◔)        Up Face

                  Circle of Hats  (chrome works, not in xterm) - lost

   __̴ı̴̴̡̡̡ ̡͌l̡̡̡ ̡͌l̡*̡̡ ̴̡ı̴̴̡ ̡̡͡|̲̲̲͡͡͡ ̲▫̲͡ ̲̲̲͡͡π̲̲͡͡ ̲̲͡▫̲̲͡͡ ̲|̡̡̡  ı̴̡̡ ̡͌l̡̡̡̡.___
                  Landscape  (XTerms only, not Gedit or chrome)

   »-(¯`.´¯)->     Arrow in Heart

   [{-_-}] ZZZzz zz z...    Sleep

    龴ↀ◡ↀ龴        Cat

     ʕ•ᴥ•ʔ         Bear

     ᶘ ᵒᴥᵒᶅ  ᶘᵒᴥᵒᶅ  pedobear (look right, left)

     (♥_♥)         Love Eyes

    ⊂(✰‿✰)つ       Star Eyes

    \(סּںסּَ` )/ۜ      Yea!

     (Ͼ˳Ͽ)         big eyes

   ∙،°. ˘Ô≈ôﺣ      Racing Car

    ℓ٥ﻻ ﻉ√٥υ       Love You Script

    [̲̅$̲̅(̲̅ιοο̲̅)̲̅$̲̅]      Money  (xterm only)

    ~(‾▿‾)~        Bird

     -`ღ´-         Sparklingly heart

    ︻╦̵̵͇̿̿̿̿══╤─        Rifle

   ┌ಠ_ಠ)┌∩┐ ᶠᶸᶜᵏ♥ᵧₒᵤ   Fuck You  (chrome, not Xterms)

   .❉。°❆·。*.❃· °。·❆    snowflake line

-------------------------------------------------------------------------------
More complex Unicode Art (small collection)
http://xahlee.info/comp/unicode_ascii_art.html

                                   •
   ▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀         ╱⸫╲           ․․․․․․┃․․․․․․․☽․
   ▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄        ╱⸫⸪⸫╲          ․․․․․╱▔╲․․☆․․․․․
   ▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀       ╱⸫⸪⸫⸪⸫╲         ․․․╱▔▔▔▔▔╲․․․․․․
   ▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄      ╱⸫⸪⸫⸪⸫⸪⸫╲        ․․․╲▂▂▂▂▂╱․․․․╱╲
   ▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀     ╱⸫⸪⸫⸪⸫⸪⸫⸪⸫╲       ․․․․․․․․․․․╱╲╱┊┊
   ▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄    ╱⸫⸪⸫⸪⸫⸪⸫⸪⸫⸪⸫╲      ․╱╲․․․․․․․╱┊┊╲┊┊
                            •─────────────•


   ▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂       ․․․․․▂▂▂▂▂▂▂▂․․․      ․․․․◢▇▇▇▇▇◣․․․․․
   ╲▂▂▂▂╱╲▂▂▂▂╱╲▂▂▂       ․․․╱╲╲▂▂▂▂▂․▕․․․      ․․․․▉◤◤◤◤◤▊▍․․․․
   ▔╲▂▂▂╱▔╲▂▂▂╱▔╲▂▂       ․․╱․․╲․․․․․▏▕․․․      ․․▕▔▉┏▅╮╭▅┓▍▏․․․
   ▔▔╲▂▂╱▔▔╲▂▂╱▔▔╲▂       ․․▔▏▕▔․․․․▂▏▕▂․․      ․․․╲◥╲▔▕▕▔▕╱․․․․
   ▔▔▔╲▂╱▔▔▔╲▂╱▔▔▔╲       ․․․▏▕․․․․․╲․․╱․․      ․․․․․▍▔╱▔╲▕․․․․․
   ▔▔▔▔╲╱▔▔▔▔╲╱▔▔▔▔       ․․․▏․▔▔▔▔▔╲╲╱․․․      ․․․․▇◣╲▔▔▕◢▍․․․․
   ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔       ․․․▔▔▔▔▔▔▔▔․․․․․


   ║█║█║║█║█║█║║█║█║║█║█║█║
   ║█║█║║█║█║█║║█║█║║█║█║█║
   ║║║║║║║║║║║║║║║║║║║║║║║║
   ╚╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╝

-------------------------------------------------------------------------------
UNICODE;

string text8_cp1 = @UNICODE
\U0001f600
UNICODE;

string* text8_cp2 = @@UNICODE
\uD83D
UNICODE;

string text8_str = @UNICODE
😀​😁​😂​😃​😄​😅​😆​😇​😈​😉​😊​😋​😌​😍​😎​😏​😐​😑​😒​😓​😔​😕​😖​😗​😘​😙​😚​😛​😜​😝​😞​😟​😠​😡
​😢​😣​😤​😥​😦​😧​😨​😩​😪​😫​😬​😭​😮​😯​😰​😱​😲​😳​😴​😵​😶​😷​😸​😹​😺​😻​😼​😽​😾​😿​🙀​🙁​🙂​🙃
​🙄​🙅​🙆​🙇​🙈​🙉​🙊​🙋​🙌​🙍​🙎​🙏
UNICODE;

void do_tests() {
  string tmp;

  // string block don't process \U and \u
  ASSERT_EQ("\\U", text8_cp1[0..1]);
  // string block don't process \U and \u
  ASSERT_EQ("\\u", text8_cp2[0][0..1]);

  // strlen
  ASSERT_EQ(74, strlen(text1));
  ASSERT_EQ(92, strlen(text2));
  ASSERT_EQ(76, strlen(text3));
  ASSERT_EQ(31, strlen(text4));
  ASSERT_EQ(17, sizeof(text5));
  ASSERT_EQ(4801, sizeof(text6));
  ASSERT_EQ(strlen(text6), sizeof(text6));
  ASSERT_EQ(688, sizeof(text7));
  ASSERT_EQ(162, sizeof(text8_str));

  // Multi codepoint emoji
  tmp = "👩‍👩‍👧‍👧";
  ASSERT_EQ(1, strlen(tmp));

  // INDEX doesn't work with multi-codepoint character.
  ASSERT(catch(tmp[0] = 'a'));

  // INDEX
  ASSERT_EQ(22909, "好"[0]);
  ASSERT_EQ("⋅"[0], text1[3]);
  ASSERT_EQ("Q"[0], text1[9]);
  ASSERT_EQ("ð"[0], text3[0]);

  // RINDEX
  ASSERT_EQ("⍕"[0], text4[<2]);
  ASSERT_EQ("ɛ"[0], text3[<19]);

  // INDEX_LVALUE INC
  tmp = "白日依山尽";
  ASSERT_EQ(30333, tmp[0]);
  ASSERT_EQ(26085, tmp[1]);
  ASSERT_EQ(20381, tmp[2]);
  ASSERT_EQ(23665, tmp[3]);
  ASSERT_EQ(23613, tmp[4]);
  tmp[2]++;
  ++tmp[2];
  ASSERT_EQ(30333, tmp[0]);
  ASSERT_EQ(26085, tmp[1]);
  ASSERT_EQ(20383, tmp[2]);
  ASSERT_EQ(23665, tmp[3]);
  ASSERT_EQ(23613, tmp[4]);
  ASSERT_EQ("白日侟山尽", tmp);
  tmp[2]--;
  --tmp[2];
  ASSERT_EQ("白日依山尽", tmp);

  // INDEX_LVALUE ASSIGN
  tmp = text3;
  ASSERT_EQ(text3, tmp);
  ASSERT_EQ(230, tmp[9]);
  ASSERT_EQ(601, tmp[11]);
  tmp[10] = 30333;
  ASSERT_NE(text3, tmp);
  ASSERT_EQ(230, tmp[9]);
  ASSERT_EQ(30333, tmp[10]);
  ASSERT_EQ(601, tmp[11]);

  // FOREACH
  {
    int count = 0;

    tmp = "欲穷千里目🍆🍠🧮😊👌💩更上一层楼";
    foreach(int x in tmp) {
      count ++;
    }

    ASSERT_EQ(strlen(tmp), count);
  }

  // FOREACH REF
  {
    int count = 0;

    tmp = "欲穷千里目🍆🍠🧮😊👌💩更上一层楼";
    foreach(int ref x in tmp) {
      x++;
      count ++;
    }

    ASSERT_EQ(strlen(tmp), count);
  }

  // range operator, based on codepoint
  ASSERT_EQ("入", "黄河入海流"[2..2]);
  ASSERT_EQ("", "黄河入海流"[5..3]);
  ASSERT_EQ("黄河入海流", "黄河入海流"[0..4]);
  ASSERT_EQ("🧮😊", "🍆🍠🧮😊👌💩"[2..3]);
  ASSERT_EQ("👌💩", "🍆🍠🧮😊👌💩"[<2..<1]);

  // overflow range
  ASSERT_EQ("黄河入海流", "黄河入海流"[0..5]);
  ASSERT_EQ("黄河入海流", "黄河入海流"[0..999]);
  ASSERT_EQ("黄河入海流", "黄河入海流"[<999..999]);

  // range operator for arrays
  ASSERT_EQ(text5[7..8], text5[<10..8]);

  // range operator for long texts
  ASSERT_EQ(strlen(text6) - 110 - 220 + 1, strlen(text6[110..<220]));

  // range lvalue
  tmp = "欲穷千里目，更上一层楼";
  tmp[5..5] = "💩";
  ASSERT_EQ("欲穷千里目💩更上一层楼", tmp);
  tmp[0..<1] = "🍆🍠🧮😊👌💩";
  ASSERT_EQ("🍆🍠🧮😊👌💩", tmp);
  tmp[<5..<2] = "欲穷千里目";
  ASSERT_EQ("🍆欲穷千里目💩", tmp);

  ASSERT_EQ("\uD83C\uDF46欲穷千里目\uD83D\uDCA9", tmp);

  ASSERT_EQ("👿", "\U0001F47F");

  // upper_case

  // lower_case

  // printf/sprintf
  tmp = "欲穷千里目🍆🍠🧮😊👌💩更上一层楼";
  ASSERT_EQ(tmp, sprintf("%s", tmp));
  ASSERT_EQ("\"" + tmp + "\"", sprintf("%O", tmp));

  // truncation
  ASSERT_EQ("欲穷千里目", sprintf("%.10s", tmp));
  ASSERT_EQ("欲穷千里目", sprintf("%.11s", tmp));
  ASSERT_EQ("欲穷千里", sprintf("%.9s", tmp));
  ASSERT_EQ("欲穷千里目🍆", sprintf("%.12s", tmp));
  ASSERT_EQ(tmp, sprintf("%.99s", tmp));

  ASSERT_EQ("欲穷千里目", sprintf("%1.10s", tmp));

  // https://github.com/fluffos/fluffos/issues/590
  ASSERT_EQ("测试ab", sprintf("%.6s","测试abcd 啊看 is abc sentence 好 不好\n"));

  // left, center, and right adjustment,
  // and count CJK chars and emojis as 2 width,  40 - 16 * 2 = 8
  ASSERT_EQ(repeat_string(" ", 4) + tmp + repeat_string(" ", 4), sprintf("%40|s", tmp));
  ASSERT_EQ(repeat_string(" ", 8) + tmp, sprintf("%40s", tmp));
  ASSERT_EQ(tmp + repeat_string(" ", 8), sprintf("%-40s", tmp));

  // adjustment works with grapheme cluster, not codepoints
  tmp = "欲穷a千里v目👩‍👩‍👧‍👧更上一层楼c";
  // correct with is 10 * 2 (cjk) + 2 (emoji) + 3 (ascii) = 25, field size = 40, 40 - 25 = 15
  ASSERT_EQ(repeat_string(" ", 8) + tmp + repeat_string(" ", 7), sprintf("%40|s", tmp));
  ASSERT_EQ(repeat_string(" ", 15) + tmp, sprintf("%40s", tmp));
  ASSERT_EQ(tmp + repeat_string(" ", 15), sprintf("%-40s", tmp));

  // column mode
  tmp = "欲穷千里目";
  ASSERT_EQ("欲\n穷\n千\n里\n目", sprintf("%-=1s", tmp));
  ASSERT_EQ("欲\n穷\n千\n里\n目", sprintf("%-=2s", tmp));
  ASSERT_EQ("欲\n穷\n千\n里\n目", sprintf("%-=3s", tmp));
  ASSERT_EQ("欲穷\n千里\n目", sprintf("%-=4s", tmp));

  tmp = "欲a穷aa千aaa里aaaa目";
  ASSERT_EQ("欲\na\n穷\naa\n千\naaa\n里\naaaa\n目", sprintf("%-=2s", tmp));
  ASSERT_EQ("欲a穷\naa千\naaa里\naaaa\n目", sprintf("%-=5s", tmp));

  // column mode with breakpoints
  tmp = "欲 穷 千 里 目";
  ASSERT_EQ("欲\n穷\n千\n里\n目", sprintf("%-=2s", tmp));

  tmp = "欲穷千里目 🍆🍠🧮\n😊👌💩\n更上一层楼欲穷千里目🍆🍠🧮😊👌💩更上一层楼";
  ASSERT_EQ("欲穷千里目\n🍆🍠🧮\n😊👌💩\n更上一层楼欲\n穷千里目🍆🍠\n🧮😊👌💩更上\n一层楼", sprintf("%-=12s", tmp));

  // column mode with truncation
  // https://github.com/fluffos/fluffos/issues/597
  tmp = "欲穷千里目";
  ASSERT_EQ("欲穷\n千里\n  目", sprintf("%1.4=s", tmp));

  // https://github.com/fluffos/fluffos/issues/590
  ASSERT_EQ("测试看\n啊看\nis abc\ns\nsentence\n好不好", sprintf("%=-6s", "测试看 啊看 is abc s sentence 好不好"));

  // table mode
  tmp = "一\n二\n三\n四\n五\n六\n七\n八\n九\n十\n甲\n乙\n丙\n丁\n戊";

  // perfect case
  ASSERT_EQ("一四七十丙\n"
            "二五八甲丁\n"
            "三六九乙戊",
            sprintf("%#10.5s", tmp));

  ASSERT_EQ("一六甲\n"
            "二七乙\n"
            "三八丙\n"
            "四九丁\n"
            "五十戊",
            sprintf("%#6.3s", tmp));

  // less perfect cases: not enough items
  ASSERT_EQ("一五九丙\n"
            "二六十丁\n"
            "三七甲戊\n"
            "四八乙",
            sprintf("%#8.4s", tmp));
  ASSERT_EQ(sprintf("%#8.4s", tmp), sprintf("%#10.4s", tmp));

  ASSERT_EQ("一四七十丙  \n"
            "二五八甲丁\n"
            "三六九乙戊",
            sprintf("%#12.6s", tmp));

  ASSERT_EQ("一四七十丙    \n"
            "二五八甲丁\n"
            "三六九乙戊",
            sprintf("%#14.7s", tmp));

  ASSERT_EQ("一三五七九甲丙戊\n"
            "二四六八十乙丁",
            sprintf("%#16.8s", tmp));

  ASSERT_EQ("一三五七九甲丙戊  \n"
            "二四六八十乙丁",
            sprintf("%#18.9s", tmp));

  ASSERT_EQ("一三五七九甲丙戊    \n"
            "二四六八十乙丁",
            sprintf("%#20.10s", tmp));

  ASSERT_EQ("一三五七九甲丙戊      \n"
            "二四六八十乙丁",
            sprintf("%#22.11s", tmp));

  ASSERT_EQ("一二三四五六七八九十甲乙丙丁戊",
            sprintf("%#30.15s", tmp));

  ASSERT_EQ("一二三四五六七八九十甲乙丙丁戊",
            sprintf("%#32.16s", tmp));

  ASSERT_EQ("一九\n"
            "二十\n"
            "三甲\n"
            "四乙\n"
            "五丙\n"
            "六丁\n"
            "七戊\n"
            "八",
            sprintf("%#4.2s", tmp));

  // adjustment
  ASSERT_EQ("  一  四  七  十  丙\n"
            "  二  五  八  甲  丁\n"
            "  三  六  九  乙  戊",
            sprintf("%#20.5s", tmp));

  ASSERT_EQ(" 一 四 七 十 丙\n"
            " 二 五 八 甲 丁\n"
            " 三 六 九 乙 戊",
            sprintf("%#19.5s", tmp));

  ASSERT_EQ("  一  四  七  十  丙\n"
            "  二  五  八  甲  丁\n"
            "  三  六  九  乙  戊",
            sprintf("%#21.5s", tmp));

  // truncation
  tmp = "一一\n二二\n三三\n四四\n五五\n六六\n七七\n八八\n九九\n十十\n甲甲\n乙乙\n丙丙\n丁丁\n戊戊";
  ASSERT_EQ("一一四四七七十十丙丙\n"
            "二二五五八八甲甲丁丁\n"
            "三三六六九九乙乙戊戊",
            sprintf("%#20.5s", tmp));

  ASSERT_EQ(" 一 四 七 十 丙\n"
            " 二 五 八 甲 丁\n"
            " 三 六 九 乙 戊",
            sprintf("%#19.5s", tmp));
  for(int i = 18; i > 14; i--) {
    ASSERT_EQ(sprintf("%#19.5s", tmp), sprintf("%#*.5s", i, tmp));
  }

  ASSERT_EQ("一四七十丙\n"
            "二五八甲丁\n"
            "三六九乙戊",
            sprintf("%#10.5s", tmp));
  for(int i = 14; i > 0; i--) {
    ASSERT_EQ(sprintf("%#10.5s", tmp), sprintf("%#*.5s", i, tmp));
  }

  ASSERT_EQ("我 看 \n"
            "测 效 ", sprintf("%#-10.3s","我说就是\n测试\n看看\n效果如何"));

  // auto columns
  // max_width = 8, fs= 8: col = 1
  ASSERT_EQ("我说就是\n"
            "    测试\n"
            "    看看\n"
            "效果如何", sprintf("%#8s","我说就是\n测试\n看看\n效果如何"));

  // col = 1
  ASSERT_EQ(" 我说就是\n"
            "     测试\n"
            "     看看\n"
            " 效果如何", sprintf("%#9s","我说就是\n测试\n看看\n效果如何"));

  // col = 1, with truncation
  ASSERT_EQ(" 我说就\n"
            "   测试\n"
            "   看看\n"
            " 效果如", sprintf("%#7s","我说就是\n测试\n看看\n效果如何"));

  // col = 2
  ASSERT_EQ("  我说就是      看看\n"
            "      测试  效果如何", sprintf("%#20s","我说就是\n测试\n看看\n效果如何"));

  // col = 3 will leave 1 item on next line, so back to col = 2
  ASSERT_EQ("       我说就是           看看\n"
            "           测试       效果如何", sprintf("%#30s","我说就是\n测试\n看看\n效果如何"));

  // col = 4
  ASSERT_EQ("  我说就是      测试      看看  效果如何", sprintf("%#40s","我说就是\n测试\n看看\n效果如何"));

  // padding with utf8 chars!
  tmp = "测试";
  ASSERT_EQ("田田田田测试田田田田", sprintf("%'田'|20s", tmp));
  ASSERT_EQ("测试田田田田田田田田", sprintf("%'田'-20s", tmp));
  ASSERT_EQ("田田田田田田田田测试", sprintf("%'田'20s", tmp));

  // less perfect cases
  ASSERT_EQ(" 田田田田测试田田田田", sprintf("%'田'|21s", tmp));
  ASSERT_EQ("测试田田田田田田田田 ", sprintf("%'田'-21s", tmp));
  ASSERT_EQ(" 田田田田田田田田测试", sprintf("%'田'21s", tmp));

  ASSERT_EQ("田田田田测试田田田 ", sprintf("%'田'|19s", tmp));
  ASSERT_EQ("测试田田田田田田田 ", sprintf("%'田'-19s", tmp));
  ASSERT_EQ(" 田田田田田田田测试", sprintf("%'田'19s", tmp));

  ASSERT_EQ(" 田田田田测试田田田田 ", sprintf("%'田'|22s", tmp));
  ASSERT_EQ("测试田田田田田田田田田", sprintf("%'田'-22s", tmp));
  ASSERT_EQ("田田田田田田田田田测试", sprintf("%'田'22s", tmp));

  // complex pad string with truncations
  ASSERT_EQ("aa田baa田测试aa田baa田", sprintf("%'aa田b'|22s", tmp));
  ASSERT_EQ("测试aa田baa田baa田baa ", sprintf("%'aa田b'-22s", tmp));
  ASSERT_EQ(" aa田baa田baa田baa测试", sprintf("%'aa田b'22s", tmp));

  // special char in pad string
  ASSERT_EQ("a\\b田c'a\\b测试a\\b田c'a\\b", sprintf("%'a\\\\b田c\\''|20s", tmp));
  ASSERT_EQ("测试a\\b田c'a\\b田c'a\\b田c'a", sprintf("%'a\\\\b田c\\''-20s", tmp));
  ASSERT_EQ("a\\b田c'a\\b田c'a\\b田c'a测试", sprintf("%'a\\\\b田c\\''20s", tmp));

  tmp = "一\n二\n三\n四\n五\n六\n七\n八\n九\n十\n甲\n乙\n丙\n丁\n戊";
  ASSERT_EQ("田一田四田七田十田丙\n"
            "田二田五田八田甲田丁\n"
            "田三田六田九田乙田戊",
            sprintf("%#'田'20.5s", tmp));
  ASSERT_EQ("田一田四田七田十田丙 \n"
            "田二田五田八田甲田丁 \n"
            "田三田六田九田乙田戊 ",
            sprintf("%#'田'21.5s", tmp));

  // char
  ASSERT_EQ(tmp[0..0], sprintf("%c", tmp[0]));

  // repeat_string
  ASSERT_EQ(text4 + repeat_string(text4, 2), repeat_string(text4, 3));

  // strsrch
  tmp = "一欲穷千里目🍆🍠🧮👩‍👩‍👧‍👧😊👌💩更上一层楼";
  // string searching
  ASSERT_EQ("一", tmp[0..0]);
  ASSERT_EQ(0, strsrch(tmp, tmp[0..0]));
  ASSERT_EQ(15, strsrch(tmp, "一", 1));
  ASSERT_EQ(13, strsrch(tmp, "更"));
  ASSERT_EQ(13, strsrch(tmp, "更", 1));
  ASSERT_EQ(6, strsrch(tmp, "🍆🍠🧮"));
  ASSERT_EQ(6, strsrch(tmp, "🍆🍠🧮", 1));
  // EGC character based searching, not codepoint
  ASSERT_EQ(9, strsrch(tmp, "👩‍👩‍👧‍👧"));
  ASSERT_EQ(9, strsrch(tmp, "👩‍👩‍👧‍👧", 1));
  ASSERT_EQ(-1, strsrch(tmp, "👩‍👧"));
  ASSERT_EQ(-1, strsrch(tmp, "👩‍👧", 1));
  ASSERT_EQ(-1, strsrch(tmp, "🧮👩"));
  ASSERT_EQ(-1, strsrch(tmp, "🧮👩", 1));
  ASSERT_EQ(-1, strsrch(tmp, "‍👧😊‍"));
  ASSERT_EQ(-1, strsrch(tmp, "‍👧😊", 1));
  // codepoint based searching works for single codepoint characters
  ASSERT_EQ(0, strsrch(tmp, tmp[0]));
  ASSERT_EQ(15, strsrch(tmp, tmp[0], 1));
  ASSERT_EQ(-1, strsrch(tmp, 65533));
  ASSERT_EQ(-1, strsrch(tmp, 65533, 1));
  // but not for multi and invalid codepoints.
  ASSERT(catch(strsrch(tmp, 999999999999)));
  ASSERT(catch(strsrch(tmp, 999999999999, 1)));

  ASSERT_EQ(({"一", "二", "三"}), explode("一二三", ""));
  ASSERT_EQ(({"一", "a", "二", "b", "三", "c"}), explode("一a二b三c", ""));
  ASSERT_EQ(({"一", "二", "三", "四"}), explode("一👩‍👩‍👧‍👧二👩‍👩‍👧‍👧三👩‍👩‍👧‍👧四", "👩‍👩‍👧‍👧"));
  // explode also only works on EGCs, not codepoints
  ASSERT_EQ(({"一👩‍👩‍👧‍👧二👩‍👩‍👧‍👧三👩‍👩‍👧‍👧四"}), explode("一👩‍👩‍👧‍👧二👩‍👩‍👧‍👧三👩‍👩‍👧‍👧四", "‍"));

  tmp = "甲甲甲一甲甲二甲甲三甲甲四甲甲甲";
#ifndef __REVERSIBLE_EXPLODE_STRING__
#ifdef __SANE_EXPLODE_STRING__
  ASSERT_EQ(({"", "", "一", "", "二", "", "三", "", "四", "", ""}), explode(tmp, "甲"));
#else
  ASSERT_EQ(({"一", "二", "三", "四"}), explode(tmp, "甲"));
#endif
#else
  ASSERT_EQ(({"", "", "", "一", "", "二", "", "三", "", "四", "", "", ""}), explode(tmp, "甲"));
#endif
  ASSERT_EQ(({"", "", "", "一", "", "二", "", "三", "", "四", "", "", ""}), explode_reversible(tmp, "甲"));
  ASSERT_EQ(tmp, implode(explode_reversible(tmp, "甲"), "甲"));

  ASSERT_NE("一二三四", implode(explode_reversible(tmp, "甲"), "‍"));
}
