Das Neucodieren von Zeichen erfolgt im Allgemeinen, wenn das empfangende System sie nicht verarbeiten kann. Zum Beispiel repräsentiert BASE64 Daten unter Verwendung von 6 Bits (2 6 , also 64) Zeichen, um längere Datensequenzen darzustellen (das manchmal erscheinende "==" am Ende füllt die Ausrichtung auf). Dies liegt daran, dass Ihre Bilddatei in E-Mails möglicherweise 0xFE enthält und Ihr Mailserver diese (oder ein anderes traditionell nicht druckbares Zeichen) nicht zufrieden überträgt.
Es gibt keine Codierung, die "die Größe reduziert". Codierungen sind nur Zuordnungen von Bits zu dem Zeichen, das sie darstellen. Das heißt, ASCII ist ein 7-Bit-Zeichensatz (Codierung), der häufig in 8 Bit Speicherplatz gespeichert wird. Wenn Sie die von Ihnen akzeptierten Bereiche einschränken, können Sie auch die Steuerzeichen aussortieren.
Wenn Sie diese Methode verwenden, müssen Sie die Dinge auf Bitebene ausschreiben, und sie spielt auch ein bisschen mit der Maschinengeschwindigkeit und den Anweisungen, da alle modernen Maschinen Ausrichtungen haben, die ein Vielfaches von 8 Bits sind. Aus diesem Grund ist Unicode beispielsweise UTF-8, UTF-16 und UTF-32.
Wenn Sie dies aus Sicherheitsgründen tun (deshalb haben Sie es auf Security.SE veröffentlicht, oder?), Filtern Sie die Dinge einfach heraus und speichern Sie sie normal. Wenn Sie dies tun, um Platz zu sparen, prüfen Sie, ob der gesamte zusätzliche Code und die langsamere Zugriffszeit (da die meisten Einträge Adressgrenzen überschreiten) die Platzersparnis wert sind.
Im Übrigen ist das Folgende ein Ausschnitt aus einem CS-Kurs, in dem wir ASCII von 8-Bit-Speicher in 7-Bit konvertieren mussten:
memset(dest,0x00,8);
memcpy(dest, source, length);
for (int i = 0; i < 8; i++) {
if (dest[i] & 0x80) {
fprintf(stderr, "%s: %s\n", dest, "Illegal byte sequence");
exit(EILSEQ);
}
}
dest[0] = 0x7F & dest[0] | 0x80 & dest[1] << 7;
dest[1] = 0x3F & dest[1] >> 1 | 0xC0 & dest[2] << 6;
dest[2] = 0x1F & dest[2] >> 2 | 0xE0 & dest[3] << 5;
dest[3] = 0x0F & dest[3] >> 3 | 0xF0 & dest[4] << 4;
dest[4] = 0x07 & dest[4] >> 4 | 0xF8 & dest[5] << 3;
dest[5] = 0x03 & dest[5] >> 5 | 0xFC & dest[6] << 2;
dest[6] = 0x01 & dest[6] >> 6 | 0xFE & dest[7] << 1;
dest[7] = 0x00; //Clearing out