JavaRush /Java Blog /Random-IT /Codifica testo ASCII (Windows 1251, CP866, KOI8-R) e Unic...
articles
Livello 15

Codifica testo ASCII (Windows 1251, CP866, KOI8-R) e Unicode (UTF 8, 16, 32) - come risolvere il problema con i cracker

Pubblicato nel gruppo Random-IT
Oggi parleremo della provenienza dei krakozyabrs su un sito Web e nei programmi, quali codifiche di testo esistono e quali dovrebbero essere utilizzate. Diamo uno sguardo più da vicino alla storia del loro sviluppo, iniziando con l'ASCII di base, così come le sue versioni estese CP866, KOI8-R, Windows 1251 e terminando con le moderne codifiche del consorzio Unicode UTF 16 e 8. Indice Codifica testo ASCII (Windows 1251, CP866, KOI8-R) e Unicode (UTF 8, 16, 32) - come risolvere il problema con i cracker - 1: Ad alcuni, questa informazione potrebbe sembrare superflua, ma sapresti quante domande ricevo specificamente riguardo ai krakozyabrs striscianti (insieme di caratteri illeggibili). Ora avrò l'opportunità di rimandare tutti al testo di questo articolo e di trovare i miei errori. Bene, preparati ad assorbire le informazioni e prova a seguire il flusso della storia.

ASCII: codifica testuale di base per l'alfabeto latino

Lo sviluppo delle codifiche di testo è avvenuto contemporaneamente alla formazione del settore IT e durante questo periodo sono riusciti a subire numerosi cambiamenti. Storicamente tutto è iniziato con l'EBCDIC, piuttosto dissonante nella pronuncia russa, che permetteva di codificare lettere dell'alfabeto latino, numeri arabi e segni di punteggiatura con caratteri di controllo. Tuttavia, il punto di partenza per lo sviluppo delle moderne codifiche di testo dovrebbe essere considerato il famoso ASCII (American Standard Code for Information Interchange, che in russo viene solitamente pronunciato come "ask"). Descrive i primi 128 caratteri più comunemente utilizzati dagli utenti di lingua inglese: lettere latine, numeri arabi e segni di punteggiatura. Questi 128 caratteri descritti in ASCII includevano anche alcuni caratteri di servizio come parentesi, cancelletti, asterischi, ecc. In effetti, puoi vederli tu stesso: Codifica testo ASCII (Windows 1251, CP866, KOI8-R) e Unicode (UTF 8, 16, 32) - come risolvere il problema con i cracker - 2sono questi 128 caratteri della versione originale di ASCII che sono diventati lo standard, e in qualsiasi altra codifica li troverai sicuramente e appariranno in questo ordine. Ma il fatto è che con l'aiuto di un byte di informazioni puoi codificare non 128, ma ben 256 valori diversi (due alla potenza di otto equivalgono a 256), quindi, dopo la versione base di Asuka, un intero sono apparse una serie di codifiche ASCII estese , in cui era possibile, oltre ai 128 caratteri di base, anche essere codificati utilizzando caratteri di codifica nazionali (ad esempio, il russo). Qui probabilmente vale la pena dire qualcosa in più sui sistemi numerici utilizzati nella descrizione. Innanzitutto, come tutti sapete, un computer funziona solo con i numeri del sistema binario, vale a dire con zero e uno (“algebra booleana”, se qualcuno l'ha studiata in un istituto o in una scuola). Un byte è composto da otto bit, ciascuno dei quali rappresenta un due alla potenza di due, partendo da zero e fino a due fino al settimo: Codifica testo ASCII (Windows 1251, CP866, KOI8-R) e Unicode (UTF 8, 16, 32) - come risolvere il problema con i cracker - 3 non è difficile capire che tutte le possibili combinazioni di zero e uno in una tale costruzione possono essere solo 256. Convertire un numero dal sistema binario a quello decimale è abbastanza semplice. Devi solo sommare tutte le potenze di due con quelle sopra di loro. Nel nostro esempio, questo risulta essere 1 (2 alla potenza di zero) più 8 (due alla potenza di 3), più 32 (due alla quinta potenza), più 64 (alla sesta potenza), più 128 (alla settima potenza). Il totale è 233 in notazione decimale. Come puoi vedere, tutto è molto semplice. Ma se osservi attentamente la tabella con i caratteri ASCII, vedrai che sono rappresentati in codifica esadecimale. Ad esempio, "asterisco" corrisponde al numero esadecimale 2A in Aski. Probabilmente sai che nel sistema numerico esadecimale, oltre ai numeri arabi, vengono utilizzate anche le lettere latine dalla A (significa dieci) alla F (significa quindici). Bene, per convertire un numero binario in esadecimalericorrere al seguente semplice metodo. Ogni byte di informazione è diviso in due parti di quattro bit. Quelli. In ogni mezzo byte possono essere codificati solo sedici valori (due alla quarta potenza), che possono essere facilmente rappresentati come numero esadecimale. Inoltre, nella metà sinistra del byte, i gradi dovranno essere contati nuovamente partendo da zero, e non come mostrato nello screenshot. Di conseguenza, otteniamo che il numero E9 è codificato nello screenshot. Spero che il corso del mio ragionamento e la soluzione di questo enigma ti siano stati chiari. Bene, ora continuiamo, appunto, a parlare di codifiche di testo.

