发信人: 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]
|
|