UTF-8 到ISO-88595-1 的转换高手请进 UTF-8 到 GB2312 的转换高手请进 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 直接 String.getBytes("GB2312");就得到直正的GB2312的字节码。String iso_Value = new String(uft8_Value.getBytes("iso-8859-1"),"GB2312");你既然从把字符串转接成iso-8859,为什么把内码为iso-8859的数据当作GB2312来用?不是问号才怪。当你使用String( xxx, "GB2312" )时,是告诉String, xxxx中的内码是使用GB2312来存放的,而不是要求String用GB2312来存放。你的理解刚好相反。无论怎么样,Java的String都是按Unicode来存放的。 package gkgl.include;import java.sql.Date;import java.sql.ResultSet;import java.text.DateFormat;import java.util.Calendar;import java.sql.*;/** * 此类各个方法主要是实现公用输出数据. * @author htjs */public class OutString extends gkgl.basic.StrReplace{ private String errmsg = null; public OutString() { errmsg = "Error"; }//end public /** *转换中文字符编码(让jsp提交表单是显示中文简体). *@param str 字符串 *@return String 转换过的字符串 *@author hu 2002.12.13 */ public static String convert(String str) { try{ byte[] temp=str.getBytes("ISO-8859-1"); return new String(temp); }catch(Exception e){return "";} } /** *转换中文字符编码(让中文简体转换成ISO8859_1编码). *@param str 字符串 *@return String 转换过的字符串 *@author hu 2002.12.13 */ public static String reconvert(String value){ try { //return new String(value.getBytes("gb2312"),"ISO8859_1"); //在gb2312字符集中很多汉字无法解析(如圪垱),所以应该使用GBK return new String(value.getBytes("GBK"),"ISO8859_1");} catch(Exception e){return "";} } /** *四舍五入. *@param value double类型的值 *@return double */ public static double round(double value) { double f = Math.round(value * 100D); f /= 100D; return f; }//end public /** *格式化日期. *@param d java.sql.Date型日期 *@return String 格式化后的日期字符串 */ public static String formatdate(Date d) { if(d != null) { java.text.DateFormat df = java.text.DateFormat.getDateInstance(); return df.format(d); }else{ return ""; }//end if }//end public /** *格式化日期 *@param d 日期 *@return String 返回“年月日” */ public static String formatnyr(java.util.Date d) { if(d != null) { Calendar c=Calendar.getInstance(); c.setTime(d); String date =String.valueOf(c.get(Calendar.YEAR))+"年"+String.valueOf(c.get(Calendar.MONTH))+"月"+String.valueOf(c.get(Calendar.DAY_OF_MONTH))+"日"; return date; }else{ return ""; }//end if }//end public /** *格式化日期 *@param d java.sql.Date 日期 *return String 返回“年月日” */ public static String formatnyr(java.sql.Date d) { if(d != null) { String tmp=formatdate(d); int s1=tmp.indexOf("-"); int s2=tmp.lastIndexOf("-"); String rnt=tmp.substring(0,s1)+"年"; rnt+=tmp.substring(s1+1,s2)+"月"; rnt+=tmp.substring(s2+1,tmp.length())+"日"; return rnt; }else{ return ""; }//end if }//end public quote;gzlucky(Lucky) String str ="中文转换问题" ; byte[] bt = str.getBytes("UTF-8"); String uft8_Value = new String(bt,"UTF-8");这三条语句我只是想得到一个UTF-8编码的字符串,如果直接用String.getBytes("GB2312")得到当然是GB2312编码了,我现在的目的是想用一个UTF-8编码的字符串(本例中为uft8_Value) 通过iso8859作中介来转换为GB2312的编码,String iso_Value = new String(uft8_Value.getBytes("iso-8859-1"),"GB2312");现在的iso_Value应该是GB2312的编码了,但打印出来的是???,不知什么原因, quote:fuzhan820(fzd)public class testEncoding{ public static void main(String[] args){ try{ System.out.println("gbk----iso"+reconvert("我的中国")); System.out.println("ISO-8859-1="+convert("我的中国")); }catch(Exception ex){ ex.printStackTrace(); } } public static String reconvert(String value){ try { //return new String(value.getBytes("gb2312"),"ISO8859_1"); //在gb2312字符集中很多汉字无法解析(如圪垱),所以应该使用GBK return new String(value.getBytes("GBK"),"ISO8859_1");} catch(Exception e){return "";} } public static String convert(String str) { try{ byte[] temp=str.getBytes("ISO-8859-1"); return new String(temp); }catch(Exception e){return "";} }}我用上面这个class 测试了你的两个方法,convert 和reconvert方法,但打印出来没有一个是中文的,你看一下看,错在那里,难道我这样调用有错吗? String uft8_Value = new String(bt,"UTF-8");这时候,uft8_Value中的字符串已不是你所想象的UTF-8,而是String中统一使用的UniCode,String(bt,"UTF-8") 只是告诉String,bt是一个UTF-8的字节串。String(value.getBytes("GBK"),"ISO8859_1")这里 value.getBytes("GBK"),是要求String把字符串输出为GBK,但你却在重新赋值时:String(xxx, "ISO8859_1"),告诉String 这个原本被你输出为GBK的字节串是一串ISO8859_1,你说这能不错吗? quote : gzlucky(Lucky)多谢了,你说的我算明白了但我还有一个疑惑,不知这句话这么解释,这是从浏览器接收参数name,name为带有中文的字符串new String((request.getParameter("name")).getBytes("iso-8859-1"),"GB2312");这句话确实能将request.getParameter("name")转换为中文,而直接打印request.getParameter("name")则是乱码, 按你的说法,上面那句话,是告诉String 这个原本输出为iso-8859-1的字符串是一串GB2312,那打印出来应该是乱码才对,但他确能正确打印. 其实你贴这个程序我就估计到是码制转接的问题,我原以为是数据库的问题,我曾在网上看到过一些数据库的码制转换时需要这样用。是这样的,他的Oracle数据库好象是以ISO-8859作为字符集来创建的,而且库表内使用了中文数据,并使用了一段时间,后来在开发网上应用的时候才发现,没办法就用了你所说的类似方法进行转换。读取时以ISO-8859的方式提取转换成GBK,写的时候把GBK转换成ISO8859再写到数据库中。我估计这个与你所说的情况比较相似。 quote ; gzlucky(Lucky) 谢谢了,大概用我都会用了,我估计new String((request.getParameter("name")).getBytes("iso-8859-1"),"GB2312");这句话应该是这样的request.getParameter("name"))接收的字符串应该是UTF-8编码,因为这是浏览器默认的编码方式,然后getBytes("iso-8859-1")是把他转换为iso-8859-1编码,再以他为中介转换为GB2312编码. 求助swing高手!布局问题! JAVA中 (int/Integer + “”)转换成String 执行效率更高? 关于applet显示图片的疑惑 使用Java时,如何在“系统属性”中设置CLASSPATH变量? Spring的事务管理 求,住店计费思路 如何把JFrame上的图画存成图片(如bmp) 各位大侠帮忙一下哈!!! 关于在JTable里显示多行文本!!!! 各位我下了一个jb编程100例为什么所有程序都有这个错误啊? 汉字内码问题! jvm与java.exe进程
import java.sql.ResultSet;
import java.text.DateFormat;
import java.util.Calendar;
import java.sql.*;/**
* 此类各个方法主要是实现公用输出数据.
* @author htjs
*/public class OutString extends gkgl.basic.StrReplace
{ private String errmsg = null; public OutString()
{
errmsg = "Error";
}//end public /**
*转换中文字符编码(让jsp提交表单是显示中文简体).
*@param str 字符串
*@return String 转换过的字符串
*@author hu 2002.12.13
*/
public static String convert(String str)
{
try{
byte[] temp=str.getBytes("ISO-8859-1");
return new String(temp);
}catch(Exception e){return "";}
}
/**
*转换中文字符编码(让中文简体转换成ISO8859_1编码).
*@param str 字符串
*@return String 转换过的字符串
*@author hu 2002.12.13
*/
public static String reconvert(String value){
try {
//return new String(value.getBytes("gb2312"),"ISO8859_1");
//在gb2312字符集中很多汉字无法解析(如圪垱),所以应该使用GBK
return new String(value.getBytes("GBK"),"ISO8859_1");}
catch(Exception e){return "";}
}
/**
*四舍五入.
*@param value double类型的值
*@return double
*/
public static double round(double value)
{
double f = Math.round(value * 100D);
f /= 100D;
return f;
}//end public /**
*格式化日期.
*@param d java.sql.Date型日期
*@return String 格式化后的日期字符串
*/
public static String formatdate(Date d)
{
if(d != null)
{
java.text.DateFormat df = java.text.DateFormat.getDateInstance();
return df.format(d);
}else{
return "";
}//end if
}//end public /**
*格式化日期
*@param d 日期
*@return String 返回“年月日”
*/
public static String formatnyr(java.util.Date d)
{
if(d != null)
{
Calendar c=Calendar.getInstance();
c.setTime(d);
String date =String.valueOf(c.get(Calendar.YEAR))+"年"+String.valueOf(c.get(Calendar.MONTH))+"月"+String.valueOf(c.get(Calendar.DAY_OF_MONTH))+"日";
return date;
}else{
return "";
}//end if
}//end public /**
*格式化日期
*@param d java.sql.Date 日期
*return String 返回“年月日”
*/
public static String formatnyr(java.sql.Date d)
{
if(d != null)
{
String tmp=formatdate(d);
int s1=tmp.indexOf("-");
int s2=tmp.lastIndexOf("-");
String rnt=tmp.substring(0,s1)+"年";
rnt+=tmp.substring(s1+1,s2)+"月";
rnt+=tmp.substring(s2+1,tmp.length())+"日";
return rnt;
}else{
return "";
}//end if
}//end public
String str ="中文转换问题" ;
byte[] bt = str.getBytes("UTF-8");
String uft8_Value = new String(bt,"UTF-8");
这三条语句我只是想得到一个UTF-8编码的字符串,如果直接用String.getBytes("GB2312")得到当然是GB2312编码了,我现在的目的是想用一个UTF-8编码的字符串(本例中为uft8_Value)
通过iso8859作中介来转换为GB2312的编码,String iso_Value = new String(uft8_Value.getBytes("iso-8859-1"),"GB2312");现在的iso_Value应该是GB2312的编码了,
但打印出来的是???,不知什么原因,
try{
System.out.println("gbk----iso"+reconvert("我的中国"));
System.out.println("ISO-8859-1="+convert("我的中国")); }catch(Exception ex){
ex.printStackTrace();
}
}
public static String reconvert(String value){
try {
//return new String(value.getBytes("gb2312"),"ISO8859_1");
//在gb2312字符集中很多汉字无法解析(如圪垱),所以应该使用GBK
return new String(value.getBytes("GBK"),"ISO8859_1");}
catch(Exception e){return "";}
}
public static String convert(String str)
{
try{
byte[] temp=str.getBytes("ISO-8859-1");
return new String(temp);
}catch(Exception e){return "";}
}
}
我用上面这个class 测试了你的两个方法,convert 和reconvert方法,但打印出来没有一个是中文的,你看一下看,错在那里,难道我这样调用有错吗?
这时候,uft8_Value中的字符串已不是你所想象的UTF-8,而是String中统一使用的UniCode,
String(bt,"UTF-8") 只是告诉String,bt是一个UTF-8的字节串。String(value.getBytes("GBK"),"ISO8859_1")
这里 value.getBytes("GBK"),是要求String把字符串输出为GBK,但你却在重新赋值时:
String(xxx, "ISO8859_1"),告诉String 这个原本被你输出为GBK的字节串是一串ISO8859_1,你说这能不错吗?
多谢了,你说的我算明白了
但我还有一个疑惑,不知这句话这么解释,这是从浏览器接收参数name,name为带有中文的字符串new String((request.getParameter("name")).getBytes("iso-8859-1"),"GB2312");
这句话确实能将request.getParameter("name")转换为中文,而直接打印request.getParameter("name")则是乱码, 按你的说法,
上面那句话,是告诉String 这个原本输出为iso-8859-1的字符串是一串GB2312,那打印出来应该是乱码才对,但他确能正确打印.
谢谢了,大概用我都会用了,我估计new String((request.getParameter("name")).getBytes("iso-8859-1"),"GB2312");这句话应该是这样的request.getParameter("name"))接收的字符串应该是UTF-8编码,因为这是浏览器默认的编码方式,然后getBytes("iso-8859-1")是把他转换为iso-8859-1编码,再以他为中介转换为GB2312编码.