Versioni estese delle codifiche Asuka - CP866 e KOI8-R con pseudografia

Quindi abbiamo iniziato a parlare di ASCII, che è stato, per così dire, il punto di partenza per lo sviluppo di tutte le codifiche moderne (Windows 1251, Unicode, UTF 8). Inizialmente conteneva solo 128 caratteri dell'alfabeto latino, numeri arabi e qualcos'altro, ma nella versione estesa è diventato possibile utilizzare tutti i 256 valori che possono essere codificati in un byte di informazioni. Quelli. È diventato possibile aggiungere simboli di lettere della tua lingua ad Aski. Qui dovremo fare ancora una digressione per spiegare perché le codifiche dei testi sono necessarie e perché sono così importanti. I caratteri sullo schermo del tuo computer sono formati sulla base di due cose: insiemi di forme vettoriali (rappresentazioni) di vari caratteri (sono in file con caratteri installati sul tuo computer) e un codice che ti consente di estrarre esattamente quello da questo insieme di forme vettoriali (file font) simbolo che dovrà essere inserito nel posto giusto. È chiaro che i caratteri stessi sono responsabili delle forme vettoriali, ma il sistema operativo e i programmi in esso utilizzati sono responsabili della codifica. Quelli. qualsiasi testo sul tuo computer sarà un insieme di byte, ognuno dei quali codifica un singolo carattere di questo stesso testo. Il programma che visualizza questo testo sullo schermo (editor di testo, browser, ecc.), durante l'analisi del codice, legge la codifica del carattere successivo e cerca la forma vettoriale corrispondente nel file del carattere richiesto, a cui è collegato per visualizzarlo documento di testo. Tutto è semplice e banale. Ciò significa che per codificare qualsiasi carattere di cui abbiamo bisogno (ad esempio, dell'alfabeto nazionale), devono essere soddisfatte due condizioni: la forma vettoriale di questo carattere deve essere nel carattere utilizzato e questo carattere potrebbe essere codificato in codifiche ASCII estese in un byte. Pertanto, ci sono un sacco di tali opzioni. Solo per la codifica dei caratteri della lingua russa, esistono diverse varietà di Aska esteso. Ad esempio, originariamente apparve CP866 , che aveva la capacità di utilizzare caratteri dell'alfabeto russo ed era una versione estesa di ASCII. Cioè, la sua parte superiore coincideva completamente con la versione base di Aska (128 caratteri latini, numeri e altre schifezze), che è presentata nello screenshot appena sopra, ma la parte inferiore della tabella con codifica CP866 aveva l'aspetto indicato nell'immagine screenshot appena sotto e consente di codificare altri 128 caratteri (lettere russe e tutti i tipi di pseudo-grafici): Codifica testo ASCII (Windows 1251, CP866, KOI8-R) e Unicode (UTF 8, 16, 32) - come risolvere il problema con i cracker - 4 Vedi, nella colonna di destra i numeri iniziano con 8, perché i numeri da 0 a 7 si riferiscono alla parte base dell'ASCII (vedi prima schermata). Pertanto, la lettera cirillica “M” in CP866 avrà il codice 9C (si trova all'intersezione della riga corrispondente con 9 e colonna con il numero C nel sistema numerico esadecimale), che può essere scritto in un byte di informazioni e se esiste un carattere adatto con caratteri russi, questa lettera apparirà nel testo senza problemi. Da dove viene questa somma?pseudografica in CP866 ? Il punto è che questa codifica per il testo russo è stata sviluppata in quegli anni difficili in cui i sistemi operativi grafici non erano diffusi come lo sono adesso. E in Dosa e sistemi operativi di testo simili, la pseudografia ha permesso di diversificare almeno in qualche modo la progettazione dei testi, e quindi CP866 e tutti gli altri suoi pari della categoria delle versioni estese di Asuka abbondano in esso. CP866 è stato distribuito da IBM, ma oltre a questo sono state sviluppate numerose codifiche per i caratteri della lingua russa, ad esempio KOI8-R può essere attribuito allo stesso tipo (ASCII esteso) : Codifica testo ASCII (Windows 1251, CP866, KOI8-R) e Unicode (UTF 8, 16, 32) - come risolvere il problema con i cracker - 5il principio del suo funzionamento rimane lo stesso di quello del CP866 descritto poco prima - Ogni carattere di testo è codificato come un singolo byte. Lo screenshot mostra la seconda metà della tabella KOI8-R, perché la prima metà è completamente coerente con l'Asuka di base, come mostrato nel primo screenshot di questo articolo. Tra le caratteristiche della codifica KOI8-R si può notare che le lettere cirilliche nella sua tabella non sono in ordine alfabetico, come avveniva nel CP866. Se guardi il primo screenshot (della parte base, inclusa in tutte le codifiche estese), noterai che in KOI8-R le lettere russe si trovano nelle stesse celle della tabella delle lettere corrispondenti dell'alfabeto latino dalla prima parte della tabella. Ciò è stato fatto per comodità di passare dai caratteri russi a quelli latini scartando solo un bit (due alla settima potenza o 128).

Windows 1251: la versione moderna di ASCII e perché vengono fuori le crepe

L'ulteriore sviluppo delle codifiche dei testi fu dovuto al fatto che i sistemi operativi grafici stavano guadagnando popolarità e la necessità di utilizzare pseudografici in essi scomparve nel tempo. Di conseguenza, nacque un intero gruppo che, in sostanza, erano ancora versioni estese di Asuka (un carattere di testo è codificato con un solo byte di informazione), ma senza l'uso di simboli pseudografici. Appartenevano alle cosiddette codifiche ANSI, sviluppate dall'American Standards Institute. Nel linguaggio comune il nome cirillico veniva utilizzato anche per la versione con supporto alla lingua russa. Un esempio di ciò potrebbe essere Windows 1251 . Differiva favorevolmente dai CP866 e KOI8-R precedentemente utilizzati in quanto il posto dei simboli pseudografici in esso era preso dai simboli mancanti della tipografia russa (ad eccezione dell'accento), nonché dai simboli utilizzati nelle lingue slave vicine a Russo (ucraino, bielorusso, ecc.): Codifica testo ASCII (Windows 1251, CP866, KOI8-R) e Unicode (UTF 8, 16, 32) - come risolvere il problema con i cracker - 6a causa di una tale abbondanza di codifiche della lingua russa, i produttori di caratteri e di software avevano costantemente mal di testa e tu ed io, cari lettori, spesso abbiamo avuto problemi con quegli stessi famigerati bug quando vi è stata confusione con la versione utilizzata nel testo. Molto spesso venivano fuori durante l'invio e la ricezione di messaggi via e-mail, il che comportava la creazione di tabelle di conversione molto complesse, che, di fatto, non potevano risolvere fondamentalmente questo problema, e spesso gli utenti utilizzavano la traslitterazione delle lettere latine per la corrispondenza per evitare le famigerate incomprensioni quando si utilizzano codifiche russe come CP866, KOI8-R o Windows 1251. Infatti, le crepe che appaiono al posto del testo russo erano il risultato di un uso errato della codifica di una determinata lingua, che non corrispondeva a quella in cui è stato originariamente codificato il messaggio di testo. Diciamo che se provi a visualizzare i caratteri codificati utilizzando CP866 utilizzando la tabella dei codici di Windows 1251, verranno fuori questi stessi termini senza senso (un insieme di caratteri senza significato), sostituendo completamente il testo del messaggio. Codifica testo ASCII (Windows 1251, CP866, KOI8-R) e Unicode (UTF 8, 16, 32) - come risolvere il problema con i cracker - 7Una situazione simile si verifica molto spesso quando si creano e si configurano siti Web, forum o blog, quando il testo con caratteri russi viene erroneamente salvato nella codifica sbagliata utilizzata per impostazione predefinita sul sito o nell'editor di testo sbagliato, il che aggiunge un bavaglio invisibile al codice ad occhio nudo. Alla fine, molte persone si sono stancate di questa situazione con molte codifiche e schifezze costantemente striscianti, e sono comparsi i prerequisiti per la creazione di una nuova variante universale che sostituirebbe tutte quelle esistenti e risolverebbe il problema con la comparsa di testi illeggibili . Inoltre, c’era il problema di lingue come il cinese, dove i caratteri linguistici erano molto più di 256.

