Ich weiß, ich kann vorwärts durchlaufen durch eine Multibyte-String, in C, mit mbrtowc(). Was aber, wenn ich rückwärts iterieren wollte? oder mit anderen Worten, wie finde ich das vorherige gültige Multibyte-Zeichen. Ich habe versucht, die folgende Methode und es zumindest teilweise funktioniert auf meinem Ubuntu-System der Standard-en_US.UTF-8-Locale verwenden:Iterating rückwärts Multibyte String - C
char *str = "\xc2\xa2\xc2\xa1xyzwxfd\xc2\xa9", *tmp = NULL;
wchar_t wc = 0;
size_t ret = 0, width = 1;
mbstate_t state = {0};
//Iterate through 2 characters using mbrtowc()
tmp = str;
tmp += mbrtowc(&wc, tmp, MB_CUR_MAX, &state);
tmp += mbrtowc(&wc, tmp, MB_CUR_MAX, &state);
//This is a simplified version of my code. I didnt test this
//exact code but this general idea did work.
for(tmp--; (ret = mbrtowc(&wc, tmp, width, &state)) == (size_t)(-1) || ret == (size_t)(-2); width++, tmp--)
if(width == MB_CUR_MAX) printf("error\n");
printf("last multibyte character %lc\n", wc);
Die Idee ist einfach nur durchläuft nach hinten durch ein Byte, bis wir ein gültiges Multibyte-Zeichen finden als definiert durch mbrtowc(). Meine Frage ist, kann ich darauf verlassen, dass dies für jedes mögliche Multibyte-Gebietsschema funktioniert oder nur mit speziellen Eigenschaften kodiert. Genauer gesagt wird mbstate_t falsch verwendet; Ich meine, könnte die Richtungsänderung die Gültigkeit von mbstate_t beeinflussen? Kann ich garantieren, dass "ret" nur (size_t) (- 1) oder (size_t) (- 2) sein wird, weil ich derzeit davon ausgehe, dass "ret" sowohl von den Definitionen für unvollständige als auch von ungültigen Multibyte-Zeichen abhängig sein könnte .
Wenn Sie positiv sind, müssen Sie nur UTF8-Strings verarbeiten, dann: das erste Byte von * any * UTF8-Sequenz ist einzigartig. – usr2564301
Bei Legacy-Doppelbyte-Kodierungen ist es jedoch im Allgemeinen nicht möglich, rückwärts zu iterieren, ohne tatsächlich von Anfang an zu beginnen. –
@RadLexus Danke für den Rat, aber leider kann ich diese Annahme nicht machen. –