String b = new String(dish_id.getBytes("ISO-8859-1"), "UTF-8");
解决方案 »
- 框架刷新问题
- MyEclipse JSP action 奇怪现象,大家有没有遇到过?
- Spring的两个疑问
- sturts中的<html:submit/>的单击事件问题
- 请问大家现在STRUTS都用什么版本的了!
- 关于weblogic的一个问题,请高手们帮忙,将不甚感激!
- java与WINDOWS程序的SOCKET通讯,对方传过来的是typedef的结构数据,如果读取?
- 招聘JAVA开发高手。
- 关于Jquery Ajax异步请求的属性探讨
- 为什么while(rs.next)
- Couldn't perform the operation getAutoCommit 求救!
- org.hibernate.exception.SQLGrammarException的问题
或者filter进行转码。
应该是
String b = getParameter("name");
b = new String(b.getBytes("GBK"), "UTF-8");
new String(dish_id.getBytes("ISO-8859-1"), "UTF-8");
new String(dish_id.getBytes("ISO-8859-1"), "GBK");
new String(dish_id.getBytes("GBK"), "UTF-8");
new String(dish_id.getBytes("GBK"), "ISO-8859-1");
new String(dish_id.getBytes("UTF-8"), "GBK");
new String(dish_id.getBytes("UTF-8"), "ISO-8859-1");
把这些挨个转一遍看看哪个是正确的
可以确定是GBK转UTF-8的问题,
当转换的中文是偶数位时正常,奇数位时出错。
苦恼中!!!
由于提交参数中的中文没有采用 URL 编码。
method="pos"
enctype="multipart/form-data"
<form action="/servlet/dish_add" method=post enctype="multipart/form-data" >
在JSP页面传过来的时候调用JavaScript的encodeURI()的方法包装要传递的URL
然后再用String b = new String(dish_id.getBytes("ISO-8859-1"), "UTF-8");
把Action用encodeURI()包装一下试试
怎么包装?
第一次听说
少打了个c
这样就不会出现乱码了。
public String convertString(String gbk){
String utf8 = new String(gbk2utf8(gbk),"UTF-8");
} public byte[] gbk2utf8(String chenese) {
char c[] = chenese.toCharArray();
byte[] fullByte = new byte[3 * c.length];
for (int i = 0; i < c.length; i++) {
int m = (int) c[i];
String word = Integer.toBinaryString(m); StringBuffer sb = new StringBuffer();
int len = 16 - word.length();
for (int j = 0; j < len; j++) {
sb.append("0");
}
sb.append(word);
sb.insert(0, "1110");
sb.insert(8, "10");
sb.insert(16, "10"); String s1 = sb.substring(0, 8);
String s2 = sb.substring(8, 16);
String s3 = sb.substring(16); byte b0 = Integer.valueOf(s1, 2).byteValue();
byte b1 = Integer.valueOf(s2, 2).byteValue();
byte b2 = Integer.valueOf(s3, 2).byteValue();
byte[] bf = new byte[3];
bf[0] = b0;
fullByte[i * 3] = bf[0];
bf[1] = b1;
fullByte[i * 3 + 1] = bf[1];
bf[2] = b2;
fullByte[i * 3 + 2] = bf[2]; }
return fullByte;
}
细细品味了一下,发现我的代码写错了,想修改,发现没法修改发出的帖子.....
算了,重新搞一次..
public String convertString(String gbk){
String utf8 = "";
try {
utf8 = new String(gbk2utf8(gbk),"UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return utf8;
} public byte[] gbk2utf8(String chenese) {
char c[] = chenese.toCharArray();
byte[] fullByte = new byte[3 * c.length];
for (int i = 0; i < c.length; i++) {
int m = (int) c[i];
String word = Integer.toBinaryString(m); StringBuffer sb = new StringBuffer();
int len = 16 - word.length();
for (int j = 0; j < len; j++) {
sb.append("0");
}
sb.append(word);
sb.insert(0, "1110");
sb.insert(8, "10");
sb.insert(16, "10"); String s1 = sb.substring(0, 8);
String s2 = sb.substring(8, 16);
String s3 = sb.substring(16); byte b0 = Integer.valueOf(s1, 2).byteValue();
byte b1 = Integer.valueOf(s2, 2).byteValue();
byte b2 = Integer.valueOf(s3, 2).byteValue();
byte[] bf = new byte[3];
bf[0] = b0;
fullByte[i * 3] = bf[0];
bf[1] = b1;
fullByte[i * 3 + 1] = bf[1];
bf[2] = b2;
fullByte[i * 3 + 2] = bf[2]; }
return fullByte;
}
顺手把那个大大的转换原理贴出来:
UTF-8 采用变长度字节来表示字符,理论上最多可以到 6 个字节长度(一个字符六个字节)。
UTF-8 编码兼容了 ASC II(0-127), 也就是说 UTF-8 对于 ASC II 字符的编码是和 ASC II 一样的。
对于超过一个字节长度的字符,才用以下编码规范:
左边第一个字节1的个数表示这个字符编码字节的位数,
例如两位字节字符编码样式为为:110xxxxx 10xxxxxx;
三位字节字符的编码样式为:1110xxxx 10xxxxxx 10xxxxxx.;
以此类推,六位字节字符的编码样式为:1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx。
xxx 的值由字符编码的二进制表示的位填入。只用最短的那个足够表达一个字符编码的多字节串。
例如:
Unicode 字符: 00 A9(版权符号) = 1010 1001,
UTF-8 编码为:11000010 10101001 = 0x C2 0xA9;
字符 22 60 (不等于符号) = 0010 0010 0110 0000,
UTF-8 编码为:11100010 10001001 10100000 = 0xE2 0x89 0xA0 UTF-8的编码原理和特性:U+0000~U+007E 1 _ _ _ _ _ _ _ (7bits)U+0080~U+07FF 1 1 0_ _ _ _ _ 1 0_ _ _ _ _ _ (11bits)U+0800~U+FFFF 1 1 1 0 _ _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _ (16bits)
utf8Content = new String(str.getBytes(),"utf-8");
GBKStr = URLDecoder.decode(utf8Content, "GBK");
你可以试一下,不知是否可行。