abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
dnes 04:10 | Nová verze

Po 10 týdnech vývoje od vydání Linuxu 4.9 (zprávička) oznámil Linus Torvalds, mj. již 20 let žijící v USA, vydání Linuxu 4.10 (LKML). Přehled nových vlastností a vylepšení například na Kernel Newbies a v Jaderných novinách (1, 2 a 3). Kódové jméno Linuxu 4.10 je Fearless Coyote.

Ladislav Hagara | Komentářů: 0
včera 15:55 | Zajímavý projekt

Vyzkoušet si příkazy a vyřešit několik úkolů lze na stránkách Commandline Challenge (CMD Challenge). Úkoly lze řešit různými způsoby, důležitý je výsledek. Zdrojové kódy jsou k dispozici na GitHubu pod licencí MIT.

Ladislav Hagara | Komentářů: 10
18.2. 17:35 | Bezpečnostní upozornění

Německá Bundesnetzagentur (obdoba českého ČTU) zakázala na německém území prodej panenky Cayla kvůli „špionáži“ dětí. Tato elektronická hračka obsahuje mikrofon, reproduktor a kameru a bezdrátové komunikační rozhraní, pomocí kterého se hračka připojuje na servery výrobce. Takovýmto způsobem může hračka pomocí umělé inteligence „odpovídat“ na dotazy dítěte. Hlavní problém bude ale asi někde jinde, podle prvotních zpráv může

… více »
Petr Tomášek | Komentářů: 26
17.2. 15:30 | Bezpečnostní upozornění

CSIRT.CZ upozorňuje, že bezpečnostní experti objevili nový typ malwaru, jenž cílí na open source e-commerce platformu Magento. Malware je zajímavý tím, že se jedná o první svého druhu, jehož kód zůstává skrytý v SQL databázi zasaženého e-shopu. Škodlivý kód je volán pomocí tzv. SQL trigerru, který je spouštěn při každém vytvoření objednávky v systému.

Ladislav Hagara | Komentářů: 2
17.2. 09:00 | Nová verze

Bylo vydáno Ubuntu 16.04.2 LTS, tj. druhé opravné vydání Ubuntu 16.04 LTS s kódovým názvem Xenial Xerus. Přehled novinek v poznámkách k vydání a v přehledu změn.

Ladislav Hagara | Komentářů: 50
17.2. 06:00 | Zajímavý článek

Pavel Tišnovský se v dvoudílném článku na MojeFedora.cz věnuje tvorbě pluginů (modulů) pro bitmapový grafický editor GIMP. Pomocí pluginů lze GIMP rozšiřovat o další funkce. Implementovat lze například nové filtry nebo pomocné utility pro tvorbu animací či poloautomatickou retuš snímků.

Ladislav Hagara | Komentářů: 6
16.2. 23:32 | Komunita

Do 30. března se lze přihlásit do dalšího kola programu Outreachy, jehož cílem je přitáhnout do světa svobodného a otevřeného softwaru lidi ze skupin, jež jsou ve světě svobodného a otevřeného softwaru málo zastoupeny. Za 3 měsíce práce, od 30. května do 30. srpna 2017, v participujících organizacích lze vydělat 5 500 USD. Jedná se již o 14. kolo tohoto programu.

Ladislav Hagara | Komentářů: 11
16.2. 23:13 | Nová verze

Byla vydána verze 0.92.1 svobodného multiplatformního vektorového grafického editoru Inkscape. Přehled novinek v poznámkách k vydání. Řešen je mimo jiné problém s verzí 0.92, jež rozbíjí dokumenty vytvořené v předchozích verzích Inkscape. Více v příspěvku na blogu Davida Revoye, autora open source webového komiksu Pepper&Carrot nebo portrétu GNU/Linuxu.

Ladislav Hagara | Komentářů: 0
16.2. 16:26 | Bezpečnostní upozornění

Byla vydána verze 1.1.0e kryptografické knihovny OpenSSL. Dle bezpečnostního upozornění 20170216 byla opravena závažná bezpečnostní chyba CVE-2017-3733.

Ladislav Hagara | Komentářů: 1
16.2. 13:03 | Pozvánky

GNOME hackaton proběhne v Brně na FIT VUT v Red Hat Labu (budova Q) v pondělí 20. února od 15:00. Registrace není nutná, ale pokud dáte na FaceBooku vědět, že plánujete dorazit, pomůže to s plánováním.

Ladislav Hagara | Komentářů: 0
Jak se stavíte k trendu ztenčování přenosných zařízení (smartphony, notebooky)?
 (13%)
 (2%)
 (72%)
 (3%)
 (10%)
Celkem 658 hlasů
 Komentářů: 52, poslední 13.2. 12:45
Rozcestník
Reklama

Dotaz: C/C++ podpora UTF-8, jak to funguje?

11.11.2011 23:26 Jarda
C/C++ podpora UTF-8, jak to funguje?
Přečteno: 1006×
Zdravím, nerozumím následující věci, popíšu příklad...

Mám zdroják v C, který zobrazí znak 'Ω', tj. Unicode Character 'OHM SIGN' (U+2126).

#include <stdio.h>
#include <wchar.h>
#include <locale.h>
 
int main() {
  setlocale(LC_ALL,"");
  wchar_t myChar1 = L'Ω';
  wchar_t myChar2 = 0x2126;  // hexadecimal encoding of char Ω using UTF-16
  wchar_t myChar3 = L'\xe2\x84\xa6';

  wprintf(L"%lc \n", myChar1);
  wprintf(L"%lc \n", myChar2);
  wprintf(L"%lc \n", myChar3); 

  return 0;
}

