как получить символы из строки utf8 - PullRequest
0 голосов
/ 23 декабря 2011
char *w = "Artîsté";
printf("%lu\n", strlen(w));
int z;
for(z=0; z<strlen(w); z++){
    //printf("%c", w[z]);  //prints as expected
    printf("%i: %c\n", z, w[z]);//doesn't print anything
}

Если я запускаю это, он падает на î. Как напечатать многобайтовый символ и как узнать, когда я нажал многобайтовый символ?

Ответы [ 2 ]

1 голос
/ 23 декабря 2011

Использование широких символов и многобайтовых функций:

int utf8len(char *str)
{
    char *top=str+strlen(str);
    int len;
    for(len=0; str<top; len++)
        str+=mblen(str, top-str);
    return len;
}

int main()
{
    setlocale(LC_ALL, "en_US.utf8");
    char *w = "Artîsté";
    printf("%lu\n", strlen(w));

    int z, len = utf8len(w);
    wchar_t wstr[len+1];
    mbstowcs(wstr, w, len);
    for(z=0; z<len; z++)
        printf("%i: %lc\n", z, wstr[z]);
}

Вам повезло с первым printf, потому что вы никогда не меняли данные, после разделения символов ваш вывод уже не был utf8.

1 голос
/ 23 декабря 2011

Если ваша среда выполнения использует UTF-8 (например, Linux), ваш код будет работать как есть, если вы установите подходящую локаль, как в setlocale(LC_ALL, "en_US.utf9"); до вызова этого printf.

demo: http://ideone.com/zFUYM

В противном случае, вам лучше всего конвертировать в широкую строку и распечатать ее.Если вы планируете делать что-то отличное от ввода-вывода с отдельными символами этой строки, вам все равно придется это делать.

Что касается нажатия на многобайтовый символ, переносимый способ проверить это, если mblen()возвращает значение больше 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...