LINUX.ORG.RU

C++/Странная работа iconv


0

1

привет всем жителям сайта.
Появилась проблема с iconv.Есть следующее:

void convert( char *from, size_t fromsize, const char* fromCharset, const char* toCharset ) {
size_t s1 = fromsize;
size_t s2 = fromsize;

printf( «fromLen = %d\n», strlen( from ) );
printf( «from = %s\n\n», from );

iconv_t d = iconv_open( toCharset, fromCharset );
iconv( d, &from, &s1, &from, &s2 );

printf( «fromLen = %d\n», strlen( from ) );
printf( «from = %s\n\n», from );

iconv_close( d );
}

int main() {
char *prt = new char[ 1000 ];
....
здесь prt заполняется строкой запроса из браузера (POST /...)
iconv( prt, strlen(prt), «UTF-8», CP1251" );
printf( «prt = %s\n», prt );

return 0;
}


На экране следующее...
fromLen = 888;
from = POST /....

fromLen = x; ( произвольный размер или 0 )
from = абра кадабра или 0

prt = POST /... но в конце не хватает символов, когда 5 штук, когда 3, в общем каждый раз по разному


С чем это может быть связано, кто уже сталкивался с этим делом.. И если есть аналоги то посоветуйте...

во первых нельзя один и тот же буфер использовать, а во вторых внимательно почитай «man 3 iconv»

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

я описался,конечно же там convert,но проблема не решена...

energyclab
() автор топика
Ответ на: комментарий от s0L

эта функция работала уже пару месяцев...если делать два разных буфера ситуация не изменилась,после перекодировки размер и содержимое всегда нулевые,иногда бывают забиты грязью

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

> что значит указатели сдвигаются?

ICONV(3): The iconv() function … for each character conversion … it increments *outbuf and decrements *outbytesleft by the number of converted output bytes

Это значит, что данная функция изменяет значение аргументов. И после её работы inbuf и outbuf будут указывать за пределы строки, а значит перед вызовом функции надо сохранить указатель на начало строки, а после вызова восстановить значение.

kim-roader ★★
()
Ответ на: комментарий от kim-roader

ок, понял что надо сделать, а тогда почему в ячейке размера все равно 0 пишется или иногда что то другое, но чаще всего 0

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

эта функция работала уже пару месяцев.

если она даже работала, это не значит, что написано правильно и что ничего не портилось. читай ман, там все предельно ясно написано.

вот, пример тебе накатал, как надо юзать либу

std::string convert(const std::string& str, iconv_t conv)
{
	iconv(conv, 0, 0, 0, 0);

	const size_t buffer_size = 512;  
	char out[buffer_size];
	
	const char* in_buf = str.c_str();
	size_t in_size = str.size();
	
	std::string result;
	
	while (in_size > 0)
	{
		char* out_buf = out;
		size_t out_size = buffer_size;
	
		int n = iconv(conv, &in_buf, &in_size, &out_buf, &out_size);
		if (n < 0)
		{
			if (errno != E2BIG) break;
		}
		result.append(out, buffer_size - out_size);
	}
	
	return result;
}
s0L
()
Ответ на: комментарий от energyclab

>ок, понял что надо сделать, а тогда почему в ячейке размера все равно 0 пишется

ну и чего ты понял тогда? тебе же написал человек «it increments *outbuf and decrements *outbytesleft by the number of converted output bytes »

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