Zdroják je na disku uložen v souboru jako UTF-8, tj. znak 'Ω' je v něm jako 0xe2 0x84 0xa6. Ovšem pokud ho chci zapsat v C jako posloupnost bytů tak musím přes UTF-16 (\u2126), já bych ho chtěl ale zapsat jako UTF-8, jako posloupnost těch 3 bytů myChar3.

Z mého pohledu se hodnota u myChar1 a myChar3 zdá stejná (jen trochu jinak zapsaná), ale ve výsledku není, poslední wprintf vypíše znak '¦', tj. \u00a6 neboli UTF-8 0xC2 0xA6.

No jsem z toho nějakej zblblej, používám gcc version 4.6.1 20110908 a glibc-2.14-5.x86_64 :D

Když si v bashi dám echo -e "\xe2\x84\xa6\u2126", tak to na obrazovku normálně vypíše ΩΩ.

Odpovědi

12.11.2011 00:15 l4m4
Rozbalit Rozbalit vše Re: C/C++ podpora UTF-8, jak to funguje?
wchar_t není UTF-8.

UTF-8 je representace znaků Unicode pomocí různě dlouhých sekvencí bajtů.

wchar_t je nějaký blíže nespecifikovaný platformově závislý vícebytový typ v C. Na MS Windows 16bitový integer (representující UCS-2), na Unixu spíš 32bitový integer (representující UCS-4), taky to ale klidně může být něco ještě podivnějšího, a Unicode Consortium nedoporučuje to používat kvůli přenositelnosti.

Takže běžnější (alespoň na Uninxu; na MS Windows platformová závislost málokoho trápí, když jejich veškerá platforma je MS Windows) je represntovat Unicode řetězce pomocí char v UTF-8, přičemž potom samozřejmě je rozdíl mezi znaky a bajty, protože znak může být více bajtů. Tvoje oblíbená knihovna/framework určitě má funkce pro práci s UTF-8 kódovanými řetězci, tudíž zapisuješ zdroják přímo v UTF-8 (vyžaduje, aby 8bitové znaky bral kompilátor, dnes už nebývá problém) a používáš příslušné UTF-8 (ne wide-char!) funkce.
12.11.2011 02:35 Michal Kubeček | skóre: 71 | Luštěnice
Rozbalit Rozbalit vše Re: C/C++ podpora UTF-8, jak to funguje?
Druhou možností je převést UTF-8 na tu interní reprezentaci, s tou pracovat interně a před uložením zase konvertovat zpátky. To se hodí hlavně tam, kde by proměnná délka znaku příliš komplikovala život a naopak nevadí větší spotřeba paměti. V C na to lze použít např. funkce mbsrtowcs() a wcsrtombs(), v C++ se přiřadí locale I/O streamu (metoda imbue()).
12.11.2011 12:55 petr_p | skóre: 59 | blog: pb
Rozbalit Rozbalit vše Re: C/C++ podpora UTF-8, jak to funguje?
Na druhou stranu wchar_t podle ISO C99 musí splňovat podmínku, že pojme libovolný znak z libovolného locale podporovaného danou implementaci standardní knihovny. A navíc jediný způsob, jak (pomocí standardní knihovny) zjistit zobrazovanou šířku znaku (0 sloupců pro wor-joiner, 1 pro běžnou latinku, 2 pro CJK) je přes typ wchar_t, takže se mu ani tak nevyhnete.
12.11.2011 13:24 l4m4
Rozbalit Rozbalit vše Re: C/C++ podpora UTF-8, jak to funguje?
Chci vidět program, který pracuje smysluplně s mezinárodním textem pouze pomocí standardní knihovny...

Nicméně je dobře, že jsi upozornil, na vlastnost pojme libovolný znak z libovolného locale podporovaného danou implementaci standardní knihovny, protože standard C umožňuje dokonce i pouze 8bitový wchar_t (a na nějakých obskurních/historických systémech to tak i je, akorát bych musel najít kde a jak, byl to nějaký, co měl jako největší vymoženost podporu Latin1).

Tudíž chceš-li používat Unicode, tak ho používej, použij nějakou knihovnu pro práci s Unicode (ať už representované v UTF-8 jako bajty nebo v UCS-4 jako 32bitové integery), a nematlej do toho wchar_t.

Stačí-li ti nepřenositelně podporovat cokoli, co tvůj kompilátor a standardní knihovna zrovna prohlásily za wide-char, a používat pouze funkce standardní knihovny, tak používej to.
Josef Kufner avatar 20.11.2011 23:39 Josef Kufner | skóre: 66
Rozbalit Rozbalit vše Re: C/C++ podpora UTF-8, jak to funguje?
V podstatě můžeš kódování ignorovat a použít prosté char * v UTF-8 – tak jak to dostaneš, tak to vypíšeš.

Řešit to musíš až v okamžiku, kdy tě zajímá, kolik místa to zabere na obrazovce (strlen() nestačí) nebo pokud chceš seřadit seznam (strcmp() nestačí), případně zkracovat řetězce (abys nerozpůlil znak).
Hello world ! Segmentation fault (core dumped)

Založit nové vláknoNahoru

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

ISSN 1214-1267   www.czech-server.cz
© 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.