From: <lu...@xy...> - 2004-11-08 11:19:48
|
sorry,I am a jackaroo sorry for my bad english fixed multibyte characters filename problem on redirected disk only changed rdp.c it converts the characters between unicode-16 and user codeset(LC_ALL or LC_CTYPE) Index: rdp.c =================================================================== RCS file: /cvsroot/rdesktop/rdesktop/rdp.c,v retrieving revision 1.72 diff -r1.72 rdp.c 20a21 > 21a23,25 > #include <langinfo.h> > #include <locale.h> > #include <iconv.h> 138a143,181 > > > const char * > rdp_get_codeset(){ > static char initflag = 0, codeset_str[30] = "UTF-8"; > char * str; > if(initflag == 0){ > setlocale(LC_ALL, ""); > if((str = nl_langinfo(CODESET)) != NULL && str[0] != '\0'){ > snprintf(codeset_str,sizeof(codeset_str),"%s",str); > for( str = codeset_str ; *str ; str++ ){ > if(*str >= 'a' && *str <= 'z') > *str -= ('a'-'A'); > } > } > initflag = 1; > } > return codeset_str; > } > > > > int > rdp_proc_iconv(char *sstr,int slen,char *dstr,int dlen,const char * in,const char * to){ > char *sbuff = sstr, *dbuff = dstr; > size_t sslen = slen,ddlen = dlen; > iconv_t convfd; > > if((convfd = iconv_open (to, in)) == (iconv_t) -1){ > perror("iconv_open"); > return -1; > } > if(iconv(convfd, &sbuff, &sslen, &dbuff, &ddlen) == (size_t)-1) > perror("iocnv"); > > iconv_close(convfd); > return (dlen - ddlen); > } > 139a183 > 142,144c186,190 < { < int i = 0, j = 0; < --- > { > char buf[256],*b; > int n, i = 0, j = 0; > b = buf; > memset(b,0,sizeof(buf)); 146,150c192,197 < < while (i < len) < { < s->p[i++] = string[j++]; < s->p[i++] = 0; --- > if((n = rdp_proc_iconv(string,len/2,b,sizeof(buf),rdp_get_codeset(),"UTF-16LE")) > 0){ > if((unsigned char)b[0] == 0xff && (unsigned char)b[1] == 0xfe){ > n -= 2; > b += 2; > } > memcpy(s->p,b,n); 152c199,205 < --- > else{ > while (i < len) > { > s->p[i++] = string[j++]; > s->p[i++] = 0; > } > } 155a209 > 163,168c217,222 < int i = 0; < < while (i < uni_len / 2) < { < in_uint8a(s, &string[i++], 1); < in_uint8s(s, 1); --- > char buf[256]; > int n,i = 0; > memset(buf,0,sizeof(buf)); > if((n = rdp_proc_iconv(s->p,uni_len,buf,sizeof(buf),"UTF-16LE",rdp_get_codeset()))>0){ > memcpy(string,buf,n + 1); > i = n + 1; 170c224,231 < --- > else{ > while (i < uni_len / 2) > { > in_uint8a(s, &string[i++], 1); > in_uint8s(s, 1); > } > } > s->p += uni_len; |
From: Michael G. <mi...@ge...> - 2004-11-16 10:27:56
|
Hello, On Mon, Nov 08, 2004 at 07:14:27PM +0800, lu...@xy... wrote: > fixed multibyte characters filename problem on redirected disk > only changed rdp.c > it converts the characters between unicode-16 and user codeset(LC_ALL or > LC_CTYPE) Thanks for your work, I hope I'll find time this week to look at it and integrate it into rdesktop cvs. Thanks, Michael |