发信人: mrcloud() 
整理人: wenbobo(2002-12-06 22:50:00), 站内信件
 | 
 
 
【 在 skyice (浪子) 的大作中提到: 】
 : 我的意思也是等他发表了放入精华区,可是又不好明说,呵呵
 : 
 : 【 在 yangcs (老山羊) 的大作中提到: 】
 : : 【 在 skyice (浪子) 的大作中提到: 】
 :    .......
 
 请教:base64编码怎么不能编码中文。  共3篇    讨论区: CLanguage[ C语言]  
 ---------------------------------------------------------------------- ----------
   作 者: hob (小李飞刀) 2000.05.08 转贴 打包 回复  
      在C中,发MAIL时需要进行base64编码,但为何在程序里编码英文都正确,  
 
 带有中文就不行呢,只给我编码最前面的英文,为什么? 
      请高手指点,多谢 
 
 ---------------------------------------------------------------------- ----------
   作 者: mrcloud (ahao) 2000.05.08 修改 删除 转贴 打包 回复  
 【 在 hob (小李飞刀) 的大作中提到: 】 
 
 你把base64的代码贴出来吧. 
 
 ---------------------------------------------------------------------- ----------
   作 者: netbird (火焰和海水) 2000.05.09 转贴 打包 回复  
 
 一定是你的程序有问题啦。base64编码可以对任何二进制数据进行编码,当然包  
 括汉字啦。 
 
 ---------------------------------------------------------------------- ----------
 re:mrcloud(ahao)   base64编码代码,  共2篇    讨论区: CLanguage[ C语言 ] 
 
   作 者: hob (小李飞刀) 2000.05.08 转贴 打包 回复  
 英文可以正确编码,但中文不行。 
 
 unsigned char *base64_encode(const char *str,int length,int *ret_lengt h) 
 {
   static char base64_table[] = 
         { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L',  'M', 
           'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y',  'Z', 
           'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',  'm', 
           'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y',  'z', 
           '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/',  '\0' 
         }; 
   static char base64_pad = '='; 
   const char *current = str; 
   int i = 0; 
   unsigned char *result = (unsigned char *)malloc(((length + 3 - lengt h % 3) * 4 / 3 + 1) * sizeof(char)); 
   while (length > 2) { /* keep going until we have less than 24 bits * / 
     result[i++] = base64_table[current[0] >> 2]; 
     result[i++] = base64_table[((current[0] & 0x03) << 4) + (current[1 ] >> 4)]; 
     result[i++] = base64_table[((current[1] & 0x0f) << 2) + (current[2 ] >> 6)]; 
     result[i++] = base64_table[current[2] & 0x3f]; 
     current += 3; 
     length -= 3; /* we just handle 3 octets of data */ 
   } 
   /* now deal with the tail end of things */ 
   if (length != 0) { 
     result[i++] = base64_table[current[0] >> 2]; 
     if (length > 1) { 
       result[i++] = base64_table[((current[0] & 0x03 ) << 4) + (curren t[1] >> 4)]; 
       result[i++] = base64_table[(current[1] & 0x0f) << 2]; 
       result[i++] = base64_pad; 
     } 
     else { 
       result[i++] = base64_table[(current[0] & 0x03) << 4]; 
       result[i++] = base64_pad; 
       result[i++] = base64_pad; 
     } 
   } 
   if(ret_length) { 
     *ret_length = i; 
   } 
   result[i] = '\0';    //  printf("%s\n",result); 
   return result; 
 } 
 
 ---------------------------------------------------------------------- ----------
   作 者: mrcloud (ahao) 2000.05.08 修改 删除 转贴 打包 回复  
 
 我看了编码没什么问题,可能是你程序其他部分的错误, 
 再说对于base64来说,处理英文和中文并没有本质区别啊? 
 
 ---------------------------------------------------------------------- ----------
 re:mrcloud(ahao)     共2篇    讨论区: CLanguage[ C语言] 
 
   作 者: hob (小李飞刀) 2000.05.08 转贴 打包 回复  
      我开始也这样怀疑,但是后来我只取出了这段代码,用一个字符串来测试,  
 
 英文的就没问题,编码后的字符串长度也正确,可中文的就不行,只编码了最前  
 
 面的英文部分。 
      我想也是从编码角度来讲,中英文应该没什么区别呀,但这究竟是哪里的问  
 
 题呢? 
      我的环境是linux,gcc. 
 
 ---------------------------------------------------------------------- ----------
   作 者: mrcloud (ahao) 2000.05.08 修改 删除 转贴 打包 回复  
 
 我试了,7英文返回4*3=12正确,5中文字返回4*4=16正确。 
 9英文5中文字,返回4*7=28也正确啊? 
 
 是不是你传入的length参数不对? 
 
 ---------------------------------------------------------------------- ----------
 re:mrcloud(ahao)  共2篇    讨论区: CLanguage[ C语言] 
 
   作 者: hob (小李飞刀) 2000.05.09 转贴 打包 回复  
 (也许是我的错,因为这段代码不是我自己写的,我是参考了PHP的源代码, 
 但我用英文当时试了一下,应该是正确的) 
 我又试了一下,我传进一个英文字符串,发现传回的字符串长度和 
 子程序中的第三个指针参数所指的内容是相同的。 
 即:strlen(result)和*ret_length的值相等。 
 但是含中文的字符串的这两个值是不相等的,这是为什么呢? 
 我传进去的两个length值英文和中文都是正确的。返回的*ret_length也 
 是正确的。 
 26英文length=26,*ret_length=36,strlen(result)=36 
 26英文3中文length=32,*ret_length=44,strlen(result)=36 
 难道非要操作系统支持中文不成,没这道理啊。 
 
 ---------------------------------------------------------------------- ----------
   作 者: mrcloud (ahao) 2000.05.09 修改 删除 转贴 打包 回复  
 
 看出来了,代码有问题, 有符号数和无符号数的>>不同,前者高位置1. 
 
 所以改一下: 
 unsigned const char *current = (unsigned const char*)str;  
 
 另:ret_length本来就是用来返回l的,无须再用strlen求. 
 
 ---------------------------------------------------------------------- ----------
 
 
  -- ...我是在黑夜里展翅飞翔的恐怖...
  ※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: branch-1-f30.st]
  | 
 
 
 |