Portál AbcLinuxu, 8. května 2025 12:39
Vyšla verze 5.3 toolkitu Qt. Přináší především zlepšení stability a uživatelské přívětivosti vůbec; mezi novinky patří např. WebSockets API nebo třída QQuickWidget, která umožňuje používání jak Qt Widget, tak Qt Quick v jednom uživatelském rozhraní.
Tiskni
Sdílej:
QString
není moc dobře zapouzdřeno, tj. délka stringu a příslušné algoritmy nepracují ne se znaky, ale s utf-16 jednotkami, z čehož mohou vznikat problémy.
z čehož mohou vznikat problémy.Abych to rozvedl: Vezměme například takovýhle string. Všechny znaky tohoto stringu jsou v UTF-16 v dvojicích (tzv. 'surrogate pairs', 2×2B). Pokud tenhle string zobrazíš například v programu
konsole
, nezabere každý znak jedno políčko, jak by měl, ale dvě políčka, navíc špatně funguje označování takového stringu.
P.S. String jsem nemohl vložit přímo do komentáře, ábíčko to nechtělo uložit do databáze UTF-16 je prakticke.Ne. UCS-2 bylo prakticke, protoze to bylo fixed-length kodovani. Bohuzel nekteri ho naivne naimplementovali aniz by si uvedomili ze 16 bitu neni dost, a potom pro ne bylo jednoduzsi prejit na paskvil jmenem UTF-16, nez to udelat spravne a pouzit UTF-8, nebo 32.
1. UTF-8 je ASCII kompatibilniHm, to je taková sporná "výhoda"... Je to výhoda jen na západě a jen ve specifických situacích...
2. UTF-16 vede hodne programatoru k mylne predstave ze je to fixed-lengthTo nepovažuju za technický problém, ale problém dokumentace a/nebo společenský.
3. Dvojce codepointu se nepouzivaji moc casto.To je spíše výhoda - je možné optimalizovat pro častý případ...
To vede k tomu ze programatori z bodu 2 ani nemusi prijit na to ze tam maji chybu. A kod se bude obecne hur ladit.Na ladění to žádný vliv nemá. UTF-8 dekodér je výrazně složitější než UTF-16 a jsou tam taky sporné momenty, ale přesto se dá odladit...
4. UTF-8 nema problem s endianovostiProblém s endianness je problém jakéhokoli multi-byte kódování, ne pouze UTF-16...
To ze ti funguje existujici sw je zcela jasna vyhodaMožná funguje, pokud třeba taky nemáš smůlu...
Pro kod kterej se jednou napise, otestuje, zoptimalizuje a uzavre aby na nej uz nikdo nikdy nemakal to vyhoda je. Pro ruzny ad-hoc algoritmy je to nevyhoda ze pri chybe ti spadnou jednou za mesic pri uplnku...V tomhle není mezi utf-8 a utf-16 rozdíl. Oba se při implementaci musí otestovat pro speciální případy úplně stejně a následně musí být implementace vhodně zapouzdřena.
ASCII kompatibilita je obrovská výhoda. Jednou z důsledků této výhody je to, že UTF-8, stejně jako ASCII nemá problémy s endianitou. Dalším důvodem je, že díky UTF-8 je možné používat okamžitě Unicode na operačních systémech, úložných systémech i v sw, který Unicode nikdy neuměl, nebo s ním od začátku nepočítal (třeba v Linuxu).No nevim, to mi přijde jako hack. U software, který s utf-8 nepočítá, bych měl vždy obavu o bezpečnost.
Za daleko větší problém považuji ne přehození 16-bitového kódování z fixed-length na UTF-16 v historii, ale zdegradování 31-bitového prostoru Unicode na 21-bitový prostor, stejně jako vyhození surrogate kódů z tohoto prostoru, což s tím souběžně přišlo.Silně pochybuju, že by velikost toho prostoru byl problém.
Oč je UTF-16 jednodušší, to naženě nutností brát v potaz endianituTo beru.
Dekodér UTF-8 je jednoznačný, nejsou tam sporné momenty, pokud vynecháme počáteční BOM znak.Za sporné momenty považuju osobně: 1) interpretace hodnot nad U+1FFFFF a 2) je potřeba implementovat ořetření pro overlong sekvnce, tzn. každá vícebajtová sekvence má nějakou miniální unicode hodnotu, pod kterou je sekvence neplatná.
Jednoduše: Odstřelte dva zpátečníky, konkrétně Javu a Windows, a v tu chvíli pomine jakýkoli důvod mít Unicode 21 bitové, a bude okamžitě 31bitové.No, Java a Widle implementují unicode příšerným způsobem, to souhlasim. Pravděpodobně kvůli Javě a Windowsům mají lidi dojem, že UTF-16 je fixed-length. Imho by úplně stačilo na UTF-16 aplikovat stejný postup jako na UTF-8 - tj. prostě povolit tak dlouhé sekvence, jak bude potřeba.
Ta potřeba není potřeba. Ba dokonce toto ošetřování je kontraproduktivní. Dekódování i pod minimální hodnotu je jednoznačné.Dle standardu Unicode jsou overlong sekvence neplatné a neměly by se objevit v UTF-8 stringu. Povolení overlong sekvencí by přineslo problémy např. při porovnávání stringů.
Například je možné zakódovat nulový znak, aniž by se nula vyskytla v bajtech – pak je možné mít ASCIIZ řetězec, který umožňuje mít i nulové znaky uvnitř.No to je teda pěkná prasárna. Nejen, že to je proti standardu, ale taky je to imho bezpečnostní hazard, protože když pak takový string převedeš do jinýho kódování a pak zase zpátky do UTF-8 anebo ho třeba jen proženeš normalizací, tak se ti tam najednou ta nula nečekaně objeví.
A obě strany o tom vědí.To je vtip? Obě strany vědí tak maximálně o standardu, který overlong sekvence nepovoluje. Jestliže je potřeba ve stringu ukládat nuly, tak se to má vyřešit pořádně, tj. nepoužáívat funkce, které předpokládají null-terminated stringy. A ne nějakými takovýmihle hacky, které akorát zavádí další bezpečnostní díru. Jinak kromě té nuly opravdu nevidím, k čemu by overlong sekvence měly být užitečné. Viz třeba [1]:
An important note for developers of UTF-8 decoding routines: For security reasons, a UTF-8 decoder must not accept UTF-8 sequences that are longer than necessary to encode a character.Nebo [2] (DBUS):
The UTF-8 text must be validated strictly: in particular, it must not contain overlong sequences or codepoints above U+10FFFF.A také Qt považuje overlong UTF-8 za nevalidní (tady nemám citaci, zkusil jsem to na svém systému.) Opravdu pochybuju, že moderní browser by to dovolil.
A znovu, což jste cudně zamlčel, standard UTF-8 se několikrát změnil – nekompatibilně.Já jsem to nezamlčel, pouze mi není jasný, proč je to relevantní. Ano, 5- a 6-bajtové sekvence byly dřív povoleny, ale overlong sekvence pokud vím ne.
Nevidím sebemenší problém si v rámci svého sw, či své skupiny projektů, pouštět jakékoli kódování chci. Zatímco Vy v tom problém vidíte.Cudně jsi zamlčel, že máš na mysli pouze interní použití, předtím to tak nevypadalo, předtím jsi tvrdil, že to ošetřování je kontraproduktivní
Viz mé příspěvky výše. Google i Oracle užitečnost vidí, a proto je používají.A kde to používají? Já jen abych věděl, jakému SW se obloukem vyhnout
Ne, i v takovém případě se pracuje s UTF-8. Teprve až si Unicode consortium ujasní a přestane měnit své standardy zhruba každou pětiletku, nebude třeba si nic domýšlet. UTF-8 nevymyslelo Unicode consortium. Je to vynález autorů operačního systému Plan9, kteří potřebovali řešit přechod na Unicode. Podstatou řešení, za kterým stálo na konci UTF-8, je snaha vyhnout se určitým bajtů, aby se nemuselo měnit API systému.Pokud vím, overlong sekvence byly ilegální od začátku [1]:
When there are multiple ways to encode a value, for example UCS 0, only the shortest encoding is legal.Takže fakt nevím, proč sem píšeš to všechno o měnění standardu a uchvácení Unicode konsorciem...
Tyhle úpravy UTF-8 se dějí přímo v kernelu, takže je třeba se vyhnout Javě i Androidu.Javě už se snažím vyhýbat co nejvíce z jiných důvodů, ale je dobře, že vím o dalším, díky. K tomu kernelu jsem skeptický - [citation needed].
Ale je dosti pravděpodobné, že se to vyskytuje i na mnoha jiných místech.Ditto - [citation needed]. Mně přijde dosti pravděpodobné, že mlžíš...
Jeden z výsledků prznění vidíte v programovacím jazyce Ruby, kdy jeho autor prostě neuznává Unicode řetězce a tak řetězce jsou v zásadě binární bloky s uloženou identifikací charsetu.A kde je problem, resp to przneni ?
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.