Перевернуть строку, содержащую символы ASCII и символы не-ASCII - PullRequest
2 голосов
/ 30 августа 2011

У меня возникла проблема с обращением строки, содержащей этот 'abcd 汉字 efg'.

str_to_reverse = "abcd汉字efg"; /* those non-ASCII chars are Chinese characters, each of them takes 2 bytes */

после реверсии, должно быть:

str_toreverse = "gfe字汉dcba";

Я думал, чтобыперевернуть строку, я должен идентифицировать эти не-ASCII-символы, потому что я думаю, что простое обращение каждого байта не даст правильного ответа.

Как я могу это сделать?

PS: Янаписал эту программу под Ubuntu, 32-bit.затем я распечатал каждый байт:

for(i = 0; i < strlen(s); i++)
    printf("%c", s[i]);

Вместо «汉字» я получил немного бессмысленного текста.

Ответы [ 2 ]

4 голосов
/ 30 августа 2011

Чистый ответ C89:

#include <stdlib.h>
#include <stdio.h>
#include <locale.h>
#include <string.h>

int main()
{
    char const* str;
    size_t slen;
    char* rev;

    setlocale(LC_ALL, "");
    str = "abcd汉字efg";
    printf("%s\n", str);
    slen = strlen(str);
    rev = malloc(slen+1)+slen;
    *--rev = '\0';
    while (*str != '\0') {
        int clen, i;
        clen = mblen(str, slen);
        if (clen == -1) {
            fprintf(stderr, "Bad encoding\n");
            return EXIT_FAILURE;
        }
        for (i = 0; i < clen; ++i) {
            *--rev = str[clen-1-i];
        }
        str += clen;
    }
    printf("%s\n", rev);
    return 0;
}
3 голосов
/ 30 августа 2011

Если строка закодирована как utf8, это довольно просто. Вы можете получить длину правильно сформированных utf8 последовательностей, проверяя только первый байт.

В первом проходе вы изменяете только utf8 "подпоследовательности" (те, у которых длина> 1) За второй проход вы переворачиваете всю строку. Вуаля.

...