C++, Unicode a debugování

C++, Unicode a debugování
« kdy: 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...)?
 


Ivan

Re:C++, Unicode a debugování
« Odpověď #1 kdy: 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 bohuzel je to ale zoufale pomaly. Nejlip se takovy veci debugujou ve Visual Studiu.


Re:C++, Unicode a debugování
« Odpověď #2 kdy: 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".

Sten

Re:C++, Unicode a debugování
« Odpověď #3 kdy: 13. 05. 2014, 15:55:08 »
GDB podporuje UTF-16 a UTF-32. M2lo by to umět i automaticky, pokud je typ proměnné char16_t nebo char32_t.

lacod

Re:C++, Unicode a debugování
« Odpověď #4 kdy: 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 .


Re:C++, Unicode a debugování
« Odpověď #5 kdy: 14. 05. 2014, 15:29:04 »
GDB podporuje UTF-16 a UTF-32. 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.

gamer

Re:C++, Unicode a debugování
« Odpověď #6 kdy: 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/

Re:C++, Unicode a debugování
« Odpověď #7 kdy: 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/

Sten

Re:C++, Unicode a debugování
« Odpověď #8 kdy: 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.

Re:C++, Unicode a debugování
« Odpověď #9 kdy: 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.

gamer

Re:C++, Unicode a debugování
« Odpověď #10 kdy: 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

Re:C++, Unicode a debugování
« Odpověď #11 kdy: 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...