ASCII è un set di caratteri a 7 bit. In C normalmente rappresentato da un char a 8 bit. Se il bit più alto in un byte da 8 bit è impostato, è non un carattere ASCII.
is_alpha = (c > 0x40 && c < 0x5b) || (c > 0x60 && c < 0x7b);
Invece si dovrà utilizzare ctype.h
e dire :
isalpha(c);
Unica eccezione, per quanto ne so, è per i numeri, sulla maggior parte dei tavoli, almeno, hanno valori contigui.
Così funziona;
char ninec = '9';
char eightc = '8';
int nine = ninec - '0';
int eight = eightc - '0';
printf("%d\n", nine);
printf("%d\n", eight);
Ma questo non è garantito per essere 'a':
alhpa_a = 0x61;
Systems non basata su ASCII, vale a dire utilizzando EBCDIC; C su una piattaforma di questo tipo funziona ancora bene ma qui (per lo più) usano 8 bit anziché 7 e cioè A
può essere codificato come decimale 193
e non 65
come in ASCII.
Per ASCII tuttavia; byte con decimale 128 - 255, (8 bit in uso), è esteso e non parte del set ASCII. Cioè ISO-8859 utilizza questo intervallo.
Cosa viene spesso fatto; è anche quello di combinare due o più byte con un carattere. Quindi se si stampano due byte uno dopo l'altro definito come, utf80xc3 0x98
== Ø, si otterrà questo carattere.
Questo dipende ancora una volta su quale ambiente ci si trova. In molte valori ASCII di stampa sistemi/ambienti di dare lo stesso risultato attraverso i set di caratteri, sistemi ecc Ma la stampa byte> 127 o doppi caratteri byted dà un risultato diverso a seconda della configurazione locale.
Ie:
signor A esecuzione programma ottiene
JASN €
Mentre il signor B ottiene
Jasπß
Questo è forse particolarmente rilevante per la ISO-8859 series e Windows-1252 di rappresentazione a byte singolo di caratteri estesi, ecc.
- UTF-8#Codepage_layout, in UTF-8 si dispone di ASCII, allora avete sequenze speciali di addii.
- Ogni sequenza inizia con un byte> 127 (che è ultimo byte ASCII),
- seguito da un certo numero di byte che tutti inizia con i bit
10
.
- In altre parole, non si troverà mai un byte ASCII in una rappresentazione UTF-8 multi-byte.
che è; il primo byte in UTF-8, se non ASCII, indica quanti byte ha questo personaggio. Si potrebbe anche dire che i caratteri ASCII dicono che non seguono più byte - perché il bit più alto è 0.
cioè se il file interpretata come UTF-8:
fgetc(c);
if c < 128, 0x80, then ASCII
if c == 194, 0xC2, then one more byte follow, interpret to symbol
if c == 226, 0xE2, then two more byte follows, interpret to symbol
...
Come esempio. Se guardiamo uno dei personaggi che menzioni. Se in un terminale UTF-8:
$ echo -n "č" | xxd
dovrebbe produrre:
0000000: c48d ..
In altre parole "C" viene rappresentato dalle due bytes 0xC4 e 0x8D. Aggiungi -b al comando xxd e otteniamo la rappresentazione binaria dei byte. Noi li sezionare come segue:
___ byte 1 ___ ___ byte 2 ___
| | | |
0xc4 : 1100 0100 0x8d : 1000 1101
| |
| +-- all "follow" bytes starts with 10, rest: 00 1101
|
+ 11 -> 2 bits set = two byte symbol, the "bits set" sequence
end with 0. (here 3 bits are used 110) : rest 0 0100
Rest bits combined: xxx0 0100 xx00 1101 => 00100001101
\____/ \_____/
| |
| +--- From last byte
+------------ From first byte
Questo ci danno: 00100001101 = 269 = 0x10D => Uncode codepoint U + 010D == "C".
Questo numero può essere utilizzato anche in HTML come č
== č
comune per questo e un sacco di altri sistemi di codifica è che un byte di 8 bit è la base.
Spesso è anche una domanda sul contesto. Prendiamo ad esempio GSM SMS, con ETSI GSM 03.38/03.40 (3GPP TS 23.038, 3GPP 23038). Troviamo anche una tabella di caratteri a 7 bit, alfabeto predefinito GSM a 7 bit, ma invece di archiviarli come 8 bit vengono memorizzati come 7 bit . In questo modo puoi impacchettare più personaggi in un determinato numero di byte. Cioè SMS 160 caratteri standard diventa 1280 bit o 160 byte come ASCII e 1120 o 140 byte come SMS.
1 Non senza eccezione, (è più per la storia).
I.e. un semplice esempio di byte salvati come settetti (7 bit) C8329BFD06 in formato SMS UDP in ASCII:
_________
7 bit UDP represented | +--- Alphas has same bits as ASCII
as 8 bit hex '0.......'
C8329BFDBEBEE56C32 1100100 d * Prev last 6 bits + pp 1
| | | | | | | | +- 00 110010 -> 1101100 l * Prev last 7 bits
| | | | | | | +--- 0 1101100 -> 1110010 r * Prev 7 + 0 bits
| | | | | | +----- 1110010 1 -> 1101111 o * Last 1 + prev 6
| | | | | +------- 101111 10 -> 1010111 W * Last 2 + prev 5
| | | | +--------- 10111 110 -> 1101111 o * Last 3 + prev 4
| | | +----------- 1111 1101 -> 1101100 l * Last 4 + prev 3
| | +------------- 100 11011 -> 1101100 l * Last 5 + prev 2
| +--------------- 00 110010 -> 1100101 e * Last 6 + prev 1
+----------------- 1 1001000 -> 1001000 H * Last 7 bits
'------'
|
+----- GSM Table as binary
e 9 byte "spacchettato" diventa 10 caratteri.
Non sono proprio i caratteri, sono i byte ottenuti con 'getchar()'. Ogni carattere è codificato come una sequenza di byte. –
Questi sono caratteri relativamente normali. Prova ad ampliare la tua immaginazione per includere, ad esempio, alcune lettere cinesi o giapponesi. Oppure prova Cyrillic per un cambiamento :) Ecco "Ciao" in russo per te: "Привет". – dasblinkenlight
@DanielFischer Capisco, che 'getchar()' lo decodifica in byte (s). Ma già non capisco, in che modo i byte possono essere conservati nel tipo di dati 'char', che dovrebbe essere _one_ byte. –