Unicode - dove sbaglio

di il
29 risposte

29 Risposte - Pagina 2

  • Re: Unicode - dove sbaglio

    deckard ha scritto:


    Ciao +m2+,
    quale sarebbe l'assunto a cui ti riferisci? Questa volta faccio fatica a seguire il tuo ragionamento.
    Che i caratteri siano in Unicode, credo di saperlo, so anche che esistono alcune varianti. Con questo non voglio affermare che sono un maestro sul tema. Mi pare che tutti i miei post si siano proprio concentrati sulla codifica, non sul contenuto.

    Infine, quando dici, "Se ti do un file e non sai se è un jpg, bmp o gif o magari un mp3 non ti sorprendi se non lo visualizzi." dici il una cosa da un punto di vista logico non del tutto corretta, in sé hai messo un piccola contraddizione. Se mi dai un file jpg, bmp, o gif stai presumendo e non è difficile desumerne il suo formato.

    Un saluto e grazie comunque.
    L'assunto é un carattere un byte.
    Se ti do un file, cioè una sequenza si byte, senza dirti che cosa è, voglio proprio vedere come 'facilmente' ne desumi il formato.

    Il punto è che bisognerebbe sapere cosa è e non è unicode.
    Che non è una codifica dei caratteri.
    Le codifiche non sono unicode.
    È il testo non è composto da caratteri (inteso come char da 1 byte).

    Esattamente come un flusso x di byte può essere interpretato come un jpg o un mp3, allo stesso modo al flusso del testo devi e sottolineo devi conoscere il formato.
    Con questa informazione puoi interpretare correttamente ed evitare i caratteri strani.
    Ho telefono non ho voglia di scrivere pippone, lo davo per scontato.
    Cribbio ma non si insegna nulla?
  • Re: Unicode - dove sbaglio

    willy55" post_id="8623568" time="1554150675 ha scritto:


    i, le applicazioni devono utilizzare Unicode, come UTF-8 o UTF-16,
    Ma assolutamente NO.
    Ecco perché poi saltano fuori i problemi, tocca partire dalle basi.
    Che in realtà sono semplici, ma ci vogliono idee chiarissime
  • Re: Unicode - dove sbaglio

    Ciao nicolap,
    rileggiti cosa è stato scritto sui file jpg, bmp, gif...
    Inoltre, sugli Unicode rispondevo a un'affermazione....
    Bah mi pare che in questo thread ha smarrito qualcosa.
  • Re: Unicode - dove sbaglio

    Ciao willy55,
    grazie per le fonti...

    Leggo
  • Re: Unicode - dove sbaglio

    +m2+ ha scritto:


    L'assunto é un carattere un byte.
    Se ti do un file, cioè una sequenza si byte, senza dirti che cosa è, voglio proprio vedere come 'facilmente' ne desumi il formato.

    Il punto è che bisognerebbe sapere cosa è e non è unicode.
    Che non è una codifica dei caratteri.
    Le codifiche non sono unicode.
    È il testo non è composto da caratteri (inteso come char da 1 byte).

    Esattamente come un flusso x di byte può essere interpretato come un jpg o un mp3, allo stesso modo al flusso del testo devi e sottolineo devi conoscere il formato.
    Con questa informazione puoi interpretare correttamente ed evitare i caratteri strani.
    Ho telefono non ho voglia di scrivere pippone, lo davo per scontato.
    Cribbio ma non si insegna nulla?
    Perdonami, se insegnare significa usare certi "metodi" allora sì, sono d'accordo non si insegna niente. A logica, perdonami, ma continui a peccare. Come fai a non accorgerti che il tuo esempio iniziale è logicamente mal posto, proprio non capisco.

    Unicode non è una codifica per insiemi di caratteri?

    Grazie mille, prenderò le fonti adeguate e ripasserò le mie lacune. Come scrissi qualche post fa, so di non sapere. Cerco di vivere in ogni ambito della vita in modo socratico.

    Un saluto
  • Re: Unicode - dove sbaglio

    deckard ha scritto:


    Ciao nicolap,
    rileggiti cosa è stato scritto sui file jpg, bmp, gif...
    Inoltre, sugli Unicode rispondevo a un'affermazione....
    Bah mi pare che in questo thread ha smarrito qualcosa.
    Se ti riferisci a me dubito di aver 'smarrito' qualcosa, anche perché in concreto scrivo programmi sa una vita senza alcun problema di gestione del testo.
    La questione dal punto di vista della idea è : a nessun frega nulla di come codifichi Unicode (che non è una codifica), puoi anche avere rappresentazioni interne ed esterne diverse.
    Esattamente come puoi avere una immagine vettoriale che puoi esportare in formato vettoriale, o anche raster.
    Nel momento in cui vuoi mandare in output, o elaborare in input, un testo, chi lo riceve o te lo invia deve specificare la codifica.
    Esattamente come accade per i formati grafici.

    Perché accade questo? Perché la vecchia equivalenza 1 carattere = 1 byte non esiste più.

    Quindi puoi tenere un testo internamente come postscript, se ti pare, poi in output fare ASCII 7 bit, per una email.
    O UTF-8 per un browser. O UTF-16 per un contatore.
    O sticazzi.

    Analogamente la stessa sequenza di byte puoi interpretarla come un testo inglese, o russo, o cinese, a seconda della codifica.
    Come fai a sapere la codifica?
    Non la sai. Spesso è inglobata nel testo stesso es HTML.
    Questi sono i fatti, se poi vogliamo riferirci a teorie Wikipedia o sticazzi va benissimo, ecco che escono i caratteri strani
  • Re: Unicode - dove sbaglio

    deckard ha scritto:



    Unicode non è una codifica per insiemi di caratteri?
    ma assolutamente NO, non lo è, sarà la quarta volta che lo scrivo
    Come già detto se non si conosce il perché e il percome si va a casaccio
  • Re: Unicode - dove sbaglio

    +m2+ ha scritto:


    ma assolutamente NO, non lo è, sarà la quarta volta che lo scrivo
    Come già detto se non si conosce il perché e il percome si va a casaccio
    +m2+ ti ringrazio evidentemente sul tema come hai sottolineato ho da studiare. Del resto è così da sempre in tutte le cose.
    Probabilmente a suo tempo quando ho letto unicode.org o ho preso fischi per fiaschi o ricordo bene poco.

    Io nel post in buona sintesi mi chiedevo se input e output non stessero parlando la sua lingua... Evidente che in merito le idee non mi sono chiare, e in qualche modo starò procedendo anche a casaccio. COme ti dicevo stavo seguendo un percorso, questa era una parentesi che mi si era posta casualmente e che probabilmente avrei dovuto scontrarmi più avanti.

    Sottolineo ancor con più forza nelle mia mente che sarà un argomento che dovrò riprendere a studiare dalle fonti.

    Un saluto e grazie ancora.
  • Re: Unicode - dove sbaglio

    Puoi immaginare Unicode come note musicali, e utf-8,ascii e sticazzi come mp3, wav e flac
    Se trovo il tempo vado con lo spiegone, cioè l'unico modo giusto mentre tutti gli altri son sbagliati, ma sono abbastanza carico.
    Prima o poi
  • Re: Unicode - dove sbaglio

    deckard ha scritto:


    Ciao nicolap,
    rileggiti cosa è stato scritto sui file jpg, bmp, gif...
    Inoltre, sugli Unicode rispondevo a un'affermazione....
    Bah mi pare che in questo thread ha smarrito qualcosa.
    Qua, se qualcuno ha bisogno di rileggere, non sono io!
    (indovina cosa c'è nel tuo boccale )


    PS: mi raccomando, non prendere mai sul personale le risposte. Soprattutto quelle molto sintetiche!
  • Re: Unicode - dove sbaglio

    Tocca partire dall'inizio
    Prima domanda: esistono i caratteri, dentro i computer?
  • Re: Unicode - dove sbaglio

    L'evoluzione di come rappresentare un carattere e' stata abbondantemente travagliata.

    Senza andare troppo indietro nel tempo e troppo nel dettaglio, inizialmente c'era l'ASCII (American Standard for Information Interchange, @+m2+ LO SO che c'era anche l'EBCDIC, il BCD, per ora semplifichiamo) e il carattere era rappresentato da un'unico byte.

    Ma l'ASCII non prevedeva le accentate e i caratteri "strani" presenti nelle varie lingue, per non parlare di tutte quelle lingue che non hanno i caratteri come i nostri.

    Quindi si sono inventati il "Code Page" che CONTIENE l'ASCII nelle prime 128 posizioni e i caratteri "strani" nelle rimanenti 128.
    Se vogliamo andare nel nettaglio, i primi 32 caratteri dell'ASCII sono caratteri di "controllo" usati per mandare a nuova linea/nuova pagina le stampanti. Ma questa e' un'altra storia (i casini con "\n", "\r", "\r\n", "\n\r" che dipendono dal sistema operativo e le relative conversioni automatiche fatte da software come l'FTP, sono all'ordine del giorno)

    Ma questo non risolve il problema se uno deve scrivere in piu' lingue nello stesso momento.

    Quindi si sono inventati l'UNICODE, in cui i carattei NON SONO RAPPRESENTATI DA UN BYTE ma da DUE BYTE (16 bit)
    Poi l'unicode lo hanno esteso ed ora un carattere e' rappresentato da QUATTRO BYTE (32 bit)

    https://en.wikipedia.org/wiki/Unicod

    Ma per compatibilita' all'indietro, ed anche per mantenerne l'efficienza rappresentativa, sono state definite diverse codifiche per rappresentare i caratteri con sequenze di uno o piu' byte: da qui' l'UTF-8.

    Giusto come nota: il "char" del C/C++ e' di UN BYTE e le funzioni di Windows che accettano caratteri di 1 byte sono quelle che finiscono con la "A"

    Se i caratteri vengono rappresentati direttamente da DUE byte, il wchar_t (wide char) del C, allora si usa la codifica UTF-16. Le funzioni di WIndows che accettano i caratteri di 2 byte sono quelle che finiscono con "W"

    Quando si compila con Visual Studio, ad esempio, gia' in fase di definizione del progetto si deve decidere se si vuole un'applicazione in formato UNICODE o normale. E sono definite tutta una serie di macro (e ' il festival delle macro ) per poter scrivere del codice che NON DIPENDE dalla dimensione del caratterei. Ad esempio il main di un'applicazione C non si scrive "main", ma "_tmain" e il carattere non e' "char" o "wchar_t" ma "TCHAR", e poi ci si perde

    In Java, ad esempio, i caratteri sono di 2 byte, NON di 1

    E questo e' anche uno dei motivi per cui E' IMPORTANTE mettere l'header nei file XML:
    
    <?xml version="1.0" encoding="UTF-8"?>
    
    e nel file HTML
    
    <meta charset="UTF-8"> 
    
    e ASSICURARSI di generare TUTTE le parti della pagina CON LO STESSO ENCODING, visto che al momento non mi risulta sia possibile comporre la pagina HTML con parti che usano encoding diversi. E questa e' la fonte dei casini degli HTML-isti

    Inizialmente sembrava che 65000 caratteri fossero sufficienti, poi ci si e' accorti che non bastavano e come conseguenza sono stati portati a 32bit, Ma non e' detto che un domani, con l'arrivo degli alieni (per ora c'e' il Klingon ), non servano piu' di 4 miliardi di caratteri diversi, portando il char a 64 bit.

    https://www.evertype.com/standards/csur/klingon.htm

    Da cui l'esistenza di diverse codifiche: UTF-8: si cerca di rappresentare tutti i caratteri con un'unico byte, oppure si usano sequenze di 2,3,4 byte, per i caratteri "strani". UTF16/UTF32 stessa idea dell'UTF-8 ma con caratteri rappresentati da 2 o 4 byte.

    Quindi, se per @+m2+ la questione della codifica e' facile, beato lui, perche' per uno che e' alle prime armi, invece, la cosa non e' cosi' "banale".

    Si, e' assolutamente vero che ragionare SEMPRE in UNICODE non ha senso.
    Ma la possiamo mettrere in un'altro modo: non serve ragionare in termini di nessuna codifica fintanto che le codifiche di default non presentano problemi.
    In caso di problem, BISOGNA andare nel dettaglio, e un modo potrebbe essree quello di DECIDERE un' encoding ed assicurararsi che tutti capiscano quell'encoding. SE l'ecoding e' UNICODE in formato UTF8, o UTF16 o UTF32 o un'altro encoding o una Code Page, dipende, ovviamente, da tutte le parti coninvolte.

    In mancanza di riferimenti, una possibile soluzione e', appunto, dire: l'UNICODE e' il mio riferimento, l'encoding che scelgo e' l'UTF8, ed ora vediamo che succede!

    @+m2+ c'e' di peggio: dentro i computer ci sono i bug

    https://cdn0.tnwcdn.com/wp-content/blogs.dir/1/files/2013/09/bug.jpg
    https://ids.si.edu/ids/deliveryService?id=NMAH-92-1313
  • Re: Unicode - dove sbaglio

    Non ci allarghiamo.
    la risposta è no.
    i computer non elaborano caratteri.
    non esiste il concetto di carattere.
    esistono solo i bit e diciamo i byte.

    Sembra considerazione banale, ma è la base di tutto e va tenuta in considerazione.

    Quindi prima cosa da spazzare via come in Matrix : i caratteri NON esistono.

    Seconda osservazione: cosa è e non è unicode

    A seguire le implicazioni
  • Re: Unicode - dove sbaglio

    Per informazioni sullo standard Unicode (implementato dal Unicode Consortium ove le diverse aziende partecipanti al consorzio erano interessate alla interoperabilità nel trattamento informatico dei testi in diverse lingue) si può vedere il relativo sito:
    http://www.unicode.org/standard/standard.htm
    http://www.unicode.org/standard/translations/italian.html

    Nei vari rilasci (del consorzio Unicode) sono stati integrati standard che venivano gestiti da altri organismi come l'ISO (International Organization for Standardization)
    https://www.unicode.org/alloc/ISOStages.htm
    https://www.unicode.org/faq/unicode_iso.htm
    https://unicode.org/Public/MAPPINGS/ISO8859

    Negli algoritmi di codifica, dei caratteri Unicode, si sono implementate delle Unicode Transformation Format (UTF) che assumono le sigle (in base al numero di bit interessati) UTF-8 e UTF-16, le quali usano una rappresentazione dei dati a lunghezza variabile, mentre UTF-32 a lunghezza fissa.
    http://unicode.org/faq/utf_bom.htm
    https://naveenr.net/unicode-character-set-and-utf-8-utf-16-utf-32-encoding/
    http://webgamecafe.com/questions/8275/le-codifiche-unicode-utf-8-utf-16-e-utf-32-differiscono-nel-numero-di-caratteri-che-possono-memorizzare
    https://www.quora.com/What-are-UTF-8-UTF-16-and-UTF-3
    http://www.linkas.it/docs/unicode_e_UTF-8_v1_5Uni.htm
  • Re: Unicode - dove sbaglio

    Ritengo che la questione vada inquadrata nel modo giusto, più che caterve di link spesso scritti male o comunque pressochè inutili.

    Prima cosa
    : carattere <> byte. E' proprio la primissima cosa da dimenticare.
    Nasce per motivi storici, e troverete tutti i link del mondo su IBM, EBCDIC, ASCII etc.
    Tutti pressochè inutili nel nostro caso.

    Seconda cosa.
    Cos'è unicode, e cosa non è.

    Una funzione iniettiva e (teoricamente) biiettiva tra lettere (o glifi, o simboli) e code point.
    Basta, niente di più.

    Siccome è difficile definire cosa sia una lettera, non la si definisce, si suppone sia un concetto già definito, assiomatico (ovviamente, non lo è). Ma sono problemi dei linguisti.

    Così come sono problemi dei linguisti i casi in cui le lettere cambino a seconda di dove si trovano (non tutte le lingue sono simili alla nostra), sempre problemi dei linguisti.

    Abbiamo quindi le lettere (che non si sa bene cosa siano, ma vabbè), che formano quindi gli alfabeti.
    Ad ognuna di esse è associato un numero esadecimale, il code point, specificato come U+X

    Attenzione: per inciso non è detto che il code point sia limitato a lunghezza 4, quindi 64K

    Terza cosa: non esistono i caratteri nei computer.
    Elaborano solo numeri, bit e byte.
    Come spero ormai sia chiaro una stringa unicode non è altro che una sequenza di code point, cioè... numeri interi.

    Quarta cosa: la rappresentazione di unicode
    Cioè la CODIFICA.
    Esattamente come possiamo pensare ai code point come le "note" di una musica, esse possono materialmente essere conservate in vari modi, es. MP3, o wav.
    Sono due codifiche diverse della stessa musica (tralasciamo per semplicità che MP3 è lossy).
    Il punto è che ad una certa stringa Unicode, cioè ad una sequenza di lettere, posso associare TUTTE le codifiche che mi pare.
    UTF-8, ASCII, sticazzi
    Ottenendo sequenze di bit DIVERSE le quali rappresentano LA STESSA STRINGA.
    Si pensi che so a una immagine BMP salvata in PNG (di nuovo tralasciamo compressione lossy etc, cribbio è un esempio didattico!).
    L'immagine è la stessa, ma il file completamente diverso.

    Quinta cosa: gli indiani piccoli e quelli grossi.
    Come sa bene chi si occupa di assembly non è affatto detto che la medesima sequenza numerica (qualsiasi essa sia) venga memorizzata nello stesso identico modo da processori diversi, per la questione del little e big endian.
    La dò per scontata, suppongo di non dover proprio fare anche uno schema di CPU.
    Cosa significa? Significa che nel mondo "giusto" esiste una sequenza magica di caratteri che stabilisce se Unicode sarà codificato in little o big endian (255 e 254), quando si usano codifiche a lunghezza fissa, tipo UCS-2 (c'è anche quella a 4 byte, in teoria).
    Chiaro? per me, sì.

    Sesta cosa: utf
    Bene, ora sappiamo cos'è e cosa non è unicode.
    Ma come lo memorizziamo in concreto?
    Visto che oggi ho da fare accenno solo a utf-8, perchè ho letto una caterva di minchiate, poi magari farò gli altri.

    E' semplicemente una codifica a lunghezza variabile, da 1 a SEI (sei) byte.
    Qualcuno mi dirà che ha letto 4, ma è questa la differenza tra chi utilizza in concreto quello che legge, e chi si limita a compulsare, ma vabbè.
    Non è importante, è importante capire che è una sorta di "zippatore" di Unicode per una rappresentazione compatta.
    La proprietà interessante è che per un sottoinsieme coincide con ASCII, ma qui davvero dovrei spiegare bene come funziona.
    Oppure leggetevi uno dei tanti link.
    Di nuovo: la cosa importante da ricordare è che si tratta di una codifica a lunghezza variabile (provate voi a fare --), quindi adatta essenzialmente per il ++

    Settima cosa: la più importante.
    Spero si inizi a capire che data una stringa (cioè una sequenza di byte, perchè i computer elaborano numeri, e non caratteri, remember?) non conoscendone la codifica non si va da nessuna parte.
    Esattamente come la sequenza binaria (uso esadecimale per comodità) AABB potrebbe essere i voti inglesi presi da un alunno (A, A, B, B), oppure un numero esadecimale, oppure la matricola del cibo per gatti.
    Come faccio a capire cos'è?
    Semplice, non posso farlo

    Ottava cosa: esplicito e per tentativi.
    Bene, come si fa allora a capire la codifica di una stringa, per poterla decodificare, se non possiamo dirlo dalla stringa stessa?
    In due modi
    (1) scrivendolo da qualche parte. E qui partirà (forse) il pippone su HTML/EML (Content-Type) e XML (sì, agenzia delle entrate, parlo delle tue fatture elettroniche dimmerda)
    (2) per tentativi.
    Ebbene sì, è normalissimo che i programmi (es. browser, esempio notepad++) provino "a casaccio" a capire se il testo è codificato ASCII, utf-8 o sticazzi.
    Come? Provando le varie codifiche e cercando di capire, euristicamente, se il testo sembra avere un senso.
    Ovviamente troverete 1000 esempi su internet di stringhe che in ASCII-italiano vogliono dire qualcosa, mentre in utf-8 felino tutt'altro, pur AVENDO LA STESSA RAPPRESENTAZIONE BINARIA.

    Immaginate di avere un certo file su disco che, visualizzato come BMP, è un gatto, mentre interpretato come PNG è un cane.
    E' quindi un gatto o un cane, che volevo rappresentare?

    Spesso i programmi hanno proprio un comando del tipo "reinterpreta tutto come fosse utf-8 felino.
    Vi eravate mai chiesti il perchè di questi elenchi?
    Adesso (forse) lo sapete.

    Nona: dentro e fuori.
    Ecco perchè è normalissimo mantenere una rappresentazione INTERNA delle stringhe in un certo formato, spesso UCS-2 (che spero si capisca NON è unicode, è un MODO per rappresentare le stringhe unicode con 2 byte, col problema dei piccoli indiani).
    Come Windows ad esempio (è il w).
    Perchè lo si fa? Semplice, per il --
    Comunque, ormai penso sia chiaro che DENTRO il programma posso mantenere il formato che mi pare, POI a un certo momento, in output, dovrò usare una certa codifica (ASCII, UTF, sticazzi).
    Esattamente come il mio programma può mantenere in memoria un'immagine come gli pare ma poi, al salvataggio, dovrà conformarsi a uno standard ben preciso (es. JPG, es. PNG), la codifica

    Decimo: un solo modo giusto (il mio, ovviamente), e tutti gli altri son sbagliati.
    Penso si inizi a comprendere che se non si ragiona nel modo giusto (che è uno solo, quello sopra indicato), poi si fa confusione e saltano fuori le faccine.
    Ma la possiamo mettrere in un'altro modo: non serve ragionare in termini di nessuna codifica fintanto che le codifiche di default non presentano problemi.
    La situazione è diametralmente opposta.
    Magari poi spiegherò le faccine e il ? di unicode, per ora tempo esaurito.

    Fine pippone parte I

    PS perdonate se non metto link, ma sono talmente banali che lo lascio per esercizio
Devi accedere o registrarti per scrivere nel forum
29 risposte