日期:2014-05-19  浏览次数:20688 次

求助用Base64解决中文乱码问题
我JSP页面用的是UTF-8,数据库用的是US7ASCII (Oracle数据库不能修改数据库表,用文件名作主键)
后台我用java自带的Base64编码工具对文件名进行加密,文件名从数据库中取出来,经过转码后(ISO8859-1->GBK),无乱码
JSP页面显示如:http://localhost:8080/<project_name>?filename=<文件名的Base64编码>
点击链接通过后台的Action类处理,将<文件名的Base64编码>进行解码,用System.out.println输出无乱码
但将解码后的文件名转换成US7ASCII编码出问题(GBK->ISO8859-1),主要是不能在数据库中查到明显存在的数据
经过大量测试,某些文件名(包含中文)又可以
不知道是不是Base64编码底层加密/解密所用的字符编码造成的?又木有高手能帮小弟解决这个问题,在此先谢过,在线等哦

------解决方案--------------------
LZ是指保存到数据库中的中文名是乱码还是哪个环节乱码?
程序中GBK->ISO8859-1,程序看到的是乱码这点应该可以理解的,因为ISO8859-1编码就不支持多字节字符
如果是数据库,可以CONVERT(char, dest_char_set [,source_char_set] )测试一下看看能不能表示正常,如
select CONVERT(xxx, 'ZHS16GBK' ) from yyy; 

------解决方案--------------------
楼主是要在数据库编码和gbk编码之间转换吗? 那不要选用ISO8859-1作为中转,ISO8859-1不能正常显示中文。

楼主分真多,又来一个相同的帖。
------解决方案--------------------
<<<<但将解码后的文件名转换成US7ASCII编码出问题(GBK->ISO8859-1)

如果问题是指存入数据库后是乱码,先检查下上述转换过程中 源字节数组能否以GBK还原成正常汉字。
------解决方案--------------------
按理也不应该有乱码,主要是不能在数据库中查到明显存在的数据,此句何解
------解决方案--------------------
探讨
但将解码后的文件名转换成US7ASCII编码出问题(GBK->ISO8859-1),主要是不能在数据库中查到明显存在的数据
经过大量测试,某些文件名(包含中文)又可以

------解决方案--------------------
数据库用的是US7ASCII
在存入数据库时,这要看你是从什么字符集到US7ASCII编码(?->US7ASCII).

但将解码后的文件名转换成US7ASCII编码出问题(GBK->ISO8859-1)
在查询的时候,如果你希望将查询条件编码成US7ASCII,必须和存入时采取同样的编码过程。

Java code
new String("用户".getBytes("?"), "iso8859-1");