Portál AbcLinuxu, 22. května 2024 15:51


Dotaz: C++ zjistit počet znaků ve stringu (UTF8)

28.2.2012 09:13 Smíšek
C++ zjistit počet znaků ve stringu (UTF8)
Přečteno: 1179×
Odpovědět | Admin

Ahoj, jak už název říká, potřeboval bych v c++ zjistit ze zadaného stringu počet znaků. Funkce .size() i .length() mi dávají špatné odpovědi při použití diakritiky (ěščřžýáíé,..), počítám s tím že znaky s diakritikou v UTF8 zabírají 2bajty, bez nich 1bajt. Nemáte nějakou odzkoušenou funkci která mi to správně spočítá. Chvíli už hledám, ale na nic kloudného jsem nenarazil. Použitý kompilátor: g++ (Debian 4.6.2-16) 4.6.2


Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Řešení 2× (Vašek Lorenc, Vojtěch Horký)
28.2.2012 09:48 Kit
Rozbalit Rozbalit vše Re: C++ zjistit počet znaků ve stringu (UTF8)
Odpovědět | | Sbalit | Link | Blokovat | Admin
Utf8StringSize()
28.2.2012 10:04 Smíšek
Rozbalit Rozbalit vše Re: C++ zjistit počet znaků ve stringu (UTF8)
Díky :-) funguje parádně
28.2.2012 14:02 Sten
Rozbalit Rozbalit vše Re: C++ zjistit počet znaků ve stringu (UTF8)
Odpovědět | | Sbalit | Link | Blokovat | Admin
Dovoluju si upozornit, že nejde o počet znaků, ale o počet code pointů. Sice se u českého uživatele většinou nesetkáte s tím, že by jeden znak byl zapsán více code pointy, ale pokud jde o ochranu vstupu, může někdo podle napsat č místo jednoho code pointu U+010D dvěma code pointy U+0063 U+030C, a pak vám ta funkce vrátí, že tam jsou znaky dva, i když je jeden. Zjistit skutečný počet znaků je ale kvůli tomu v Unicode velmi obtížné a musel byste na to použít třeba knihovnu ICU.
28.2.2012 14:37 Ivan
Rozbalit Rozbalit vše Re: C++ zjistit počet znaků ve stringu (UTF8)
Dik za tip. Tohle jsem netusil. Hadam ze to co popisujes se muze stat pokud uzivatel pouzije Ctrl+C Ctrl+V z PDF.
29.2.2012 15:05 Sten
Rozbalit Rozbalit vše Re: C++ zjistit počet znaků ve stringu (UTF8)
U PDF to IMO nehrozí, ale třeba MacOS X používá interně (např. na souborovém systému) ty znaky dekomponované (rozložené), i když pro komunikaci by je měl zase složit.
29.2.2012 10:47 lofcek
Rozbalit Rozbalit vše Re: C++ zjistit počet znaků ve stringu (UTF8)
Odpovědět | | Sbalit | Link | Blokovat | Admin
A ja viem este o dalsich "bonusoch" vyplyvajucich z pouzivania Unicode (nie len utf-8).

1. Ja uplne jedno, ci mam retazec ulozeny ako "wchar_t*", alebo utf-8 char* - aj tak vo funkciach ako printf sa sirka pocita v znakoch utf-8. Cize printf("%.4ls\n", L"ažšČľňť"); pochopi ako 4 utf-8 znaky - cize: a = 1 znak ž = 2 znaky š = 2 znaky, to by uz nevyslo cele .. takze z neho sa uz neypise nic.

2. Znaky v korejcine/japoncine a cinstine sice zaberaju len jeden wchar_t, ale v terminale zaberaju sirku 2 znakov. Potom, ked sme robili korejsku lokalizaciu produktu, tak sme zistili, ze existuje wcwidth a wcswidth.
pavlix avatar 29.2.2012 16:02 pavlix | skóre: 54 | blog: pavlix
Rozbalit Rozbalit vše Re: C++ zjistit počet znaků ve stringu (UTF8)
A ja viem este o dalsich "bonusoch" vyplyvajucich z pouzivania Unicode (nie len utf-8).
Možná jsi zmaten tím, že v začátcích Unicode existovalo kódování Unicode, které se jmenovalo stejně jako znaková sada Unicode. Ale to už strašně moc dlouho neplatí.

Unicode má hodně přes sto tisíc definovaných znaků a teoreticky cca dvě miliardy, takže na uložení obecného codepointu do 16bit číselné proměnné zapomeň. Standard definuje 31-bitové codepointy, aby byly totožné v signed i unsigned 32-bit proměnných.

UTF-8 je jedno z možných kódování (formátů serializace) znakové sady Unicode. Znaková sada je v tomhle případě abstraktní věc, seznam codepointů (obvykle) pro jednotlivé znaky.

S tou korejštinou dobrá poznámka.
Já už tu vlastně ani nejsem. Abclinuxu umřelo.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.