Zdravím, mám zvídavý dotaz:
netušíte nevíte někdo, jakým způsobem lze za normálních okolností (tzn. bez nějakých speciálních nástrojů) napsat diakritické písmenko (např. obyčejné dlouhé a → á) tak, že nejdřív se napíše
a a až pak čárka
´U nás je běžně
á na české klávesnici na klávese
8. Taky lze totéž písmeno napsat tak, že se bouchne nejdřív čárka (klávesa
=) a pak obyčejné malé
a a vznikne z toho
á. Oba jsou to jak vzhledově, tak binárně naprosto identické znaky (aspoň ve Windows).
Proč se ptám: řešil jsem převod dat z jedné databáze do druhé (Oracle→MSSQL) a narazil jsem na slovo „Oznámení“ (jako součást názvu souboru), které v databázi bylo dvakrát. Je nad tím vytvořený unique index s výběrem několika sloupců a došlo k tomu, že ve zdrojové databázi byly všechny hodnoty dvakrát, akorát to jméno souboru se lišilo právě v tom, jakým způsobem je napsané to „Oznámení“. Oracle to nebral jako duplicitu, MSSQL to jako duplicitu vzal, protože mě nenapadlo, že musím dát Collation s vlastností „WS - width sensitive“ (to se v našem prostředí běžně nedělá). Tedy já vím, jak ten problém vyřešit, ale co je mi záhadou, je, jak mohl někdo tyhle znaky do té databáze uživatelskou cestou dostat. Neznám aplikační logiku, která do té databáze strká data, a je to irelevantní, téměř jistě tam prostě dochází k uploadům souboru, ty se ukládají do databáze (čert to vem) a jméno souboru se k nim připíše spíš tak jako pro pořádek (reálně to jméno souboru nikde na filesystemu už nefiguruje, aby se na něj něco odkazovalo nebo tak).
A teď jak to jméno souboru (resp. ta část jména vyjádřená slovem „Oznámení“) vypadala v té druhé binárně neidentické verzi: no, takto: „Oznámení“.
Jakkoli to vypadá stejně, stejné to není. Když jsem si to rozklíčoval do hexa, zjistil jsem, že existuje sada speciálních diakritických znaků (
Combining Diacritical Marks), což jsou diakritické znaky platící pro znak před nimi (aneb v případě čárky je to „čárka nad tím, co je před tím“). Takhle lze jakýkoli z těchto diakritických znaků napsat nad jakýkoli jiný znak (asi kromě jakéhokoli znaku z této sady), takže lze vyrobit třeba slovo „eͫnͤcͯoͥdͨeͦ“
Takže zatímco takový „Pěťovníček“ má v UTF16 22 bajtů, tak „Pěťovníček“ jich má 28. A když bude v MSSQL Collation bez width sensitive, tak to budou pro ten server duplicitní řetězce (pokud se to dá do sloupce s podporou unicode znaků, tedy např. nvarchar - když jsem to dával do varchar, rozdělilo to ten diakritický znak od toho běžného a vznikly dva, takže se duplicita nekonala).
Já to takhle napsal za pomoci
dencode.com/string/hex, ale mě zajímá, jestli nevíte, jak (v jakém OS?) se to dá napsat "normálně", bez dopomoci nějakých takovýchto fíglů.