LINUX.ORG.RU

Pure C and UTF-8


0

2

Как в Сях можно посчитать кол-во utf8-символов в строке (char*) и отрезать первые n символов (utf8 естественно)?

// например дано:
int str_limit = 32;
char str1[] = "длинная как аццкий ад строка символов в utf8";
// нужно получить:
int length = 44;
char str2[] = "длинная как аццкий ад строка сим";

Плюсы (boost, qt, glibmm и т.п.) не предлагать.

> посчитать кол-во utf8-символов в строке

int len = 0;
for (const char *p = str; *p; p++)
	if ((*p & 0xc0) != 0x80)
		++len;

> отрезать первые n символов (utf8 естественно)

char *p = str;
for (int cnt = n + 1; cnt; ++p)
	if ((*p & 0xc0) != 0x80)
		--cnt;
p[-1] = 0;

никаких проверок на валидность и выход за границы строки, ессесно, нет. ну и фрагменты не проверял, так что... ;)

arsi ★★★★★
()
Ответ на: комментарий от d0de-stillhet

а как у нее с производительностью?

хорошо, вообще рекомендую посмотреть на список компаний, которые эту либу используют

shty ★★★★★
()

Сишный аналог rawurlencode

Дабы не создавать еще один топик.
Как бы его (rawurlencode) сделать?
Я конечно могу почитать исходники php, но там всё дико запутанно и непонятно.

// Если кому интересно, я пишу fcgi-приложеньеце, которое будет делаеть то же что и autoindex у nginx, но с рюшками и прочими аяксами
// будет выглядеть приблизительно так http://ompldr.org/vN3dmeA/autoindex.png

d0de-stillhet
() автор топика
Ответ на: Сишный аналог rawurlencode от d0de-stillhet

> Как бы его (rawurlencode) сделать?

rawurlencode

Returns a string in which all non-alphanumeric characters except -_.~ have been replaced with a percent (%) sign followed by two hex digits.

char *dst = outbuf;
for (const char *p = str; *p; p++)
	if (isalnum(*p) || *p == '-' || *p == '_' || *p == '.' || *p == '~')
		*dst++ = *p;
	else
		*dst++ = '%',
		*dst++ = "0123456789ABCDEF"[(*p >> 4) & 15],
		*dst++ = "0123456789ABCDEF"[*p & 15];
*dst = 0;

как-то так ;) никаких проверок переполнения буфера.

arsi ★★★★★
()

Декодер utf-8 пишется за полчаса с отладкой. Открой википедию, ничего сложного там нет.

Reset ★★★★★
()
Ответ на: комментарий от d0de-stillhet

ICU монстроидально. Лучше glib использовать оно меньше и API там гораздо приятней.

Reset ★★★★★
()
Ответ на: комментарий от d0de-stillhet

о! спасибо. вы прям джедай разыменования указателей

//fixed

shty ★★★★★
()

> Pure C

Плюсы (boost, qt, glibmm и т.п.) не предлагать.

Кэп, ты?

PayableOnDeath
()
Ответ на: комментарий от anonymous

wchar_t str[] = L"...";

но суть в другом, результатом работы функции scandir будет массив структур dirent, в которых имена найденных элементов char*.

и да, я уже почти дописал, только сегфолтов и непонятных эффектов полные штаны

d0de-stillhet
() автор топика
Ответ на: комментарий от d0de-stillhet

пока не забыл

# cat /var/www/cgi/Makefile

CFLAGS=-Wall -O2

LIBS=-lfcgi

all: autoindex

autoindex: autoindex.c
        $(CC) $(CFLAGS) autoindex.c -o autoindex ${LIBS}

clean:
        rm -fr autoindex autoindex.exe

# cat /etc/conf.d/spawn-fcgi-autoindex

...
FCGI_SOCKET=/var/run/fcgi/autoindex.sock
FCGI_PORT=
FCGI_PROGRAM=/var/www/cgi/autoindex
FCGI_USER=nobody
FCGI_GROUP="nogroup -M 0777"
...


# cat /etc/nginx/sites/localhost.conf

server {
...
    index index.htm index.html /var/www/cgi/autoindex;
    location ~ autoindex$ {
        fastcgi_pass  unix:/var/run/fcgi/autoindex.sock-1;
        fastcgi_param SCRIPT_FILENAME /var/www/autoindex.php;
        fastcgi_param HIDE_DOTTED     off;
        fastcgi_param ADMIN_EMAIL     root@localhost;
        include       fastcgi_params;
    }
...
}
d0de-stillhet
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.