big5-->utf-8 index.jsp中存入MySql数据库
String user=request.getParameter("username");
byte [] bytes=user.getBytes("8859_1");
String username=new String(bytes,"UTF-8"); //此处测试时username为乱码
utf-8-->big5 myindex.jsp页面中获取username属性值
String user=rs.get("username");
byte [] bytes=user.getBytes("8859_1");
String username=new String(bytes,"BIG5"); //此处测试时username为乱码
10 个解决方案
#1
楼主的参数如何获得的?是form提交还是ajax提交?是ie还是ff?
页面和数据库为utf8的情况下:
form提交:后台iso88591转gb后写数据库(IE)iso88591转utf(FF)
ajax提交:统一由iso88591转utf,无视浏览器
------------------
即,传统的form提交,简体和繁体的转码处理方式一样,简体能转对,繁体就没问题
ajax的话要iso转utf
楼主再试试吧,出乱码的原因实在不少,呵呵。
页面和数据库为utf8的情况下:
form提交:后台iso88591转gb后写数据库(IE)iso88591转utf(FF)
ajax提交:统一由iso88591转utf,无视浏览器
------------------
即,传统的form提交,简体和繁体的转码处理方式一样,简体能转对,繁体就没问题
ajax的话要iso转utf
楼主再试试吧,出乱码的原因实在不少,呵呵。
#2
1 页面是BIG5
那么
request.setCharacterEncoding("BIG5");
然后就拿到了 String 了
2 存入MySQL, 设置连接的参数, useUnicode=true&characterEncoding=UTF8
保证保存和读取的都是正确的
最后,为何你的MySQL不能使用BIG5作为默认编码呢?
那么
request.setCharacterEncoding("BIG5");
然后就拿到了 String 了
2 存入MySQL, 设置连接的参数, useUnicode=true&characterEncoding=UTF8
保证保存和读取的都是正确的
最后,为何你的MySQL不能使用BIG5作为默认编码呢?
#3
哦,还少一条:get/post方法也会有区别。有时候url传参需要做url = encodeURL(url)的操作
#4
我的是通过form提交的..而且我的页面里面的中文全都是繁体的而且页面的编码格式为BIG5。。这也是客户的要求,现在主要是从big5的页面提交到utf-8的mysql数据库后,再从mysql数据库中取出来的过程中都好像无法转码.我已测试过了上面的代码好几次都没有转码成功
#5
还忘了。。我们只采用了jsp的技术。没有加入servlet更没有加入SSH框架,现在数据库的设置连接的参数不能修改,只能为utf-8,不然的话就要大面积的修改程序代码.而且我现在只是把form表单元素username的value传到数据库,不存在<a>标签中的那种传值出现乱码的情况.
#6
那请试试老紫竹老大的办法吧。
入库之前做iso转big5的转码,入库前最好也print出来,看看是不是对的
出库无需转
jsp也就是个servlet,所以servlet里能做的操作,jsp也一样能做。
form表单提交默认还是get,除非指定为post。
楼主不会是把转码和写数据库的逻辑放在跳转后的jsp里了吧。
入库之前做iso转big5的转码,入库前最好也print出来,看看是不是对的
出库无需转
jsp也就是个servlet,所以servlet里能做的操作,jsp也一样能做。
form表单提交默认还是get,除非指定为post。
楼主不会是把转码和写数据库的逻辑放在跳转后的jsp里了吧。
#7
先转码再提交的。。而且form为post提交的,就是上面的代码转码时无效啊
#8
数据库只能是utf8的是么?
我猜入库前作iso转utf8
出库作utf8转big5
试试入库时和出库时同时转成好几种然后打出来吧,哪种转法是对的一目了然,我通常烦了就直接用这种无赖方法。
我猜入库前作iso转utf8
出库作utf8转big5
试试入库时和出库时同时转成好几种然后打出来吧,哪种转法是对的一目了然,我通常烦了就直接用这种无赖方法。
#9
写一个转码工具类
package con.hiccds.zyf.ok;
import java.io.UnsupportedEncodingException;
public class Native {
// "gb2312"到"Unicode"的转码
public String toUnicode(String str){
char[]arChar=str.toCharArray();
int iValue=0;
String uStr="";
for(int i=0;i<arChar.length;i++){
iValue=(int)str.charAt(i);
if(iValue<=256){
// uStr+="�"+Integer.toHexString(iValue)+";";
uStr+="\\u00"+Integer.toHexString(iValue);
}else{
// uStr+="&#x"+Integer.toHexString(iValue)+";";
uStr+="\\u"+Integer.toHexString(iValue);
}
}
return uStr;
}
// "gb2312"到"ISO-8859-1"的转码
public String iso2gb(String str) {
try {
str = new String(str.getBytes("ISO-8859-1"), "gb2312");
} catch (Exception e) {
System.out.println("Encoding Error!");
}
return str;
}
//"ISO-8859-1"到"gb2312"的转码
public String gb2iso(String str) {
try {
str = new String(str.getBytes("gb2312"), "ISO-8859-1");
} catch (Exception e) {
System.out.println("Encoding Error!");
}
return str;
}
public String getChinese(String InputString) throws Exception
{
byte b[]=InputString.getBytes("ISO-8859-1");
String OutputString=new String(b);
return OutputString;
}
public static void main(String args[]){
System.out.println(new Native().toUnicode("人"));
}
}
#10
第一个问题:表单数据的编码问题
上面的代码是想要从表单中取出字符串,在你调用下面的代码时
Stringusername=newString( bytes,"UTF-8");//此处测试时username为乱码
应该想一下,bytes内部保存的数据流是否是UTF-8?
在你的系统中显然不是,而是BIG5。所以上面的代码应该修改成
当然WEB应用总体来说比较复杂,根据整体架构的不同,乱码问题也有不同的处理办法,建议看一下 如何解决Java WEB应用中的乱码问题一文中的描述。
第二个问题:数据库编码问题
将Java字符串保存到数据库时,MySQL会自动将unicode编码的Java字符串转换成它所对应的编码集,如UTF-8编码。所以保证你的字符串是unicode内码,而不是利用ISO-8859-1保存的其它字符集的字节数据流。
也就是说,将你的第一个问题解决好,第二个问题是由MySQL自己解决的。
关于字符串编码问题,以及ISO-8859-1字符集的作用,请参考 Java字符串与字符集的基本概念一文。
上面的代码是想要从表单中取出字符串,在你调用下面的代码时
Stringusername=newString( bytes,"UTF-8");//此处测试时username为乱码
应该想一下,bytes内部保存的数据流是否是UTF-8?
在你的系统中显然不是,而是BIG5。所以上面的代码应该修改成
Stringuser=request.getParameter("username");
byte[] bytes=user.getBytes("ISO-8859-1");
Stringusername=newString(bytes,"BIG5");//bytes中的字节流是BIG5编码
当然WEB应用总体来说比较复杂,根据整体架构的不同,乱码问题也有不同的处理办法,建议看一下 如何解决Java WEB应用中的乱码问题一文中的描述。
第二个问题:数据库编码问题
将Java字符串保存到数据库时,MySQL会自动将unicode编码的Java字符串转换成它所对应的编码集,如UTF-8编码。所以保证你的字符串是unicode内码,而不是利用ISO-8859-1保存的其它字符集的字节数据流。
也就是说,将你的第一个问题解决好,第二个问题是由MySQL自己解决的。
关于字符串编码问题,以及ISO-8859-1字符集的作用,请参考 Java字符串与字符集的基本概念一文。
#1
楼主的参数如何获得的?是form提交还是ajax提交?是ie还是ff?
页面和数据库为utf8的情况下:
form提交:后台iso88591转gb后写数据库(IE)iso88591转utf(FF)
ajax提交:统一由iso88591转utf,无视浏览器
------------------
即,传统的form提交,简体和繁体的转码处理方式一样,简体能转对,繁体就没问题
ajax的话要iso转utf
楼主再试试吧,出乱码的原因实在不少,呵呵。
页面和数据库为utf8的情况下:
form提交:后台iso88591转gb后写数据库(IE)iso88591转utf(FF)
ajax提交:统一由iso88591转utf,无视浏览器
------------------
即,传统的form提交,简体和繁体的转码处理方式一样,简体能转对,繁体就没问题
ajax的话要iso转utf
楼主再试试吧,出乱码的原因实在不少,呵呵。
#2
1 页面是BIG5
那么
request.setCharacterEncoding("BIG5");
然后就拿到了 String 了
2 存入MySQL, 设置连接的参数, useUnicode=true&characterEncoding=UTF8
保证保存和读取的都是正确的
最后,为何你的MySQL不能使用BIG5作为默认编码呢?
那么
request.setCharacterEncoding("BIG5");
然后就拿到了 String 了
2 存入MySQL, 设置连接的参数, useUnicode=true&characterEncoding=UTF8
保证保存和读取的都是正确的
最后,为何你的MySQL不能使用BIG5作为默认编码呢?
#3
哦,还少一条:get/post方法也会有区别。有时候url传参需要做url = encodeURL(url)的操作
#4
我的是通过form提交的..而且我的页面里面的中文全都是繁体的而且页面的编码格式为BIG5。。这也是客户的要求,现在主要是从big5的页面提交到utf-8的mysql数据库后,再从mysql数据库中取出来的过程中都好像无法转码.我已测试过了上面的代码好几次都没有转码成功
#5
还忘了。。我们只采用了jsp的技术。没有加入servlet更没有加入SSH框架,现在数据库的设置连接的参数不能修改,只能为utf-8,不然的话就要大面积的修改程序代码.而且我现在只是把form表单元素username的value传到数据库,不存在<a>标签中的那种传值出现乱码的情况.
#6
那请试试老紫竹老大的办法吧。
入库之前做iso转big5的转码,入库前最好也print出来,看看是不是对的
出库无需转
jsp也就是个servlet,所以servlet里能做的操作,jsp也一样能做。
form表单提交默认还是get,除非指定为post。
楼主不会是把转码和写数据库的逻辑放在跳转后的jsp里了吧。
入库之前做iso转big5的转码,入库前最好也print出来,看看是不是对的
出库无需转
jsp也就是个servlet,所以servlet里能做的操作,jsp也一样能做。
form表单提交默认还是get,除非指定为post。
楼主不会是把转码和写数据库的逻辑放在跳转后的jsp里了吧。
#7
先转码再提交的。。而且form为post提交的,就是上面的代码转码时无效啊
#8
数据库只能是utf8的是么?
我猜入库前作iso转utf8
出库作utf8转big5
试试入库时和出库时同时转成好几种然后打出来吧,哪种转法是对的一目了然,我通常烦了就直接用这种无赖方法。
我猜入库前作iso转utf8
出库作utf8转big5
试试入库时和出库时同时转成好几种然后打出来吧,哪种转法是对的一目了然,我通常烦了就直接用这种无赖方法。
#9
写一个转码工具类
package con.hiccds.zyf.ok;
import java.io.UnsupportedEncodingException;
public class Native {
// "gb2312"到"Unicode"的转码
public String toUnicode(String str){
char[]arChar=str.toCharArray();
int iValue=0;
String uStr="";
for(int i=0;i<arChar.length;i++){
iValue=(int)str.charAt(i);
if(iValue<=256){
// uStr+="�"+Integer.toHexString(iValue)+";";
uStr+="\\u00"+Integer.toHexString(iValue);
}else{
// uStr+="&#x"+Integer.toHexString(iValue)+";";
uStr+="\\u"+Integer.toHexString(iValue);
}
}
return uStr;
}
// "gb2312"到"ISO-8859-1"的转码
public String iso2gb(String str) {
try {
str = new String(str.getBytes("ISO-8859-1"), "gb2312");
} catch (Exception e) {
System.out.println("Encoding Error!");
}
return str;
}
//"ISO-8859-1"到"gb2312"的转码
public String gb2iso(String str) {
try {
str = new String(str.getBytes("gb2312"), "ISO-8859-1");
} catch (Exception e) {
System.out.println("Encoding Error!");
}
return str;
}
public String getChinese(String InputString) throws Exception
{
byte b[]=InputString.getBytes("ISO-8859-1");
String OutputString=new String(b);
return OutputString;
}
public static void main(String args[]){
System.out.println(new Native().toUnicode("人"));
}
}
#10
第一个问题:表单数据的编码问题
上面的代码是想要从表单中取出字符串,在你调用下面的代码时
Stringusername=newString( bytes,"UTF-8");//此处测试时username为乱码
应该想一下,bytes内部保存的数据流是否是UTF-8?
在你的系统中显然不是,而是BIG5。所以上面的代码应该修改成
当然WEB应用总体来说比较复杂,根据整体架构的不同,乱码问题也有不同的处理办法,建议看一下 如何解决Java WEB应用中的乱码问题一文中的描述。
第二个问题:数据库编码问题
将Java字符串保存到数据库时,MySQL会自动将unicode编码的Java字符串转换成它所对应的编码集,如UTF-8编码。所以保证你的字符串是unicode内码,而不是利用ISO-8859-1保存的其它字符集的字节数据流。
也就是说,将你的第一个问题解决好,第二个问题是由MySQL自己解决的。
关于字符串编码问题,以及ISO-8859-1字符集的作用,请参考 Java字符串与字符集的基本概念一文。
上面的代码是想要从表单中取出字符串,在你调用下面的代码时
Stringusername=newString( bytes,"UTF-8");//此处测试时username为乱码
应该想一下,bytes内部保存的数据流是否是UTF-8?
在你的系统中显然不是,而是BIG5。所以上面的代码应该修改成
Stringuser=request.getParameter("username");
byte[] bytes=user.getBytes("ISO-8859-1");
Stringusername=newString(bytes,"BIG5");//bytes中的字节流是BIG5编码
当然WEB应用总体来说比较复杂,根据整体架构的不同,乱码问题也有不同的处理办法,建议看一下 如何解决Java WEB应用中的乱码问题一文中的描述。
第二个问题:数据库编码问题
将Java字符串保存到数据库时,MySQL会自动将unicode编码的Java字符串转换成它所对应的编码集,如UTF-8编码。所以保证你的字符串是unicode内码,而不是利用ISO-8859-1保存的其它字符集的字节数据流。
也就是说,将你的第一个问题解决好,第二个问题是由MySQL自己解决的。
关于字符串编码问题,以及ISO-8859-1字符集的作用,请参考 Java字符串与字符集的基本概念一文。