我的理解是iso-8859-1在字符转换的时候不用改变原编码值的,原本我以为"人",在gb2312中的编码,解析到iso-8859-1应该不变,
可是我运行下面的程序
发现"人"的iso编码是"c8cb",gb2312的编码是"4eba",难道gb2312到iso是有编码算法的
谁能解释下?
public class Test { public static void p(){}
public static void testCharset(String str){
str.getBytes();
}
public static String testEncoding(String charsetname) { try {
String stra = "人";
byte[] bytes = stra.getBytes(); String result = new String(bytes, charsetname); System.out.println("Receive value: [" + result + "].");
return testbinary(result);
} catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); }
return "";
}
public static String testbinary(String str){
String result ="";
char[] testchar = str.toCharArray();
for (int i = 0; i < testchar.length; i++) {
char c = testchar[i];
//result+=Integer.toBinaryString(c);
result+=Integer.toHexString(c);
}
return result;
}
public static void main(String[] args){
String result = Test.testEncoding(
"iso-8859-1"
// "gb2312"
// "gbk"
// "utf-8"
// "unicode"
);
System.out.println(result);
String result2 = Test.testEncoding(
// "iso-8859-1"
"gb2312"
// "gbk"
// "utf-8"
);
System.out.println(result2);
}
}
可是我运行下面的程序
发现"人"的iso编码是"c8cb",gb2312的编码是"4eba",难道gb2312到iso是有编码算法的
谁能解释下?
public class Test { public static void p(){}
public static void testCharset(String str){
str.getBytes();
}
public static String testEncoding(String charsetname) { try {
String stra = "人";
byte[] bytes = stra.getBytes(); String result = new String(bytes, charsetname); System.out.println("Receive value: [" + result + "].");
return testbinary(result);
} catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); }
return "";
}
public static String testbinary(String str){
String result ="";
char[] testchar = str.toCharArray();
for (int i = 0; i < testchar.length; i++) {
char c = testchar[i];
//result+=Integer.toBinaryString(c);
result+=Integer.toHexString(c);
}
return result;
}
public static void main(String[] args){
String result = Test.testEncoding(
"iso-8859-1"
// "gb2312"
// "gbk"
// "utf-8"
// "unicode"
);
System.out.println(result);
String result2 = Test.testEncoding(
// "iso-8859-1"
"gb2312"
// "gbk"
// "utf-8"
);
System.out.println(result2);
}
}
解决方案 »
- JSP环境配置一分钟搞定
- JSP中能作出斜45度游戏地图的效果么?
- 从Struts1.2过渡到Struts2.0需要什么工作
- 帮忙看看红色部分是做什么用
- 怎样隐藏视频文件的真实地址?
- preparestatement时出现NullPointerException,为什么?
- 用response.encodeRedirectURL编码且跳转后,用什么解码?
- 系统版本更新
- 请教:在有 <jsp:include page="xx.jsp"/> 的页面中 POST 和 GET 的不同!
- 哪位用过IBM AS400/DB2,你们是如何通过JDBDC存取中文的?
- 这段代码执行后没有显示当前时间?
- 我在执行程序时报Services Unavilable错误
汉字在iso中真的还有对应的编码啊,我怎么以前遇到的一直都是"?"或是"3f"这样的符号啊,我觉得2楼的说的比较大概一点.
是使用字节流的。 因此Java要对这些字节流经行转化。char是unicode的,而byte是字节.
Java中byte/char互转的函数在sun.io的包中间有。其中ByteToCharConverter类是中调度,
可以用来告诉你,你用的Convertor。其中两个很常用的静态函数是
public static ByteToCharConverter getDefault() ;
public static ByteToCharConverter getConverter(String encoding);
如果你不指定converter,则系统会自动使用当前的Encoding,GB平台上用GBK,EN平台上用
8859_1
我们来就一个简单的例子:
"你"的gb码是:0xC4E3 ,unicode是0x4F60
你用:
--encoding="gb2312";
--byte b[]={(byte)"u00c4",(byte)"u00E3"};
--convertor=ByteToCharConverter.getConverter(encoding);
--char [] c=converter.convertAll(b);
--for(int i=0;i0xC4,0x00E3->0xE3,因此0xC4,0xE3被放进了
1.网页传参数不提倡用get方法,而且用户可以调整是否用utf-8发送 /////////// 这一行要注意了
2.建议jsp中最好不要用,实际上加不加这句都有实现中文正常显示的方案,我认为不加方便些,至少不用写这些代码,如下的配置我认为可以使中文正常显示:
a.所有的javabean用iso8859-1编译
b.jsp文件中不要写以上charset=gb2312的语句(写了反而错)这段更重要了,做后台sql的都看看吧我们的目标是,任一国家的客户端通过Form向Server发送信息,Server把信息存入数据库中,客户端在检索时仍然能够看到自己发送的正确信息。事实上,我们要保证,最终Server中的SQL语句中保存的时包含客户端发送文字的正确Unicode编码;DBC与数据库通讯时采用的编码方式能包含客户端发送的文字信息,事实上,最好让JDBC直接使用UNICODE/UTF8与数据库通讯!这样就可以确保不会丢失信息;Server向客户端发送的信息时也要采用不丢失信息的编码方式,也可以是Unicode/Utf8。
如果不指定Form的Enctype属性,Form将把输入的内容依照当前页面的编码字符集urlencode之后再提交,服务器端得到是urlencoding的字符串。编码后得到的urlencoding字符串是与页面的编码相关的,如gb2312编码的页面提交"中文测试",得到的是"%D6%D0%CE%C4%B2%E2%CA%D4",每个"%"后跟的是16进制的字符串;而在UTF8编码时得到的却是"%E4%B8%AD%E6%96%87%E6%B5%8B%E8%AF%95",因为GB2312编码中一个汉字是16位的,而UTF8中一个汉字却是24位的。中日韩三国的ie4以上浏览器均支持UTF8编码,这种方案肯定包涵了这三国语言,所以我们如果让Html页面使用UTF8编码那么将至少可以支持这三国语言。
但是,如果我们html/Jsp页面使用UTF8编码,因为应用程序服务器可能不知道这种情况,因为如果浏览器发送的信息不包含charset信息,至多Server知道读到Accept-Language请求投标,我们知道仅靠这个投标是不能获知浏览器所采用编码的,所以应用程序服务器不能正确解析提交的内容,为什么?因为Java中的所有字符串都是Unicode16位编码的,HttpServletRequest.request(String)的功能就是把客户端提交的Urlencode编码的信息转为Unicode字符串,有些Server只能认为客户端的编码和Server平台相同,简单地使用URLDecoder.decode(String)方法直接解码,如果客户端编码恰好和Server相同,那么就可以得到正确地字符串,否则,如果提交地字符串中包含了当地字符,那么将会导致垃圾信息。