Unicode ======= Historie: 5 -> 6 -> 7 -> 8 -> 16 -> 16+ bitů na znak Odkazy na Unicode 13.0.0: [s1] -> stránka standardu, [x01] -> example z code charts - snaží se reprezentovat znaky všech světových abeced - reprezentuje znaky (sémantiku), nikoli glyfy (konkrétní grafickou podobu) - snaží se o vztah 1:1 se všemi používanými kódováními => nesystematičnosti - též standardizováno jako ISO 10646 ### Codepointy ### - prostor velikosti 17 x 2^16 = 1114112 - v Unicode 13.0 obsazeno cca 144k codepointů - 0000-007f: ASCII včetně řídicích znaků [x00] - 0080-00ff: iso-8859-1 včetně řídicích znaků [x02] - rozšířená latinka 1 [x05] - pre-komponované znaky s diakritikou - 0130, 0131: turecká i (locale-dependent vztah velké<->malé) - rozšířená latinka 2 [x06] - podivná písmena používaná třeba v afrických jazycích - 01C4-01C7: chorvatské dvojznaky (rozlišení uppercase/lowercase/titlecase) - fonetická abeceda (IPA) [x09] - řečtina a koptština [x20] - nejrůznější varianty cyrilice [x25] - hlaholice [x26] - gruzínština [x30] - futhark [x32] - egyptské hieroglyfy [x33] - CJK = unifikovaná čínština + japonština + korejština [e.g. x35] - disk z Faistu [x37] - kombinující diakritika [x40] - výjimky pro i, j [s318] - obecně může být shaping složitý [s83] - všelijaká interpunkce [x41] - mezery různých šířek [s290] - zero-width (no)breaking space - word joiner (na tomto místě se nesmí zlomit řádek) - zero-width (non-)joiner (týká se ligatur) - různé pomlčky [s292] - soft hyphen - uvozovky [s295] - symboly - šipky [x50] - technické symboly [x51] - všehochuť [x52, x53] - skládačka rámečků [x55] - emotikony [x58] (z toho se později vyvinulo emoji) - speciální notace - hudební [x60] - Braille [x62] - domino [x63] - šachy [x64] - karty [x65] - math - matematické symboly [x70, x71, x72] - letter-like symboly [x73] - šipečky [např. x74] - matematické varianty [x75] - 2063 invisible separator (třeba v M_{ij}) - 2062 invisible times (neznačené násobení) - 2064 invisible plus (třeba v "1 3/4") - zpětná kompatibilita - pre-komponované znaky - zlomky a římská čísla [x81] - ligatury [x83] - mnoho konců řádků: 000D CR, 000A LF, CR+LF, 0085 NEL, 2028 line separator, 2029 paragraph separator - private-use oblasti: E000-F8FF, F0000-FFFFD, 100000-10FFFD - neoficiální registr privátních znaků (třeba klingonština) - non-characters - FFF9, FFFA, FFFB: inter-lineární anotace [s938] - FFFC: object replacement characters (sem se vloží objekt dodaný OOB) - FFFD: replacement character - FFFE není definováno, FEFF je zero-width no-break space (BOM) - variation sequences - FE00-FE0F: selektor grafické varianty - UCD/StandardizedVariants.txt - také se používají pro emoji - embedded tags - E0000-E007F je kopie ASCII používaná k tagování - language tagy (deprecated) ### Reprezentace ### - UCS-2 - historické: pouze 2^16 codepointů - BE+LE varianta, potřebuje BOM (standard říká, že bez BOM je to BE) - UCS-4 alias UTF-32 (BE+LE varianta) - UTF-16 - reprezentace všech codepointů pomocí 16bitových kódů - surrogates: D800-DBFF high, DC00-DFFF low - UTF-8 - nadmnožina ASCII, ostatní znaky mají 2 až 4 byty - podmínky na normalizaci: <0x110000, nejkratší kód - neoficiální rozšíření na 64-bitová čísla (Perl5) - samosynchronizující, zachovává lexikografické pořadí - nešvar s BOM - UTF-7, Punycode a další ### Tabulky vlastností ### - jméno - general category [s199] - způsob zobrazování (např. směr psaní) - upper/lower/titlecase mappings - numerická hodnota - dekompozice (normální a ) - canonical combining class - PropList.txt: další binární vlastnosti - NamesList.txt: alternativní jména - Scripts.txt: ke kterému písmu co patří - SpecialCasing.txt: výjimky z case-folding algoritmů ### Normální formy ### - kanonická dekompozice (NFD) - akcenty uspořádány podle combining class - v rámci combining class pořadí zachováno - kanonická kompozice (NFC) - používáme pre-komponované znaky, kdekoliv možno - kompatibilní (de)kompozice (NFKD, NFKC) - standard slibuje stabilitu normálních forem ### Problémy ### - kódování znaků není jednoznačné (rozložené vs. složené znaky), je nutné pečlivě normalizovat => problémy s bezpečností, s filesystémy - podobné problémy s UTF-8 / UTF-16, pokud se dekóduje ledabyle - stejně vypadající znaky => phishing ### Emoji ### https://emojipedia.org/ -> "czechia" - flag sequences -> "ch-zh" - tag sequences (momentálně jen pro vlajky regionů) -> "person running" - univerzální -> "man running" - person running + ZWJ + male sign -> combining skin tone modifiers -> ZWJ + hair color -> "black cat" - cat + ZWJ + black square -> "astronaut" - person + ZWJ + rocket -> "family" - složitější konstrukce se ZWJ -> "roger" - pirate flag = blackflag + ZWJ + skull and crossbones ### Odkazy ### https://shapecatcher.com/ https://r12a.github.io/uniview/