Unicode: codifiche universali UTF 8, 16 e 32

Queste migliaia di caratteri del gruppo linguistico del sud-est asiatico non potrebbero essere descritti in un byte di informazioni assegnato per la codifica dei caratteri nelle versioni estese di ASCII. Di conseguenza, è stato creato un consorzio chiamato Unicode (Unicode Consortium) con la collaborazione di molti leader del settore IT (quelli che producono software, che codificano hardware, che creano caratteri) interessati all'emergere di una codifica universale del testo. La prima variazione rilasciata sotto gli auspici dell'Unicode Consortium è stata UTF 32 . Il numero nel nome della codifica indica il numero di bit utilizzati per codificare un carattere. 32 bit equivalgono a 4 byte di informazioni che saranno necessarie per codificare un singolo carattere nella nuova codifica universale UTF. Di conseguenza, lo stesso file con testo codificato nella versione estesa ASCII e in UTF-32, in quest'ultimo caso, avrà una dimensione (peso) quattro volte maggiore. Questo è un male, ma ora abbiamo l'opportunità di codificare utilizzando UTF un numero di caratteri pari a due alla trentaduesima potenza ( miliardi di caratteri che copriranno qualsiasi valore veramente necessario con un margine colossale). Ma molti paesi con lingue del gruppo europeo non avevano affatto bisogno di utilizzare un numero così elevato di caratteri nella codifica, tuttavia, quando utilizzavano UTF-32, senza motivo ricevevano un aumento di quattro volte del peso dei documenti di testo, e, di conseguenza, un aumento del volume del traffico Internet e del volume dei dati archiviati. Questo è molto e nessuno può permettersi tali sprechi. Come risultato dello sviluppo di Unicode, è apparso UTF-16 , che ha avuto così tanto successo che è stato adottato per impostazione predefinita come spazio base per tutti i caratteri che utilizziamo. Utilizza due byte per codificare un carattere. Vediamo come appare questa cosa. Nel sistema operativo Windows è possibile seguire il percorso “Start” - “Programmi” - “Accessori” - “Strumenti di sistema” - “Tabella caratteri”. Di conseguenza, si aprirà una tabella con le forme vettoriali di tutti i font installati sul tuo sistema. Se selezioni il set di caratteri Unicode nelle “Opzioni avanzate”, sarai in grado di vedere per ciascun carattere separatamente l'intera gamma di caratteri in esso contenuti. A proposito, facendo clic su uno qualsiasi di essi, puoi vedere il suo codice a due byte in formato UTF-16 , composto da quattro cifre esadecimali: Codifica testo ASCII (Windows 1251, CP866, KOI8-R) e Unicode (UTF 8, 16, 32) - come risolvere il problema con i cracker - 8Quanti caratteri possono essere codificati in UTF-16 utilizzando 16 bit? 65.536 (due alla potenza di sedici), e questo è il numero adottato come spazio base in Unicode. Inoltre, esistevano modi per codificare circa due milioni di caratteri utilizzandolo, ma erano limitati a uno spazio espanso di un milione di caratteri di testo. Ma anche questa versione di successo della codifica Unicode non ha portato molta soddisfazione a chi scriveva, ad esempio, programmi solo in inglese, perché dopo il passaggio dalla versione estesa di ASCII a UTF-16, il peso dei documenti è raddoppiato (un byte per carattere in Aski e due byte per lo stesso carattere in YUTF-16). Proprio per soddisfare tutti e tutto nel consorzio Unicode si è deciso di ideare una codifica a lunghezza variabile . Si chiamava UTF-8. Nonostante gli otto nel nome, in realtà ha una lunghezza variabile, cioè Ogni carattere di testo può essere codificato in una sequenza lunga da uno a sei byte. In pratica UTF-8 utilizza solo l'intervallo da uno a quattro byte, perché oltre i quattro byte di codice non è più nemmeno teoricamente possibile immaginare nulla. Tutti i caratteri latini in esso contenuti sono codificati in un byte, proprio come nel buon vecchio ASCII. Ciò che è interessante notare è che nel caso della codifica solo dell'alfabeto latino, anche quei programmi che non comprendono Unicode leggeranno comunque ciò che è codificato in YTF-8. Cioè, la parte base di Asuka è stata semplicemente trasferita a questa idea del consorzio Unicode. I caratteri cirillici in UTF-8 sono codificati in due byte e, ad esempio, i caratteri georgiani sono codificati in tre byte. L'Unicode Consortium, dopo aver creato UTF 16 e 8, ha risolto il problema principale: ora abbiamo un unico spazio di codice nei nostri caratteri . E ora i loro produttori possono riempirlo solo con forme vettoriali di caratteri di testo in base ai loro punti di forza e capacità. Nella "Tabella dei caratteri" sopra puoi vedere che diversi tipi di carattere supportano diversi numeri di caratteri. Alcuni caratteri ricchi di Unicode possono essere piuttosto pesanti. Ma ora differiscono non per il fatto che sono stati creati per codifiche diverse, ma per il fatto che il produttore dei caratteri ha riempito o meno completamente lo spazio del codice unico con determinate forme vettoriali.

