Ich habe eine Zeichenfolge, die sowohl Mandarin und englische Wörter in UTF-8 enthält:wie eine chinesische Wörter und Englisch Wörter Mischung Zeichenfolge in c Sprache auszuschneiden
char *str = "你a好测b试";
Wenn Sie strlen(str)
verwenden, wird es 14 zurückkehren , weil jedes Mandarinzeichen drei Bytes verwendet, während jedes englische Zeichen nur ein Byte verwendet.
Jetzt möchte ich die am weitesten links 4 Zeichen ("你a好测"
) kopieren, und am Ende "..."
anhängen, um "你a好测..."
zu geben.
Wenn der Text in einer Single-Byte-Codierung ist, kann ich nur schreiben:
strncpy(buf, str, 4);
strcat(buf, "...");
Aber 4 Zeichen in UTF-8 ist nicht unbedingt 4 Byte. In diesem Beispiel sind es 13 Bytes: jeweils drei für 你
, 好
und 测
und eine für a
. Also, für diesen speziellen Fall würde ich
strncpy(buf, str, 13);
strcat(buf, "...");
brauche Wenn ich einen falschen Wert für die Länge hatte, habe ich einen gebrochenen UTF-8-Stream mit einem unvollständigen Charakter erzeugen konnte. Offensichtlich möchte ich das vermeiden.
Wie kann ich die richtige Anzahl von zu kopierenden Bytes berechnen, entsprechend einer bestimmten Anzahl von Zeichen?
ich nehme an, Sie eine UTF-8-Codierung haben, nicht wahr? –
Wollte auf "你 a 好 测" schneiden? mit einem Buchstaben a? – Danh
Was sind Ihre Kriterien für den Schneideplatz? Sie möchten eine definierte Anzahl von gültigen Codepunkte (in richtig darstellbaren Glyphen umgewandelt werden) nach links, dann der Rest ist drei-Punkte-and-a-null-Zeichen? Oder hat etwas mit dem Vorhandensein von Nicht-Multibyte-Zeichen zu tun? Oder was? –