Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: letranger 13. 05. 2014, 10:44:19

Název: C++, Unicode a debugování
Přispěvatel: letranger 13. 05. 2014, 10:44:19
Máte prosím někdo zkušenosti s prací s UTF-32 řetězci v C++? Píšu program, který analyzuje texty v unicode - načte řetězec v UTF-8, pro interní zpracování ho převede do UTF-32, zpracuje a výsledek převede zase do UTF-8 a uloží do souborů. Mimo to, že práce s Unicode je v C++ hodně nepříjemná (i v C++11 standardu), zvláště pokud chcete mít kód, který jde přeložit jak ve Visual Studiu tak v gcc, mám velký problém s debugováním. Ve Visual Studiu jsem schopen zobrazit UTF-8 řetězce, pokud si dám watch něco jako "text.c_str(),s8", ale s UTF-32 už si nevím rady. Nevíte, jestli na to existuje nějaké nastavení, plugin nebo to umí nějaké jiné IDE (Eclipse, Netbeans...)?
 
Název: Re:C++, Unicode a debugování
Přispěvatel: Ivan 13. 05. 2014, 11:19:35
Naposledy kdyz jsem to zjistioval tak to Eclipse CDT neumelo - ani samotny GDB to neumi. Pro QT QString(UTF-16) pouzivam tohle gdb makro http://silmor.de/qtstuff.printqstring.php (http://silmor.de/qtstuff.printqstring.php) bohuzel je to ale zoufale pomaly. Nejlip se takovy veci debugujou ve Visual Studiu.

Název: Re:C++, Unicode a debugování
Přispěvatel: letranger 13. 05. 2014, 11:38:53
Taky používám primárně Visual Studio. Zobrazovaní v debuggeru by mělo jít nějak upravit přes jakési .natvis soubory, viz např. http://blogs.msdn.com/b/mgoldin/archive/2012/06/06/visual-studio-2012-and-debugger-natvis-files-what-can-i-do-with-them.aspx ale jak už jsem psal, zatím jsem se nedostal dál, než k zobrazení utf-8 stringů přes "watch".
Název: Re:C++, Unicode a debugování
Přispěvatel: Sten 13. 05. 2014, 15:55:08
GDB podporuje UTF-16 a UTF-32 (http://sourceware.org/gdb/onlinedocs/gdb/Memory.html). M2lo by to umět i automaticky, pokud je typ proměnné char16_t nebo char32_t.
Název: Re:C++, Unicode a debugování
Přispěvatel: lacod 13. 05. 2014, 22:14:32
Na windows nemam skusenost. Na linuxe je terminal default skompilovany pre UTF8, znaky kodovane inak nezobrazi. Debug vypisy som riesil konverziou do utf8, funkcia iconv .
Název: Re:C++, Unicode a debugování
Přispěvatel: letranger 14. 05. 2014, 15:29:04
GDB podporuje UTF-16 a UTF-32 (http://sourceware.org/gdb/onlinedocs/gdb/Memory.html). M2lo by to umět i automaticky, pokud je typ proměnné char16_t nebo char32_t.

Prave, ze to tak jednoduse nejde. Pouzivam interne char32_t, ale je to opravdu mor, dost veci porad neni implementovana a gcc a VS compilery se dost lisi. Dalsi hruza je jak udelat nejak prenositelne konverzi UTF-32 retezce na mala pismena (to_lower), to mi nejde ani s boost::locale ani se std::locale z C++11.
Název: Re:C++, Unicode a debugování
Přispěvatel: gamer 14. 05. 2014, 15:54:22
Dalsi hruza je jak udelat nejak prenositelne konverzi UTF-32 retezce na mala pismena (to_lower), to mi nejde ani s boost::locale ani se std::locale z C++11.

Na takové věci je nejlepší libicu:
http://site.icu-project.org/
Název: Re:C++, Unicode a debugování
Přispěvatel: letranger 14. 05. 2014, 16:50:24
Na to ICU jsem se díval, ale přijde mi to trochu "heavy" na to, že jen potřebuju převést text z UTF-8 do UTF-32 a mít způsob, jak na něj udělat "tolower()". Vlastně jen to druhé, na to první jsem už našel tuhle knihovnu - http://utfcpp.sourceforge.net/
Název: Re:C++, Unicode a debugování
Přispěvatel: Sten 14. 05. 2014, 17:41:05
Na to ICU jsem se díval, ale přijde mi to trochu "heavy" na to, že jen potřebuju převést text z UTF-8 do UTF-32 a mít způsob, jak na něj udělat "tolower()". Vlastně jen to druhé, na to první jsem už našel tuhle knihovnu - http://utfcpp.sourceforge.net/

Udělat tolower v Unicode není zrovna triviální. Například řečtina má jednu upper-case sigmu, ale dvě různé lower-case varianty pro různé případy, a to musí ICU správně vyhodnotit.
Název: Re:C++, Unicode a debugování
Přispěvatel: letranger 15. 05. 2014, 13:18:12
Ja to nepotrebuju az tak detailne k nejakym vyjimkam s reckou sigmou nebo ostrym s v nemcine prevadenym na "ss". Potrebuju jen, aby se to chovalo konzistentne v standardnich pripadech.

Nicmene jsem si to ICU stahl a zkompiloval, ale prijde mi to jako dost velka hruza s dost nevhodnym interfacem. Maji tam jakou si tridu UnicodeString, ale neni uplne evidentni, jak si rozumi s STL, tj. do ni nacpat std::string (u16string,u32string), potreboval bych videt alespon nejake priklady pouziti, ale nemuzu ani pres google nic najit.
Název: Re:C++, Unicode a debugování
Přispěvatel: gamer 15. 05. 2014, 15:35:45
Kód: [Vybrat]
#include <unicode/unistr.h>
#include <iostream>

int main()
{
    std::string str = "PŘÍLIŠ ŽLOUŤOUČKÝ KŮŇ ÚPĚL ĎÁBELSKÉ ÓDY";
    UnicodeString ustr(str.data(), str.length());
    UnicodeString ulower = ustr.toLower();
    const int32_t length = ulower.extract(0, ulower.length(), (char*) NULL, (uint32_t) 0);
    char buffer[length];
    ulower.extract(0, ulower.length(), buffer, length);
    std::string lower(buffer, length);
    std::cout << lower << std::endl;
    return 0;
}
g++ main.cc -Wall -licuuc -o test
./test
příliš žlouťoučký kůň úpěl ďábelské ódy
Název: Re:C++, Unicode a debugování
Přispěvatel: letranger 23. 05. 2014, 16:46:01
Děkuju za příklad, tohle funguje dobře. Nakonec jsme se ale rozhodli si napsat vlastní tolower() funkci pro UCS-2 znaky, se kterými pracujeme (latinka, azbuka, řečtina) než přidávat ICU knihovnu do projektu. Měl jsem celkem problem udělat z ICU static knihovnu ve Windows, ale asi by se to poddalo, kdybych tomu věnoval víc času.

Jinak doufám, že se postupně v nových verzích překladačů bude podpora C++11 zlepšovat. Docela jsem se na podporu Unicode v C++11 těšil, ale současný stav je pro mě velkým zklamáním, hlavně úplná absence <codecvt> v gcc...