nixp.ru v3.0

19 октября 2017,
четверг,
21:17:12 MSK

DevOps с компанией «Флант»
Аватар пользователя Steck
Steck написал 17 ноября 2005 года в 05:02 (783 просмотра) Ведет себя как мужчина; открыл 124 темы в форуме, оставил 549 комментариев на сайте.

Народ есть функция:

unsigned char *pdu_str(unsigned char *src){
 static iconv_t cd;
char *to, *to_p;
unsigned char *dest="";
size_t ucs2_len,to_len;
int i;
cd = iconv_open("UCS-2","UTF-8");
if(cd == (iconv_t)-1){
printf("iconv_open()\n");
exit(0);
}
ucs2_len = strlen(src);
to_len = (ucs2_len*2);
to = malloc(to_len);
to_p = to;
if(iconv(cd,(const char **)&src,&ucs2_len,&to,&to_len)==(size_t)-1)
{
printf("iconv()\n");
exit(0);
}
iconv_close(cd);
for(i=0;i<=to_len;i++){
dest=g_strdup_printf("%s%02X",dest,to_p[i]);
}
return dest;
}

Дело в том что в dest оказываються НЕ ВСЕ символы. Обрезаються последние 1-6 символов!

Где трабла подскажите? Если вместо to_len вставить strlen(to_p) то в dest оказывается еще меньше символов.

Вообщем хелп!! Уже три дня бьюсь!

rgo

а ты уверен что strlen корректно работает с ucs2 строками?

Steck
rgo
а ты уверен что strlen корректно работает с ucs2 строками?

Там у меня strlen не работает с ucs2. С utf-8.

Там все нормально

rgo

ах, да-да, чой-то я невнимательно посмотрел. По-моему ты неправильно выясняешь длину результата — to_len; После всех манипуляций с iconv там ведь должно лежать количество свободных байт в to, а не количество занятых байт.

Steck

Вроде как я понял в iconv() в ucs2_len будет уменьшаться в to_len уверичиватся

Те перекодирует по одному символу из src в to уменьшая кол-во в ucs2_len и увеличивая to_len.

Но что то у меня не то.

Смс приходят урезанные на несколько символов ;o(

anonymous
Steck
Вроде как я понял в iconv() в ucs2_len будет уменьшаться в to_len уверичиватся

Те перекодирует по одному символу из src в to уменьшая кол-во в ucs2_len и увеличивая to_len.

Но что то у меня не то.

оба *len уменьшаются. Они представляют собой количество свободых байт в буферах. Всё сделано для того, чтобы можно было много раз последовательно вызывать iconv. Исправляя какие-то ошибки, например, заменяя неперекодируемые символы какими-нибудь последовательностями типа \x1234.

см. info Libc «Character Set Handling» «Generic Charset Conversion»

Steck

Спасибо за эти строки! Все разрулил Ж-)

rgo

и чего всё-таки ему надо…

есть

#include 
#include 
#include 
#include 
int main ()
{
      iconv_t icnv = iconv_open ("UTF-16", "koi8-r");
      char *ib = "фыва";
      int ibl = strlen (ib);
      int obl = (ibl + 1) * sizeof (uint16_t);
      uint16_t outbuf[ibl+1];
      char *ob = (char*)outbuf;
        outbuf[ibl] = 0;
      if (icnv == (iconv_t) -1) {
            perror ("iconv_open:");
            return 1;
      }
      iconv (icnv, &ib, &ibl, &ob, &obl);
      printf ("ibl = %d, obl = %d\n", ibl, obl);
      for (obl = 0; obl < (sizeof (outbuf)) / sizeof (uint16_t); obl ++) {
            printf ("\\u%u", (unsigned)outbuf[obl]);
      }
      printf ("\n");
      return 0;
}

так вот, странность в том, что он мне выводит:

ibl = 0, obl = 0
\u65279\u1092\u1099\u1074\u1072

Меня очень интересует первое значение, то есть `\u65279\′. Зачем iconv его туда кладёт?