Svmmarivm
std::string octetos servat, non litteras, et in textv hodierno littera ab vno ad qvattvor octetos occvpare potest. Haec lectio tria distingvit qvae sermo cottidianvs confvndit: characterem abstractvm, qvem Unicode nvmero designat qvi pvnctvm codicis appellatvr; octetos qvibvs UTF-8 evm codificat; et figvram qvam visorivm pingit. Explicat qvomodo UTF-8 bita pvncti codicis inter svos octetos distribvat, cvr vocabvlvm Hispanicvm «año» (annvs) qvattvor occvpet et qvomodo characteres catenae sine decodificatione nvmerentvr. Deinde ostendit qvae operationes textvm frangant (octetos singillatim invertere, octetos singillatim in maivscvlas vertere, in medio charactere secare), qvae sine vlla cavtione fvngantvr (servare, exscribere, concatenare, qvaerere, scribere) et qvid bibliotheca normalis C++23 non faciat: maivscvlas extra ASCII, ordinem alphabeticvm secvndvm lingvam, normalisationem.
Proposita discendi
- Explicare qvomodo
UTF-8pvnctvm codicis in vno ad qvattvor octetis codificet, et octetos litterae «ñ» manv decodificare. - Magnitvdinem in octetis catenae cvm litteris non ASCII praedicere, vt
"año"(4) vel"programación"(13). - Characteres catenae
UTF-8nvmerare, octetos nvmerando qvi non svnt continvationis, condicione(c & 0xC0) != 0x80. - Operationes agnoscere qvae textvm
UTF-8frangvnt (octetos singillatim invertere,std::toupperper singvlos octetos, in medio charactere secare) et in qvoqve casv decernere qvid faciendvm sit.
Characteres, pvncta codicis et octeti
Tria strata
Lectio Characteres, valores Booleani, conversiones et constantes char vt nvmervm integrvm vnivs octeti praebvit, qvi secvndvm tabvlam ASCII vt littera scribitvr, et monvit 'ñ' in eo non capi; lectio Compilare, exseqvi et configvrare ostendit "año" qvattvor octetos occvpare et consolam ad id scribendvm paravit. Haec lectio explicat cvr. ASCII nvmervm 128 characteribvs attribvit, a 0 ad 127, qvi septem bitis capivntvr: litteris lingvae Anglicae, digitis, signis interpvnctionis et qvibvsdam codicibvs moderationis. Atqvi textvs vervs litteram ñ, accentvs, diaereses, litteras Graecas, ideogrammata Sinica, signa mathematica et pictogrammata (qvae emoji vocantvr) continet, qvae centena milia efficivnt. Ex qvo seqvitvr opvs esse, primvm, tabvla mvlto maiore, deinde modo nvmeros eivs in octetis scribendi.
Tria strata distingvere convenit. Primvm est character abstractvs: littera «ñ minvscvla», nvlla ratione habita qvomodo servetvr avt pingatvr. Unicode est norma qvae cviqve characteri abstracto nvmervm attribvit, eivs pvnctvm codicis, qvod scribitvr U+ cvm saltem qvattvor digitis hexadecimalibvs: «ñ» est U+00F1 (241), «A» est U+0041 (65, idem nvmervs ac in ASCII), «€» est U+20AC (8364). Pvncta codicis a 0 ad U+10FFFF pertinent, pavlo plvs qvam decies centena milia. Secvndvm stratvm est codificatio: regvla qvae qvodqve pvnctvm codicis in consecvtionem octetorvm convertit. UTF-8 est codificatio qva vtvntvr interrete, systemata hodierna et hic cvrsvs. Tertivm stratvm est species: figvra qvam typvs in visorio pingit, qvae ab vno typo ad alivm mvtari potest, charactere non mvtato.
Si ita est, datvm textvale non est textvs donec eivs codificatio nota sit: octeti c3 b1 svnt «ñ» in UTF-8, sed tabvla consolae antiqvae lecti dvo signa svnt nvllam cvm ea rationem habentia, qvod est vitivm qvod lectio 1.4 diagnoscere docvit. Eadem qvaestio, ex compositione docvmentorvm spectata, in lectione «Lingvae et typi» cvrsvs LaTeX ad Scriptionem Academicam apparet.
Octetos videre
Vt octeti catenae videantvr, satis est eam percvrrere: std::string et std::string_view svnt consecvtiones elementorvm char, et circvitvs for per intervallvm octetos eivs singillatim tradit. Ad eos hexadecimaliter scribendos servit specificatio formae {:02x} (dvo digiti hexadecimales, cvm zero a sinistra). Vt cvm {:d} in lectione 2.4, et ex eadem correctione normae anno 2023 adoptata et a GCC 15 adhibita, {:02x} char vt octetvm sine signo scribit. Regvla magni refert, qvia char in GCC svper x86-64 signvm habet: octetvs c3, in int conversvs, est nvmervs , qvem {:02x} scriberet -3d.
#include <print>#include <string_view>// Octeti textvs.// Praecondicio: nvlla.// Postcondicio: versvm scribit cvm text, eivs magnitvdine in octetis et singvlis octetis hexadecimalibvs.void printBytes(std::string_view text){ std::print("{:<4}{}:", text, text.size()); for (const char c : text) { std::print(" {:02x}", c); } std::println("");}int main(){ printBytes("A"); printBytes("ñ"); printBytes("€"); printBytes("😀"); printBytes("año");}A 1: 41ñ 2: c3 b1€ 3: e2 82 ac😀 4: f0 9f 98 80año 4: 61 c3 b1 6fQvisqve versvs textvm, eivs magnitvdinem et octetos ostendit. Character cviqve longitvdini: «A» vnvm octetvm occvpat, «ñ» dvos, «€» tres et pictogramma qvattvor. Vocabvlvm «año» qvattvor octetos occvpat, 61, c3 b1 et 6f, et eivs size() est 4, non 3. Animadvertendvm est «A» esse octetvm 41, evndem ac in ASCII: UTF-8 128 characteres ASCII prorsvs vt ASCII scribit.
Figvra codificationem litterae «ñ» a svmmo ad imvm seqvitvr: pvnctvm codicis, eivs bita, distribvtionem horvm bitorvm et dvos octetos inde ortos, bitis praefixi insignitis.
Demonstratio
«ñ» est pvnctvm codicis
U+00F1, id est .Binarie scribitvr
11110001. Maior est qvam 127 et minor qvam 2048, ita vtUTF-8evm in dvobvs octetis scribat, qvi vndecim bita portant: zeris a sinistra completvr vsqve ad vndecim,00011110001.Vndecim bita in dvos greges distribvvntvr: qvinqve prima,
00011, et sex vltima,110001.Primvs octetvs praefixvm
110fert, qvod characterem dvorvm octetorvm nvntiat, cvi seqvvntvr qvinqve bita primi gregis:11000011. Secvndvs praefixvm10fert, qvod octetvm continvationis notat, cvi seqvvntvr sex bita reliqva:10110001.Hexadecimaliter
1100 0011estc3et1011 0001estb1: dvo octeti qvos programma svperivs pro «ñ» scripsit. Mvtatio basis inter binariam et hexadecimalem, qvaternis bitis, est ea lectionis «Systemata nvmerationis positionalis» cvrsvs Algebra et Geometria I.
Argvmentvm oneratvr…