- NevemTeve blogja
- A hozzászóláshoz be kell jelentkezni
- 520 megtekintés
Hozzászólások
Hm... mar eleve ez a `short wchar_t` is egy erdekes allatfaj lehet... I (and/or anything relevant codespaces nowadays) 👍 it!
- A hozzászóláshoz be kell jelentkezni
Mondjuk nem elsőre nyilvánvaló, hogy mit panaszol a C++ fordító. Neki ez olyasmi, mintha 'typedef short char' lenne, vagyis egyrészt hibás a 'short char', másrészt nincs megadva a definiálandó típus neve.
Ja és ami egyszer 16 bites volt volt, az annyi is marad (Windows, Aix32) a kompatibilitás miatt. Ebből az is kiderül, hogy a kérdező az SO-n még 32-biten próbálkozik, mert Aix64-ben a wchar_t már 32-bites.
- A hozzászóláshoz be kell jelentkezni
Hát a wchar_t egy érdekes történelmi állatfaj. Ez 16 bites lett elsőre, feleslegesnek tűnt a 4 byte elcseszése.
Több programozási nyelvnél okozott fejfájást, amikor a unicode 16 bit fölé hízott. De hát kell bele a piros alma 🍎 sőt a zöld alma 🍏 karakter is.
- A hozzászóláshoz be kell jelentkezni
Mondjuk az Unicode megoldotta ezt már (surrogate pair használata, maradhat a w_char_t 16-bit)
- A hozzászóláshoz be kell jelentkezni
Jaja, az kb pont annyira minosegi ganyolas es tkp dobhatod ki az egesz wchar_t koncepciot akkor, mert strlen() != wchar_t darabszam. Szoval ugyanott vagy, komplexitasban, mintha kb UTF8-as strlen()-t implementalnal, ellenben kozehuztal meg egy reteget teljesen feleslegesen. Akkor meg minek szopni az egesz short alapu wchar-os kretenseggel?
- A hozzászóláshoz be kell jelentkezni
Igazából a wchar_t nem kell unikód legyen, például EBCDIC platformon fogalmam sincs mi van a wchar_t-ben, valószínűnek tartom, hogy a 8 bites EBCDIC-kód mellett 8 bit nulla.
- A hozzászóláshoz be kell jelentkezni
Viszont a wchar_t-nak van saját hossz-függvénye wcslen() néven.
"Share what you know. Learn what you don't."
- A hozzászóláshoz be kell jelentkezni
Mivel az strlen() bemeneti típusa const char* és nem const wchar_t*, ezért nem is lenne használható, helyette van megfelelője, a wcslen().
Miért gondoltad, hogy az strlen()-nek működnie kéne más típusú bemeneti adatra? Ilyen erővel működnie kéne const uint8_t*-ra is. Viszont megsúgom, sehol nincs leírva, hogy a char típusnak pontosan 8 bitesnek kell lennie . CHAR_BIT hosszúnak kell lennie, a gépi legkisebb címezhető egység méretének, de legalább 8 bitnek.
- A hozzászóláshoz be kell jelentkezni
Miért gondoltad, hogy az strlen()-nek működnie kéne más típusú bemeneti adatra?
Persze, ebben tokeletesen igazad van. De nem is erre gondoltam gondolt a kolto pontosan. Hanem ugye mi is volt lett a gyakorlatban:
- 8 bitet (vagy CHAR_BIT-et, mindegy) meghalado code pointok megjelentek - nyilvan, mert sok nyelv, nyelvekben sok betu, ez kell.
- stlren() jellegu fuggvenyek, (es barataik, uzletfeleik) nem fognak mukodni, mert nem tudjuk faek egyszeru megszamolni: encoding szimbolumok szama != code pointok szama
- oke, bevezetjuk a wchar_t, hogy megszamolhassuk egyszeruen, hogy a fenti egyenloseg igaz legyen
- ja, azzal sem tudjuk mert a/ tulleptuk a code pointok szamaval b/ kicsi a tipus c/ mindketto
- de sebaj, biztos jo ez igy, mert mar ket adattipus is letezik ami ezt nem tudja az elemi "szamoljuk meg" muveletet, pl egy tombre vagy barmilyen linearis adatstrukturara!
Szoval nekem inkabb ez a fenntartasom ezzel az egesz wchar_t-vel. Es akkor a topiknyito kollega ennek valamifele aspektusaba belefut, merthat milyen jo is ez. Biztos egy bizottsag tervezte.
- A hozzászóláshoz be kell jelentkezni
Csak simán régebbi, mint az unikód, szóval a szabvány csak annyit mond róla, hogy 'hát a wchar_t, az bizony valami, vagy legalábbis lesz valami'
Ettől függetlenül az utf8 (vagy utf32) sem annyira egyszerű, mint hinnénk, pl. ez itt milyen hosszú (és milyen mértékegységben mérve): ю́ (cyrillic small letter yu with acute)? (forrás: http://utf8everywhere.org/)
- A hozzászóláshoz be kell jelentkezni
Pontosan 1 karakter, 2 code point és kódolástól függő számú byte. Lehet, hogy a jövőben majd 1 code point lesz belőle, ki tudja. Nehéz dolog az emberi írást modellezni az informatika eszközeivel. Mint ahogy nehéz a lakcímeket is modellezni, a dátumokat és naptárrendszereket, a neveket, és nagyon sok minden más emberi dolgot. Az emberek nem rigid struktúrákban működő lények, a gépek meg igen, a kettő között kell valahogy áthidalást alkotnunk.
- A hozzászóláshoz be kell jelentkezni
A wcslen miért ne működne? Megszámolja, hogy hány karakterből áll a megadott wchart_t*.
Az meg miért is probléma, hogy a kódolt byte-ok száma nem egyezik meg a karakterek számával? A karakter totál más absztrakció, mint a byte.
A wcslen() megmondja a karakterek számát, az strelen() meg a byte-ok számát, amennyiben wchart_t*-t adsz neki paraméterül. Melyik elemi "számoljuk meg" műveletet nem tudja a standard library? Mindkét absztrakció megszámolására van benne művelet.
- A hozzászóláshoz be kell jelentkezni
Jó, hát a strlen ilyen kontextusban nem használható, ettől függetlenül érdemes lenne kimérni, hogy az olyan platformokon, ahol a wchar_t 16-bites, ott a wcslen UTF-16 vagy UCS-2 szerint jár-e el. Tesztadat: 🍔
- A hozzászóláshoz be kell jelentkezni
Az meg miért is probléma, hogy a kódolt byte-ok száma nem egyezik meg a karakterek számával?
Hogy a byteok szama nem egyezik meg az nyilvan nem baj, de hogy csinalsz egy szarmaztatott tipust, nyilvan azert hogy egyszerusitse az eletet (indexelhetoseg, linearis darabszam, barmi), es meg az sem tudja ezt akkor minek...? Beleteszem akkor egy void*-ba vagy `typedef whatever* string`-be a karakterlancot, oszt megszamoltatom, annyi.
Ha azt mondanank hogy a wchar_t egy olyan tipus ami "minden, codepage altal tamogatott karakter bele kell ferjen", akkor vagy tul sok lesz a felfeher terhes ferfi a karaktersorzatban es jon az unexpected exception, vagy sima linearis cimzest csinalsz es jo vagy. De ez a "surrogate pair" az annyira egy ganyolt taknyolas (vagy taknyolt ganyolas) ebbe az egeszbe, hogy mar akkor igen hamar felmerul a kerdes bennem hogy "oke, szep meg jo, de minek?".
De lehet hogy csak en foglalkozom tul sok ilyesmivel kritikusabb mukodtetesu beagyazott rendszeres barmikben, oszt emiatt magasak az elvarasok :]
- A hozzászóláshoz be kell jelentkezni
Senki nem mondta neked, hogy a wchar_t nem lenne jó erre, ugyanis lehet akár 64 bit széles is, és simán elfér benne minden Unicode code point.
"Ha azt mondanank hogy a wchar_t egy olyan tipus ami "minden, codepage altal tamogatott karakter bele kell ferjen""
Ez így aluldefiniált. Milyen codepage? A programonként egyedileg használt input/output kódolási formátum miért lenne hatással egy programnyelv típusdefiníciójára?
A surrogate pair pont azért van, mert túl sokan építettek arra, hogy a wchar_t az mindig 16 bit, hogy kellett erre egy workaround. Mint ahogy a Java char is 16 bites csak, meg a Pascal WideChar is. Illetve azért építettek erre, mert az Unicode 1.0 ezt definiálta - nem volt eléggé absztrakt még. Az egész surrogate pair az amiatt van, hogy az Unicode 2.0+ visszafelé kompatibilis legyen az Unicode 1.0-val.
Mondhatnánk, hogy a wchar_t egy olyan absztrakció legyen, amibe belefér 1 Unicode code point, nem specifikálva a hogyant (a bitmintára való kódolást - mivel abból sok van).
Lineárisan mit akarsz címezni? Karaktereket? Byte-okat?
- A hozzászóláshoz be kell jelentkezni