字符编码转换问题,分很多,高手请进来
代码片断如下:
static PageConfig newPageConfig(String xml)
{
SAXBuilder builder = new SAXBuilder();
PageConfig ret = new PageConfig();
try
{
InputStream st = new ByteArrayInputStream(xml.getBytes());
Document doc = builder.build(st);
Element root = doc.getRootElement();
Element page = root.getChild("page");
ret.title = new String(page.getAttributeValue("title").getBytes("ISO8859-1"),"UTF-8");
进行到这儿,这个titile是从mysql数据库中的一个字段xml-config的内容取到,这个字段的内容其实就是一个xml格式的内容,如下:
<?xml version="1.0" encoding="UTF-8"?>
<xml-body>
<page title="登陆" desc="美丽的地方" banner="/image/test.jpg" article="login" encode="UTF-8" align="0" showMode="0" maxListCount="12">
<ico url="/image/ico/1.png"></ico>
</page>
</xml-body>
我现在问题是,我在程序中取到getAttributeValue("title").getBytes("ISO8859-1"),"UTF-8");在浏览器页面上发现不是中文显示,而是“??”字样,如何才能转化为中文呢??请大家指点,100分!!!
问题点数:100、回复次数:41Top
1 楼flyoversky(碧海)回复于 2005-12-08 10:52:02 得分 1
有没有试过直接打印page.getAttributeValue("title")?Top
2 楼dylyonia(不以物悲,不以己喜)回复于 2005-12-08 10:56:02 得分 0
直接打印是“??”Top
3 楼wangdongzjk(东)回复于 2005-12-08 10:58:22 得分 1
gbkTop
4 楼dylyonia(不以物悲,不以己喜)回复于 2005-12-08 11:00:27 得分 0
请说明的详细一些,谢谢!Top
5 楼dylyonia(不以物悲,不以己喜)回复于 2005-12-08 11:06:51 得分 0
高手们来啊,再现等待Top
6 楼dylyonia(不以物悲,不以己喜)回复于 2005-12-08 11:12:23 得分 0
怎么没人呢Top
7 楼rickhunterchen(千山鸟飞绝)回复于 2005-12-08 12:54:07 得分 1
两个地方改一下:
ret.title = new String(page.getAttributeValue("title").getBytes("ISO8859-1"),"UTF-8");中将"UTF-8"改为"gb2312"。
页头加上<%@ page language="java" pageEncoding="gb2312"%>Top
8 楼fangcheng007(城城)回复于 2005-12-08 12:55:26 得分 1
getAttributeValue("title").getBytes("ISO8859-1"),"GBK");或getAttributeValue("title").getBytes("ISO8859-1"),"gb2312");Top
9 楼fangcheng007(城城)回复于 2005-12-08 13:13:13 得分 8
这句话的意思是:将取得的自浮串用西方国家的编码方式(ISO8859-1)解码还原成二进制的内容,然后再将他用UTF-8的编码方式解码读去并显示其内容,当然也可转成中文的编码方式读去了,也可用其他编码方式解释并显示,但是要看这个字符本来是用是么编码的,解铃还须系铃人啊,要不就显示乱码了
备注:GBK(国标码/兼容繁体字),gb2312(早期的国标码/不兼容繁体字),big5(台湾地区的编码方式/繁体/似乎有文字编码独立的意思)Top
10 楼dylyonia(不以物悲,不以己喜)回复于 2005-12-08 13:43:22 得分 0
大哥们,我这个是class,不是jsp,最后我有一个专门生成wml页面的类去专门生成页面
所以,不能<%@ page language="java" pageEncoding="gb2312"%>这个方式
Top
11 楼beermonkey(有啤酒肚的猴)回复于 2005-12-08 14:12:55 得分 8
用这个方法,参考一下吧!
public static String parseChinese(String in)
{
String s = null;
byte temp[];
if (in == null) {
System.out.println("Warn:Chinese null founded!");
return new String("");
}
try {
temp = in.getBytes("iso-8859-1");
s = new String(temp);
}
catch (Exception Ex) {
System.out.println(Ex.toString());
}
return s;
}
Top
12 楼xdop(鸿飞处)回复于 2005-12-08 14:26:24 得分 2
什么也不要说了
ret.title = new String(page.getAttributeValue("title").getBytes("ISO8859-1"),"UTF-8");
改为
ret.title = new String(page.getAttributeValue("title").getBytes(),"GBK");Top
13 楼rickhunterchen(千山鸟飞绝)回复于 2005-12-08 15:06:33 得分 5
这是我平常使用的字符编码转换的类。
public class Coding {
public static String transtr(String str) throws Exception{
str = new String(str.trim().getBytes("ISO-8859-1"),"GB2312");
return str;
}
}Top
14 楼dylyonia(不以物悲,不以己喜)回复于 2005-12-08 15:44:00 得分 0
还是不行,现在我说的详细点吧
数据库表--page---里面有一个字段xml_config,其中有一条记录对应的这个字段的内容是:
<?xml version="1.0" encoding="UTF-8"?>
<xml-body>
<page title="登陆" desc="美丽的地方" banner="/image/test.jpg" article="login" encode="UTF-8" align="0" showMode="0" maxListCount="12">
<ico url="/image/ico/1.png"></ico>
</page>
</xml-body>
然后,现在我有个类Pageconfig,作用就是专门去取这个里边的内容,具体过程还有其他的类的作用,取这个里面的比如title,desc,banner这些xml属性的内容是用这个方法。代码片断如下:
static PageConfig newPageConfig(String xml)
{
SAXBuilder builder = new SAXBuilder();
PageConfig ret = new PageConfig();
try
{
InputStream st = new ByteArrayInputStream(xml.getBytes());
Document doc = builder.build(st);
Element root = doc.getRootElement();
Element page = root.getChild("page");
ret.title = new String(page.getAttributeValue("title").getBytes("ISO8859-1"),"UTF-8");
现在是我取到这些属性后,我将通过我的另一个类fiter把这些内容生成wml页面显示给用户,目前是显示在wml页面的比如title为“????”,
fiter的函数output首先转化这个title的内容为ISO8859-1,然后转化为UTF-8
public void outPut(String str)
{
try
{
str = new String(str.getBytes("UTF-8"), "iso-8859-1");
}
catch (UnsupportedEncodingException e)
{
System.out.println(e.getMessage());
e.printStackTrace();
}
ServletOutputStream out = null;
try
{
out = response.getOutputStream();
out.println(str);
}
catch (IOException ex)
{
System.out.println(ex.getMessage());
ex.printStackTrace();
}
}
所以我现在需要在pageConfig类中首先转化title为UTF-8格式Top
15 楼yeqiufeng(叶秋枫)回复于 2005-12-08 15:49:34 得分 2
好贴子 必须收藏
支持一下Top
16 楼dylyonia(不以物悲,不以己喜)回复于 2005-12-08 17:29:54 得分 0
没有人了?
Top
17 楼angues1980(石头心)(JSF学习中)回复于 2005-12-08 17:38:49 得分 7
一般如果乱码的话还好说,如果是?的话,基本上就是转换过程中有问题了,没救了。
虽然下面的是针对web应用的,不过应该能给楼主一些提示:
中文乱码问题的根本解决办法是明确地指定整个应用系统统一的字符集。
要做到以下几点:
一、开发和编译代码时指定字符集为UTF-8。JBuilder和Eclipse都可以在项目属性中设置。
二、使用过滤器,如果所有请求都经过一个Servlet控制分配器,那么使用Servlet的filter执行语句,将所有来自浏览器的请求(request)转换为UTF-8,因为浏览器发过来的请求包根据浏览器所在的操作系统编码,可能是各种形式编码。关键一句:
request.setCharacterEncoding("UTF-8")。
需要配置web.xml 激活该Filter。
三、在JSP头部声明:<%@ page contentType="text/html;charset= UTF-8" %>。
四、在Jsp的html代码中,声明UTF-8:<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
五、设定数据库连接方式是UTF-8。例如连接MYSQL时配置URL如下:
jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8
一般数据库都可以通过管理设置设定UTF-8
六、其他和外界交互时能够设定编码时就设定UTF-8,例如读取文件,操作XML等。
七、如果使用的是tomcat服务器,那么修改在${tomcat_home}/conf/中的server.xml文件:
<Connector port="8080"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" connectionTimeout="20000"
disableUploadTimeout="true" URIEncoding="UTF-8" />
或者改为:
<Connector port="8080"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" connectionTimeout="20000"
disableUploadTimeout="true" useBodyEncodingForURI="true" />
都能达到很好的效果。
Top
18 楼zgf19821202(风云知己)回复于 2005-12-08 17:42:57 得分 2
两种解决方法:
1.在tomcat中设置一下字符集;
2.在读取xml或者数据库的时候就设置字符集;Top
19 楼angues1980(石头心)(JSF学习中)回复于 2005-12-08 17:47:53 得分 3
好像是因为数据本来是UTF-8型的,而楼主从里面取出来的时候还要用ISO8859-1来取然后再转化为UTF-8
要知道UTF-8就是unicode码,而ISO8859-1是西方符号编码,也就是说里面是不带中文字符的,所以转换成ISO8859-1肯定是没法认的,所以显示"?"。
忘记了ISO8859-8还是多少来着才可以。
最好先去差一下编码集Top
20 楼infowain(infowain)回复于 2005-12-08 18:05:01 得分 6
我也遇到过这样的问题,你先确定一下你的xml文件是不是真的是UTF-8编码的。还有我建议你的xml文件用GBK来写,这样就不会有问题了。
Top
21 楼dylyonia(不以物悲,不以己喜)回复于 2005-12-08 18:09:48 得分 0
领教各位,调试中^^^^^
Top
22 楼libin2722(禮物)回复于 2005-12-08 21:41:11 得分 1
经典,支持Top
23 楼KongChen(我是菜鸟)回复于 2005-12-09 12:13:19 得分 1
我觉得在怎么转也是??啊,由下面这句话决定的:
try
{
str = new String(str.getBytes("UTF-8"), "iso-8859-1");
}
iso-8859-1字符集里面有中文吗?Top
24 楼kidonline(扬帆)回复于 2005-12-09 13:17:58 得分 2
我觉得应该是mysql没有存成utf-8编码的缘故。看看my.ini文件中的default-character-set属性是什么。还有在mysql客户端看看能不能正确显示查出来的数据。Top
25 楼dylyonia(不以物悲,不以己喜)回复于 2005-12-09 14:25:33 得分 0
各位:mysql客户端显示为“??”。Top
26 楼jacbo(今天你坚持了没有)回复于 2005-12-09 14:34:26 得分 1
是不是mysql的问题Top
27 楼dylyonia(不以物悲,不以己喜)回复于 2005-12-09 14:42:37 得分 0
mysql的编码为UTF-8Top
28 楼QWERT520(痛苦并快乐着)回复于 2005-12-09 14:58:48 得分 4
因为mysql的编码机制跟PO的编码机制是不一样的。然而单用一般的转码方式是不起作用。
在mysql安装路径下有一个my.ini文件设置default-character-set=GBKTop
29 楼dylyonia(不以物悲,不以己喜)回复于 2005-12-09 15:46:40 得分 0
find / -name my.cnf
linux下/usr/local/mysql目录竟然没找到,如何改mysql的默认字符编码Top
30 楼qzjackie(qzjackie)回复于 2005-12-10 11:01:32 得分 1
学习了Top
31 楼QWERT520(痛苦并快乐着)回复于 2005-12-10 13:52:07 得分 1
mysql版本要在4.0以上才有这个文件
Top
32 楼Helloworld2004()回复于 2005-12-10 15:09:28 得分 1
所有转码程序的核心只有一句:先转成unicode编码,再转成所需要的编码Top
33 楼potency(动力)回复于 2005-12-10 15:16:42 得分 12
这个问题碰到过,哈哈!
现在不做Java了,快忘记了。
1 先讲原理:XML传过来是 UTF-8编码的,你只有getBytes("UTF-8")才可以正确取得到。然后转换成正确的编码.
比如你是从一个xml文件提交到一个Jsp的,在getParameter()之前,你就应该设置好request流的编码格式request.setCharacterEncoding("UTF-8")。要不然,getParameter会采用默认的编码来转换,到时你得到的可能会有一些?号出现。
告诉你一个根本原则:
你用getBytes("ISO8859-1"),把你得到的字节码打印出来,看是什么编码(这需要你对各种编码了解,如果有资料,需要学习二个小时就差不多知道各种编码了,在网上找资料学习大概要二天时间)。知道是什么编码后再用 getBytes("编码");得到然后转换你要的编码。
不过就你的情况来看,我怀疑你在getBytes()之前编码就乱了。所以才会出现乱码,你现在的解码好像没有什么问题。
因为UTF-8是用1-3个字节来表示编码的,而其它编码要么是一个字节,要么是二个字节。好成对,就算错了,也容易恢复,但UTF-8是奇数,错了,就恢复不了了。
Top
34 楼wjvonline()回复于 2005-12-10 15:38:27 得分 5
用struts碰到过类似的问题,试了很多种方法都不行,最后把过滤类、数据源等等所有的编码都改成GB2312就OK了,不过,我做的那个东西只针对中文,所以无所谓Top
35 楼tramp73(梦☆★星)回复于 2005-12-11 23:16:43 得分 1
mark
下回再来看,学到东西了
谢谢回贴的各位Top
36 楼dylyonia(不以物悲,不以己喜)回复于 2005-12-12 10:03:10 得分 0
多谢各位来回帖子,顶帖Top
37 楼dylyonia(不以物悲,不以己喜)回复于 2005-12-12 10:03:24 得分 0
本人受益匪浅Top
38 楼dylyonia(不以物悲,不以己喜)回复于 2005-12-12 10:20:58 得分 0
想必各位也看到了流程,梳理一下:
1,首先mysql数据库是utf-8的编码,目前我在字段中的内容即为一个xml文件的内容:
数据库表--page---里面有一个字段xml_config,其中有一条记录对应的这个字段的内容是:
<?xml version="1.0" encoding="UTF-8"?>
<xml-body>
<page title="登陆" desc="美丽的地方" banner="/image/test.jpg" article="login" encode="UTF-8" align="0" showMode="0" maxListCount="12">
<ico url="/image/ico/1.png"></ico>
</page>
</xml-body>
其中这个里面encoding="UTF-8"。
2,保存了这个数据库内容后,page title="登陆"处马上成为page title="??"的格式,我现在认为目前,这个为数据库把内容转为“UTF-8”编码格式。
3,然后,我将有一个叫做Pageconfig的类,作用就是专门去取这个里边的内容,具体过程还有其他的类的作用,取这个里面的比如title,desc,banner这些xml属性的内容是用这个方法。代码片断如下:
static PageConfig newPageConfig(String xml)
{
SAXBuilder builder = new SAXBuilder();
PageConfig ret = new PageConfig();
try
{
InputStream st = new ByteArrayInputStream(xml.getBytes("ISO8859-1"));
//这里我先按照数据库的编码方式“ISO8859-1”取到标准码。
Document doc = builder.build(st);
Element root = doc.getRootElement();
Element page = root.getChild("page");
ret.title = new String(page.getAttributeValue("title").getBytes("UTF-8"),"UTF-8");
//然后转成了UTF-8的格式,以便我有一个叫filter类的output函数生成wml页面去显示给用户,所以我现在需要在pageConfig类中首先转化title为UTF-8格式。
fiter的函数output首先转化这个title的内容为ISO8859-1,然后转化为UTF-8
public void outPut(String str)
{
try
{
str = new String(str.getBytes("UTF-8"), "iso-8859-1");
}
catch (UnsupportedEncodingException e)
{
System.out.println(e.getMessage());
e.printStackTrace();
}
ServletOutputStream out = null;
try
{
out = response.getOutputStream();
out.println(str);
}
catch (IOException ex)
{
System.out.println(ex.getMessage());
ex.printStackTrace();
}
}
看看我目前的这个思路是否正确?
Top
39 楼squallzeng(小呆呆)回复于 2005-12-12 17:01:23 得分 8
LZ,你首先要保证你存放在数据库的数据没有乱码才可以的,然后你取出来的时候如果是乱码你再把它进行转换就可了。你如果你存放的时候就是乱码的话,那么后你不管如何处理都是乱码的。所以建议你再确认一下你的数据库本身的编码是什么?这样子你再按数据库的编码格式存放到数据库中去才能解决根本的问题。其它楼上有好多的朋友都告诉你了如何转换了。祝LZ好运!!!!Top
40 楼niko7(掠水无痕)回复于 2005-12-12 18:28:22 得分 15
java处理字符时内部一律采用Unicode。外面的转码如果都解决不了,我估计是从开始就错了。
介于xml文件的特殊性,建议楼主做如下测试:用 IE 打开你的xml文件,看看是否正常。
我估计是不正常的。
一般而言,文本文件保存时采用本地编码,中文windows采用gbk编码,然而你的xml头中申明了utf-8,造成了不统一,如果不用特殊方法解析,在内存中从读入文件开始就是错的了。而且转不出来。
再试试看,<?xml version="1.0" encoding="UTF-8"?>
改成<?xml version="1.0" encoding="GBK"?>
或者<?xml version="1.0" encoding="GB2312"?>
再用IE测试一下,估计会正常了。
关于xml文件出现乱码,一般都与java.io下面的reader/writer有关,因为它们使用本地默认编码。但在xml文件中,xml文件有自己的一套,不一定采用这些编码。
关注Top
41 楼dylyonia(不以物悲,不以己喜)回复于 2005-12-13 10:47:16 得分 0
问题已经解决,现在把最后解决过程描述一下:
1,首先,我修改了xml文件的编码方式,改为“GBK”编码格式的xml;
<?xml version="1.0" encoding="GBK"?>
2, 在访问数据库的配置文件中,访问mysql的url 参数修改为:useUnicode=true&characterEncoding=GBK;
3,在我的Pageconfig的类修改取xml的xml.getBytes("ISO8859-1"));
InputStream st = new ByteArrayInputStream(xml.getBytes("ISO8859-1"));
这个我先前也曾经尝试过,但没有匹配成功;
4,需要修改mysql数据库的默认编码:
default-character-set=GBK
default-collation=GBK
5,关于以下的取值,不做任何转码;
ret.title =page.getAttributeValue("title");
6,因为我有一个专门最后生成wml页面的转码的类,将会转成utf-8格式;
完,谢谢大家!!!
Top




