Moin,
Problem: Ich krieg in C diverse Strings, die in verschiedenen charmaps
abgespeichert sind (die charmap ist mir jeweils bekannt). Die will ich
in einen Buffer mit kleinerer Laenge quetschen, muss also "hinten" etwas
abschneiden. Das wird aber unangenehm, weil bei verschiedenen
Kodierungen ich den String nicht einfach an irgendeinem Byte absaebeln
kann, ohne dass er "kaputt" geht.
Beispiel: Der String "ößäü" verschieden codiert, soll in einen 5 byte
grossen Buffer rein (das 5. byte sollte dann immer die \0 Terminierung
sein):
1 | wk [ ~ ]$ printf "ößäü" | hexdump -C
|
2 | 00000000 c3 b6 c3 9f c3 a4 c3 bc |........|
|
3 | 00000008
|
4 | wk [ ~ ]$ printf "ößäü" | iconv -f UTF-8 -t ISO_6937-2 | hexdump -C
|
5 | 00000000 c8 6f fb c8 61 c8 75 |.o..a.u|
|
6 | 00000007
|
7 | wk [ ~ ]$ printf "ößäü" | iconv -f UTF-8 -t ISO_8859-1 | hexdump -C
|
8 | 00000000 f6 df e4 fc |....|
|
9 | 00000004
|
Also kann ich den, wenn er utf8 ist, zufaellig direkt nach dem 4. byte
abschneiden. Alles gut.
Wenn der ISO_9959-1 ist, ueberhaupt kein Problem, da passt er komplett
in den Buffer.
AAAABER - wenn er ISO_6937-2 ist, muss ich den String schon nach dem 3.
Byte beenden, denn wenn ich das 4. Byte noch mit reinnehme, sind das
nurnoch die Diakritika des ä, also nur "ein halbes" Zeichen. Der String
ist also am Ende nicht mehr komplett.
Da haben doch bestimmt schlaue Leute, die im Gegensatz zu mir, alle
Zeichen in allen Charmaps virtuos beherrschen, irgendeine Funktion
(wahrscheinlich in der glibc, Abteilung iconv oder iconvdata) dafuer
geschrieben - die koennte so aussehen:
1 | size_t tolleFunktion(char * string, size_t maxlen, char * charmap);
|
und mir die Groesse zurueckliefern, die kleinergleich maxlen ist und wo
der String in der Codierung abgeschnitten werden darf.
Gibt's sowas, kennt das wer? Da bin ich doch sicher nicht der Erste mit
so einer Problematik. (Fuer utf8 alleine wuerd' ichs ja noch hinkriegen,
weil der "schoen" aufgebaute Multibytecharacters hat, aber bei allen
anderen Codierungen ist das etwas Aufwand...)
Gruss
WK