Steck
написал 17 ноября 2005 года в 05:02 (1415 просмотров)
Ведет себя
как мужчина; открыл 125 тем в форуме, оставил 550 комментариев на сайте.
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 оказывается еще меньше символов.
Вообщем хелп!! Уже три дня бьюсь!
Последние комментарии
-
OlegL, 17 декабря 2023 года в 15:00 →
Перекличка
21
-
REDkiy, 8 июня 2023 года в 9:09 →
Как «замокать» файл для юниттеста в Python?
2
-
fhunter, 29 ноября 2022 года в 2:09 →
Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt?
6
-
Иванн, 9 апреля 2022 года в 8:31 →
Ассоциация РАСПО провела первое учредительное собрание
1
-
Kiri11.ADV1, 7 марта 2021 года в 12:01 →
Логи catalina.out в TomCat 9 в формате JSON
1
DevOps as a Service from Palark
24/7 SRE & DevOps service to cover all your Kubernetes needs.

а ты уверен что strlen корректно работает с ucs2 строками?
Там у меня strlen не работает с ucs2. С utf-8.
Там все нормально
ах, да-да, чой-то я невнимательно посмотрел. По-моему ты неправильно выясняешь длину результата — to_len; После всех манипуляций с iconv там ведь должно лежать количество свободных байт в to, а не количество занятых байт.
Вроде как я понял в iconv() в ucs2_len будет уменьшаться в to_len уверичиватся
Те перекодирует по одному символу из src в to уменьшая кол-во в ucs2_len и увеличивая to_len.
Но что то у меня не то.
Смс приходят урезанные на несколько символов ;o(
оба *len уменьшаются. Они представляют собой количество свободых байт в буферах. Всё сделано для того, чтобы можно было много раз последовательно вызывать iconv. Исправляя какие-то ошибки, например, заменяя неперекодируемые символы какими-нибудь последовательностями типа \x1234.
см. info Libc «Character Set Handling» «Generic Charset Conversion»
Спасибо за эти строки! Все разрулил Ж-)
и чего всё-таки ему надо…
есть
#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; }так вот, странность в том, что он мне выводит:
Меня очень интересует первое значение, то есть `\u65279\′. Зачем iconv его туда кладёт?