Parole folli invece di lettere russe: come risolverlo

Vediamo ora come appaiono i krakozyabrs al posto del testo o, in altre parole, come viene selezionata la codifica corretta per il testo russo. In realtà, è impostato nel programma in cui crei o modifichi proprio questo testo o codice utilizzando frammenti di testo. Per modificare e creare file di testo, personalmente utilizzo, a mio avviso, un ottimo editor Html e PHP Notepad++ . Tuttavia, può evidenziare la sintassi di centinaia di altri linguaggi di programmazione e markup e ha anche la possibilità di essere esteso utilizzando i plugin. Leggi una recensione dettagliata di questo meraviglioso programma al link fornito. Nel menu in alto di Notepad++ c'è la voce “Codifiche”, dove avrai l'opportunità di convertire un'opzione esistente in quella utilizzata per impostazione predefinita sul tuo sito: Codifica testo ASCII (Windows 1251, CP866, KOI8-R) e Unicode (UTF 8, 16, 32) - come risolvere il problema con i cracker - 9Nel caso di un sito su Joomla 1.5 e versioni successive, come così come nel caso di un blog su WordPress, dovresti evitare l'aspetto Krakozyabrov scegliere l' opzione UTF 8 senza BOM . Qual è il prefisso della distinta base? Il fatto è che quando stavano sviluppando la codifica YUTF-16, per qualche motivo hanno deciso di allegarvi qualcosa come la capacità di scrivere il codice carattere sia in sequenza diretta (ad esempio, 0A15) che al contrario (150A) . E affinché i programmi capissero in quale sequenza leggere i codici, è stato inventato il BOM (Byte Order Mark o, in altre parole, firma), che si esprimeva aggiungendo tre byte aggiuntivi all'inizio dei documenti. Nella codifica UTF-8, nel consorzio Unicode non erano previste distinte base, e quindi l'aggiunta di una firma (quei famigerati tre byte extra all'inizio del documento) impedisce semplicemente ad alcuni programmi di leggere il codice. Pertanto, quando si salvano i file in UTF, dobbiamo sempre selezionare l'opzione senza BOM (senza firma). Quindi, ti proteggerai in anticipo dallo strisciare fuori dai krakozyabrs . Ciò che è degno di nota è che alcuni programmi in Windows non possono farlo (non possono salvare testo in UTF-8 senza una distinta base), ad esempio lo stesso famigerato Blocco note di Windows. Salva il documento in UTF-8, ma aggiunge comunque la firma (tre byte aggiuntivi) all'inizio. Inoltre, questi byte saranno sempre gli stessi: leggi il codice in sequenza diretta. Ma sui server, a causa di questa piccola cosa, può sorgere un problema: verranno fuori dei truffatori. Pertanto, non utilizzare in nessun caso il normale blocco note di Windows.per modificare i documenti sul tuo sito se non vuoi che appaiano crepe. Considero il già citato editor Notepad++ l'opzione migliore e più semplice, che non presenta praticamente inconvenienti e consiste solo di vantaggi. In Notepad++, quando selezioni una codifica, avrai la possibilità di convertire il testo nella codifica UCS-2, che è molto vicina allo standard Unicode. Anche nel Blocco note sarà possibile codificare il testo in ANSI, ad es. per quanto riguarda la lingua russa, si tratterà di Windows 1251, di cui abbiamo già parlato poco sopra, da dove vengono queste informazioni? È registrato nel registro del tuo sistema operativo Windows - quale codifica scegliere nel caso di ANSI, quale scegliere nel caso di OEM (per la lingua russa sarà CP866). Se imposti un'altra lingua predefinita sul tuo computer, queste codifiche verranno sostituite con altre simili della categoria ANSI o OEM per la stessa lingua. Dopo aver salvato il documento in Notepad++ nella codifica che ti serve o aperto il documento dal sito per la modifica, potrai vedere il suo nome nell'angolo in basso a destra dell'editor: Codifica testo ASCII (Windows 1251, CP866, KOI8-R) e Unicode (UTF 8, 16, 32) - come risolvere il problema con i cracker - 10Per evitare confusione , oltre ai passaggi descritti sopra , sarà utile scrivere nel codice sorgente nell'intestazione di tutte le pagine del sito informazioni su questa stessa codifica, in modo che non ci sia confusione sul server o sull'host locale. In generale, tutti i linguaggi di markup ipertestuali tranne Html utilizzano una speciale dichiarazione xml, che specifica la codifica del testo.
<?xml version="1.0" encoding="windows-1251"?>
Prima di analizzare il codice, il browser sa quale versione viene utilizzata e come deve interpretare esattamente i codici dei caratteri di quella lingua. Ma ciò che è degno di nota è che se salvi il documento nell'Unicode predefinito, questa dichiarazione xml può essere omessa (la codifica sarà considerata UTF-8 se non c'è una BOM o UTF-16 se c'è una BOM). Nel caso di un documento HTML, per indicare la codifica viene utilizzato l'elemento Meta , che è posto tra i tag Head di apertura e chiusura:
<head>
...
<meta charset="utf-8">
...
</head>
Questa voce è abbastanza diversa dallo standard Html 4.01, ma è pienamente conforme allo standard Html 5 e verrà compresa correttamente da tutti i browser attualmente utilizzati. In teoria, sarebbe meglio posizionare l'elemento Meta che indica la codifica del documento Html il più in alto possibile nell'intestazione del documento , in modo che nel momento in cui il testo incontra il primo carattere non dell'ANSI di base (che viene sempre letto correttamente e in qualsiasi variazione), il browser dovrebbe già avere informazioni su come interpretare i codici di questi caratteri. Collegamento alla fonte originale: codifica testo ASCII (Windows 1251, CP866, KOI8-R) e Unicode (UTF 8, 16, 32) - come risolvere il problema con i cracker
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION