字符编码转换问题,分很多,高手请进来

dylyonia 2005-12-08 10:47:58
代码片断如下:

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分!!!
...全文
790 41 打赏 收藏 转发到动态 举报
写回复
用AI写文章
41 条回复
切换为时间正序
请发表友善的回复…
发表回复
dylyonia 2005-12-13
  • 打赏
  • 举报
回复
问题已经解决,现在把最后解决过程描述一下:

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格式;

完,谢谢大家!!!


dylyonia 2005-12-12
  • 打赏
  • 举报
回复
想必各位也看到了流程,梳理一下:
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();
}
}


看看我目前的这个思路是否正确?










dylyonia 2005-12-12
  • 打赏
  • 举报
回复
本人受益匪浅
dylyonia 2005-12-12
  • 打赏
  • 举报
回复
多谢各位来回帖子,顶帖
niko7 2005-12-12
  • 打赏
  • 举报
回复
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文件有自己的一套,不一定采用这些编码。

关注
squallzeng 2005-12-12
  • 打赏
  • 举报
回复
LZ,你首先要保证你存放在数据库的数据没有乱码才可以的,然后你取出来的时候如果是乱码你再把它进行转换就可了。你如果你存放的时候就是乱码的话,那么后你不管如何处理都是乱码的。所以建议你再确认一下你的数据库本身的编码是什么?这样子你再按数据库的编码格式存放到数据库中去才能解决根本的问题。其它楼上有好多的朋友都告诉你了如何转换了。祝LZ好运!!!!
tramp73 2005-12-11
  • 打赏
  • 举报
回复
mark

下回再来看,学到东西了

谢谢回贴的各位
qzjackie 2005-12-10
  • 打赏
  • 举报
回复
学习了
wjvonline 2005-12-10
  • 打赏
  • 举报
回复
用struts碰到过类似的问题,试了很多种方法都不行,最后把过滤类、数据源等等所有的编码都改成GB2312就OK了,不过,我做的那个东西只针对中文,所以无所谓
potency 2005-12-10
  • 打赏
  • 举报
回复
这个问题碰到过,哈哈!
现在不做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是奇数,错了,就恢复不了了。
Helloworld2004 2005-12-10
  • 打赏
  • 举报
回复
所有转码程序的核心只有一句:先转成unicode编码,再转成所需要的编码
常遇道 2005-12-10
  • 打赏
  • 举报
回复
mysql版本要在4.0以上才有这个文件

KongChen 2005-12-09
  • 打赏
  • 举报
回复
我觉得在怎么转也是??啊,由下面这句话决定的:
try
{
str = new String(str.getBytes("UTF-8"), "iso-8859-1");
}
iso-8859-1字符集里面有中文吗?
dylyonia 2005-12-09
  • 打赏
  • 举报
回复
find / -name my.cnf

linux下/usr/local/mysql目录竟然没找到,如何改mysql的默认字符编码
常遇道 2005-12-09
  • 打赏
  • 举报
回复
因为mysql的编码机制跟PO的编码机制是不一样的。然而单用一般的转码方式是不起作用。
在mysql安装路径下有一个my.ini文件设置default-character-set=GBK
dylyonia 2005-12-09
  • 打赏
  • 举报
回复
mysql的编码为UTF-8
挑大梁 2005-12-09
  • 打赏
  • 举报
回复
是不是mysql的问题
dylyonia 2005-12-09
  • 打赏
  • 举报
回复
各位:mysql客户端显示为“??”。
kidonline 2005-12-09
  • 打赏
  • 举报
回复
我觉得应该是mysql没有存成utf-8编码的缘故。看看my.ini文件中的default-character-set属性是什么。还有在mysql客户端看看能不能正确显示查出来的数据。
fangcheng007 2005-12-08
  • 打赏
  • 举报
回复
getAttributeValue("title").getBytes("ISO8859-1"),"GBK");或getAttributeValue("title").getBytes("ISO8859-1"),"gb2312");
加载更多回复(21)

67,515

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