LINUX.ORG.RU

strcasestr + utf8


0

0

Привет! есть проблема. программа работает с классическими строками (char*) в utf8. strcasestr (поиск подстроки без чувствительности к регистру) не работает в ситуации с русскими буквами значение LANG=ru_RU.UTF-8

не принесло желаемых результатов и locale_t l=newlocale(LC_ALL,"ru_RU.UTF-8",NULL); printf("%d\n",strncasecmp_l("ПРивет, мир!","ПРИВЕТ",6,l));

подскажите, плиз, решение!

anonymous

Судя по коду glibc, strcasestr вообще не умеет с UTF-8 работать.

А если так:

[tmp]# cat ppp.c #include <stdio.h> #include <locale.h> #include <strings.h> #include <wchar.h> int mstrncmp(char* s1, char* s2, int n) { wchar_t w1[n],w2[n]; mbstate_t st; int i;

memset(&st, 0, sizeof(st)); mbsrtowcs(w1, &s1, n, &st); for (i=0; i<n; i++) printf("%lx ", w1[i]); printf("\n");

memset(&st, 0, sizeof(st)); mbsrtowcs(w2, &s2, n, &st); for (i=0; i<n; i++) printf("%lx ", w2[i]); printf("\n");

return wcsncasecmp(w1, w2, n); }

main() { setlocale(LC_ALL, ""); printf("%d\n", mstrncmp("Привет всем", "привет всем", 6)); printf("%d\n", mstrncmp("Привет всем", "ривет всем", 6)); return 0; } [tmp]# gcc ppp.c ppp.c: In function &#8216;mstrncmp&#8217;: ppp.c:10: warning: incompatible implicit declaration of built-in function &#8216;memset&#8217; ppp.c:11: warning: passing argument 2 of &#8216;mbsrtowcs&#8217; from incompatible pointer type ppp.c:15: warning: passing argument 2 of &#8216;mbsrtowcs&#8217; from incompatible pointer type [tmp]# ./a.out 41f 440 438 432 435 442 43f 440 438 432 435 442 0 41f 440 438 432 435 442 440 438 432 435 442 20 -1

anonymous
()

Судя по коду glibc, strcasestr вообще не умеет с UTF-8 работать.

А если так:

[tmp]# cat ppp.c #include <stdio.h> #include <locale.h> #include <strings.h> #include <wchar.h> int mstrncmp(char* s1, char* s2, int n) { wchar_t w1[n],w2[n]; mbstate_t st; int i;

memset(&st, 0, sizeof(st)); mbsrtowcs(w1, &s1, n, &st); for (i=0; i<n; i++) printf("%lx ", w1[i]); printf("\n");

memset(&st, 0, sizeof(st)); mbsrtowcs(w2, &s2, n, &st); for (i=0; i<n; i++) printf("%lx ", w2[i]); printf("\n");

return wcsncasecmp(w1, w2, n); }

main() { setlocale(LC_ALL, ""); printf("%d\n", mstrncmp("Привет всем", "привет всем", 6)); printf("%d\n", mstrncmp("Привет всем", "ривет всем", 6)); return 0; } [tmp]# gcc ppp.c ppp.c: In function &#8216;mstrncmp&#8217;: ppp.c:10: warning: incompatible implicit declaration of built-in function &#8216;memset&#8217; ppp.c:11: warning: passing argument 2 of &#8216;mbsrtowcs&#8217; from incompatible pointer type ppp.c:15: warning: passing argument 2 of &#8216;mbsrtowcs&#8217; from incompatible pointer type [tmp]# ./a.out 41f 440 438 432 435 442 43f 440 438 432 435 442 0 41f 440 438 432 435 442 440 438 432 435 442 20 -1

anonymous
()

Судя по коду glibc, strcasestr вообще не умеет с UTF-8 работать.

А если так:

[tmp]# cat ppp.c
#include <stdio.h>
#include <locale.h>
#include <strings.h>
#include <wchar.h>
int mstrncmp(char* s1, char* s2, int n) {
    wchar_t w1[n],w2[n];
    mbstate_t st;
    int i;

    memset(&st, 0, sizeof(st));
    mbsrtowcs(w1, &s1, n, &st);
    for (i=0; i<n; i++) printf("%lx ", w1[i]); printf("\n");

    memset(&st, 0, sizeof(st));
    mbsrtowcs(w2, &s2, n, &st);
    for (i=0; i<n; i++) printf("%lx ", w2[i]); printf("\n");

    return wcsncasecmp(w1, w2, n);
}

main() {
    setlocale(LC_ALL, "");
    printf("%d\n", mstrncmp("Привет всем", "привет всем", 6));
    printf("%d\n", mstrncmp("Привет всем", "ривет всем", 6));
    return 0;
}
[tmp]# gcc ppp.c
ppp.c: In function &#8216;mstrncmp&#8217;:
ppp.c:10: warning: incompatible implicit declaration of built-in function &#8216;memset&#8217;
ppp.c:11: warning: passing argument 2 of &#8216;mbsrtowcs&#8217; from incompatible pointer type
ppp.c:15: warning: passing argument 2 of &#8216;mbsrtowcs&#8217; from incompatible pointer type
[tmp]# ./a.out
41f 440 438 432 435 442
43f 440 438 432 435 442
0
41f 440 438 432 435 442
440 438 432 435 442 20
-1


P.S. пардон за форматирование

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.