Thread: Detecting "letter-like" UTF-8 code points

  1. #16
    Registered User Sir Galahad's Avatar
    Join Date
    Nov 2016
    Location
    The Round Table
    Posts
    277
    I may have been overthinking things just a bit. The most important thing seems to be the checking for all potential continuation sequences and such. I put together a simple verification program which basically just checks for reversibility.

    Code:
    #include <locale.h>
    #include <stdbool.h>
    #include <stdint.h>
    #include <stdlib.h>
    #include <string.h>
    
    bool process_utf(const char* utf,
                     size_t count,
                     void(process)(uint32_t code, void* userdata),
                     void* userdata) {
      typedef unsigned char octet;
      octet* next = (octet*)utf;
      octet* end = next + count;
      /* Check for BOM */
      if ((count >= 3) && (next[0] == 0xef) && (next[1] == 0xbb) &&
          (next[2] == 0xbf))
        next += 3;
      while (next < end) {
        uint32_t code;
        octet first = *next++;
        /* ASCII */
        if (first < 0x80)
          code = first;
    #define continuation(byte) (byte < 0xc0)
        /* Misplaced continuation byte */
        else if (continuation(first))
          return false;
        /* The following bytes MUST be continuations */
        else if (first < 0xe0) {
          if ((next + 1) > end || !continuation(next[0]))
            return false;
          code = first | (next[0] << 8);
          next += 1;
        } else if (first < 0xf0) {
          if ((next + 2) > end || !continuation(next[0]) || !continuation(next[1]))
            return false;
          code = first | (next[0] << 8) | (next[1] << 16);
          next += 2;
        } else if (first < 0xf8) {
          if ((next + 3) > end || !continuation(next[0]) ||
              !continuation(next[1]) || !continuation(next[2]))
            return false;
          code = first | (next[0] << 8) | (next[1] << 16) | (next[2] << 24);
          next += 3;
        } else
          return false;
        process(code, userdata);
      }
      return true;
    }
    
    void process_codepoints(const uint32_t* codepoints,
                            size_t count,
                            void(process)(unsigned char byte, void* userdata),
                            void* userdata) {
      uint32_t* next = (uint32_t*)codepoints;
      uint32_t* end = next + count;
      while (next < end) {
        uint32_t code = *next++;
        do {
          /* Send off a byte */
          process(code & 0xff, userdata);
          /* Shift in the next byte */
          code >>= 8;
        } while (code != 0);
      }
    }
    
    /*
     Test program
    */
    
    #include <stdio.h>
    #include <string.h>
    
    typedef struct {
      uint32_t* data;
      size_t length;
    } codepoints;
    
    void reverse(codepoints* points) {
      uint32_t* left = points->data;
      uint32_t* right = left + points->length;
      while (left < right--) {
        uint32_t temp = *left;
        *left++ = *right;
        *right = temp;
      }
    }
    
    void store_codepoint(uint32_t code, void* userdata) {
      codepoints* points = (codepoints*)userdata;
      points->data[points->length++] = code;
    }
    
    typedef struct {
      char* data;
      size_t length;
    } utf_data;
    
    void store_byte(unsigned char byte, void* userdata) {
      utf_data* text = (utf_data*)userdata;
      text->data[text->length++] = byte;
    }
    
    typedef enum { success = EXIT_SUCCESS, failure, confused } state;
    
    state status = success;
    
    void display(const char* line) {
      printf("\n %s\n\n", line);
    }
    
    void test(const char* utf, size_t length) {
      display("Text:");
      for (size_t index = 0; index < length; ++index)
        putchar(utf[index]);
      display("");
    
      codepoints points = {0};
      points.data = (uint32_t*)malloc(length * sizeof(uint32_t));
      if (!process_utf(utf, length, store_codepoint, &points)) {
        puts("Error: invalid UTF-8");
        free(points.data);
        status = confused;
        return;
      }
    
      reverse(&points);
    
      utf_data text = {0};
      text.data = (char*)malloc(length);
      process_codepoints(points.data, points.length, store_byte, &text);
    
      display("Reversed:");
    
      for (size_t index = 0; index < length; ++index)
        putchar(text.data[index]);
      puts("\n");
    
      reverse(&points);
    
      text.length = 0;
      process_codepoints(points.data, points.length, store_byte, &text);
    
      if (0 != memcmp(utf, text.data, length)) {
        display("Fatal: decoding FAILED...bailing out!!!");
        exit(failure);
      }
      free(points.data);
      free(text.data);
    }
    
    int main(int argc, char** argv) {
      if (argc == 1) {
        char utf8[] =
            "  Οὐχὶ ταὐτὰ παρίσταταί μοι γιγνώσκειν, ὦ ἄνδρες ᾿Αθηναῖοι,\n"
            "  ὅταν τ᾿ εἰς τὰ πράγματα ἀποβλέψω καὶ ὅταν πρὸς τοὺς\n"
            "  λόγους οὓς ἀκούω· τοὺς μὲν γὰρ λόγους περὶ τοῦ\n"
            "  τιμωρήσασθαι Φίλιππον ὁρῶ γιγνομένους, τὰ δὲ πράγματ᾿\n"
            "  εἰς τοῦτο προήκοντα,  ὥσθ᾿ ὅπως μὴ πεισόμεθ᾿ αὐτοὶ\n"
            "  πρότερον κακῶς σκέψασθαι δέον. οὐδέν οὖν ἄλλο μοι δοκοῦσιν\n"
            "  οἱ τὰ τοιαῦτα λέγοντες ἢ τὴν ὑπόθεσιν, περὶ ἧς βουλεύεσθαι,\n"
            "  οὐχὶ τὴν οὖσαν παριστάντες ὑμῖν ἁμαρτάνειν. ἐγὼ δέ, ὅτι μέν\n"
            "  ποτ᾿ ἐξῆν τῇ πόλει καὶ τὰ αὑτῆς ἔχειν ἀσφαλῶς καὶ Φίλιππον\n"
            "  τιμωρήσασθαι, καὶ μάλ᾿ ἀκριβῶς οἶδα· ἐπ᾿ ἐμοῦ γάρ, οὐ πάλαι\n"
            "  γέγονεν ταῦτ᾿ ἀμφότερα· νῦν μέντοι πέπεισμαι τοῦθ᾿ ἱκανὸν\n"
            "  προλαβεῖν ἡμῖν εἶναι τὴν πρώτην, ὅπως τοὺς συμμάχους\n"
            "  σώσομεν. ἐὰν γὰρ τοῦτο βεβαίως ὑπάρξῃ, τότε καὶ περὶ τοῦ\n"
            "  τίνα τιμωρήσεταί τις καὶ ὃν τρόπον ἐξέσται σκοπεῖν· πρὶν δὲ\n"
            "  τὴν ἀρχὴν ὀρθῶς ὑποθέσθαι, μάταιον ἡγοῦμαι περὶ τῆς\n"
            "  τελευτῆς ὁντινοῦν ποιεῖσθαι λόγον.";
        test(utf8, sizeof(utf8));
      } else
        for (;;) {
          char* path = *(++argv);
          if (!path)
            break;
          FILE* stream = fopen(path, "rb");
          if (!stream) {
            fprintf(stderr, "Error: cannot process file '%s'\n", path);
            continue;
          }
          fseek(stream, 0, SEEK_END);
          size_t size = ftell(stream);
          rewind(stream);
          char* utf8 = (char*)malloc(size);
          fread(utf8, 1, size, stream);
          fclose(stream);
          test(utf8, size);
          free(utf8);
        }
      if (status == success)
        display("All tests passed.");
      return status;
    }
    Passing a canonical UTF-8 test file as input:

    Text:

    UTF-8 encoded sample plain-text file
    ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾

    Markus Kuhn [ˈmaʳkʊs kuːn] &lt;[email protected]> — 1999-08-20


    The ASCII compatible UTF-8 encoding of ISO 10646 and Unicode
    plain-text files is defined in RFC 2279 and in ISO 10646-1 Annex R.


    Using Unicode/UTF-8, you can write in emails and source code things such as

    Mathematics and Sciences:

    ∮ E⋅da = Q, n → ∞, ∑ f(i) = ∏ g(i), ∀x∈ℝ: ⌈x⌉ = −⌊−x⌋, α ∧ ¬β = ¬(¬α ∨ β),

    ℕ ⊆ ℕ₀ ⊂ ℤ ⊂ ℚ ⊂ ℝ ⊂ ℂ, ⊥ &lt; a ≠ b ≡ c ≤ d ≪ ⊤ ⇒ (A ⇔ B),

    2H₂ + O₂ ⇌ 2H₂O, R = 4.7 kΩ, ⌀ 200 mm

    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ɑ]

    APL:

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

    Nicer typography in plain text files:

    ╔══════════════════════════════════════════╗
    ║ ║
    ║ • ‘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 € │ ║
    ║ ╰─────────╯ ║
    ╚══════════════════════════════════════════╝

    Greek (in Polytonic):

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

    Greetings in various languages:

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

    Box drawing alignment tests: █

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






    Reversed:




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

    █ :stset tnemngila gniward xoB

    ハチニンコ ,εμσόκ αρέμηλαΚ ,dlrow olleH

    :segaugnal suoirav ni sgniteerG

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

    :txet elpmaxe noitceles tnof tcapmoC

    )snekciD yb "loraC samtsirhC A" fo shpargarap fo elpuoc tsrif ehT(

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

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

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

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

    :elliarB

    )'.aeS nretseW eht raen dnal nrehtron eht ni devil eh taht
    dias eH' snaem dna '.eastseW aht htiw mudraewhtron ednal meaht edub
    eh taht hteawc eH' sdaer nitaL otni debircsnart hcihw ,hsilgnE dlO(

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

    :senuR

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

    :egaugnal cirahmA eht ni sbrevorP

    :naipoihtE

    ).evoba retcarahc |
    eht htiw dengila eb dluohs nmuloc dnoces eht fo senil eht ,yltcerroc
    deldnah era sretcarahc gninibmoc fI .txet nmuloc-owt a si evoba ehT(

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

    'auG naS' cissalc
    esenihC a( smodgniK eerhT ehT fo ecnamoR ehT no yrteop a morf tprecxE

    2 leveL SCU( iahT

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

    :noitativni ecnerefnoc edocinU a morF

    :naissuR

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

    :noitativni ecnerefnoc edocinU a morF

    :naigroeG

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

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

    :CB yrutnec ht4 eht ni senehtsomeD fo hceeps a morF

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

    .ῆγ ὴτ ιεάρτεμ αίβ ὲμ ὺοπ
    ηψὄ νὴτ ὸπἀ ωζίρωνγ ὲσ
    ,ήρεμορτ νὴτ ῦοιθαπσ ῦοτ
    ηψόκ νὴτ ὸπἀ ωζίρωνγ ὲΣ

    :mehtna keerG ehT

    cinotyloP ni( keerG

    ╝══════════════════════════════════════════╚
    ║ ╯─────────╰ ║
    ║ │ € 59.41 │ :lobmys orue eht • ║
    ║ ╮─────────╭ ║
    ║ B8 ,DO0 ,|Il1 :tset ytefas IICSA • ║
    ║ ║
    ║ … ,™ ,5+/5− ,— ,4–3 ,• ,‰ ,‡ ,† • ║
    ║ ║
    ║ “nehciezsgnurhüfnA„ ‘ehcstued‚ • ║
    ║ ║
    ║ `´' :stnecca dna ehportsopa 1-nitaL • ║
    ║ ║
    ║ ”ereh neeb ev’eW“ :sehportsopa ylruC • ║
    ║ ║
    ║ setouq ”elbuod“ dna ’elgnis‘ • ║
    ║ ║
    ╗══════════════════════════════════════════╔

    :selif txet nialp ni yhpargopyt reciN

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

    :LPA

    ]ɑgːojˈ[ agoY ,]nɛj[ neY ,]nɔlispʏˈ[ Y
    nʃıeˈisʊosə kıtɛnˈəf lənəʃænˈətnı ið

    :seiranoitcid dna scitsiugniL

    mm 002 ⌀ ,Ωk 7.4 = R ,O₂H2 ⇌ ₂O + ₂H2

    ,)B ⇔ A( ⇒ ⊤ ≪ d ≤ c ≡ b ≠ a ;tl& ⊥ ,ℂ ⊂ ℝ ⊂ ℚ ⊂ ℤ ⊂ ₀ℕ ⊆ ℕ

    ,)β ∨ α¬(¬ = β¬ ∧ α ,⌋x−⌊− = ⌉x⌈ :ℝ∈x∀ ,)i(g ∏ = )i(f ∑ ,∞ → n ,Q = ad⋅E ∮

    :secneicS dna scitamehtaM

    sa hcus sgniht edoc ecruos dna sliame ni etirw nac uoy ,8-FTU/edocinU gnisU


    .R xennA 1-64601 OSI ni dna 9722 CFR ni denifed si selif txet-nialp
    edocinU dna 64601 OSI fo gnidocne 8-FTU elbitapmoc IICSA ehT


    02-80-9991 — >gro.mca@nhukm;tl& ]nːuk sʊkʳamˈ[ nhuK sukraM

    ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
    elif txet-nialp elpmas dedocne 8-FTU


    All tests passed.

    Looks like everything's working correctly now.
    Last edited by Sir Galahad; 03-14-2021 at 06:54 PM. Reason: remove funny prefix

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. Replies: 1
    Last Post: 02-23-2010, 08:15 AM
  2. How can i make a "letter could not be found" break?
    By Welshy in forum C++ Programming
    Replies: 14
    Last Post: 04-12-2005, 02:41 PM
  3. Count the number of letter "a" on a sentence
    By imbecile in C in forum C Programming
    Replies: 6
    Last Post: 07-27-2003, 02:32 PM
  4. "itoa"-"_itoa" , "inp"-"_inp", Why some functions have "
    By L.O.K. in forum Windows Programming
    Replies: 5
    Last Post: 12-08-2002, 08:25 AM
  5. "CWnd"-"HWnd","CBitmap"-"HBitmap"...., What is mean by "
    By L.O.K. in forum Windows Programming
    Replies: 2
    Last Post: 12-04-2002, 07:59 AM

Tags for this Thread