首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 问几个编码问题啊! [已结贴,结贴人:nil2000]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • nil2000
    • 等级:
    发表于:2008-07-13 23:03:31 楼主
    问几个编码问题啊!

    1.从DB读出来的数据是什么编码?是否DB里内容是什么编码读出来就是什么编码?

    2.一个文本文件,用UE转换编码为UTF-8,那我用JAVA默认读出来什么编码?也是UTF-8吗?

    3.我用fileWrite写一个文件,那编码会是什么的?默认按照操作系统的编码写文件吗??

    4.我在JSP页面上设置charset=UTF-8 那POST出去的是不是就是UTF-8?我用getParameter("name")得到的是不是也是UTF-8的?

    5.还经常发现些特别的乱码,前面的都正确如:运动呿、交通障碿、损坏800平方籿(运动员、交通障碍、损坏800平方米)不知道
    这种是怎么形成的?是否是乱码?怎么解决?
    因为我发现我不管怎么转都是这样的,我想是不是我用dw或者ue打开时候编辑器造成?其实他们已经是正确的了?
    119  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-13 23:03:351楼 得分:0
    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【nil2000】截止到2008-07-13 23:03:34的历史汇总数据(不包括此帖):
    发帖的总数量:63                      发帖的总分数:12998                    每贴平均分数:206                     
    回帖的总数量:64                      得分贴总数量:4                        回帖的得分率:6%                     
    结贴的总数量:60                      结贴的总分数:12459                   
    无满意结贴数:0                        无满意结贴分:0                       
    未结的帖子数:3                        未结的总分数:539                     
    结贴的百分比:95.24 %              结分的百分比:95.85 %                 
    无满意结贴率:0.00  %              无满意结分率:0.00  %                 
    值得尊敬
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-14 00:26:522楼 得分:0
    help lz up
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-14 00:40:443楼 得分:0
    引用 2 楼 wensheng_zh2007 的回复:
    help lz up
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-14 07:57:144楼 得分:0
    1,流行的关系数据库系统都支持数据库  encoding,也就是说在创建数据库时可以指定它自己的字符集设置,数据库的数据以指定的编码形式存储。当应用程序访问数据时,在入口和出口处都会有  encoding  转换。对于中文数据,应当保证数据的完整性。GB2312,GBK,UTF-8  等都是可选的数据库  encoding;如果选择  ISO8859-1(8-bit  SBCS),那么应用程序在写数据之前须将  16Bit  的一个汉字或  Unicode  拆分成两个  8-bit  的字符,读数据之后则需将两个字节合并起来,同时还有判别其中的  SBCS  字符。没有充分利用数据库  encoding  的作用,反而增加了编程的复杂度,ISO8859-1不是推荐的数据库  encoding。JSP/Servlet编程时,可以先用数据库管理系统提供的功能检查其中的中文数据是否正确。 所以说,DB里内容是什么编码读出来就是什么编码 。 
       
    2,JAVA程序中一般得到的是Unicode。写数据时则相反。 

    3,用fileWrite写一个文件,如果你不指定,就会按照操作系统的编码写文件。

    4,post和getParameter这两者传递参数时所用的编码不一定是一样的。在 Tomcat 中似乎 Get 的编码方式是根据页面中指定的编码方式,而 Post 则是一直使用同一种编码方式,可在 Tomcat 的 server.xml 中配置。

    5,对于JSP无法正确显示汉字,不是由于你使用的某某编辑器造成。而是需要你了解 Jsp/Servlet 的运行过程。注意jsp的输出content-type为utf-8,html 标记内容的头的content-type 也设定为utf-8。
    (1),servlet接收客户请求信息时,在调用getParameter()之前掉一次request.setCharacterEncoding("UTF-8");就可了。之后接收的信息可以直接存入SQLSERVER,不会出现乱码。
    (2),从数据库读出地汉字不用作任何转换,直接OUT.PRINTLN即可。
    很简单吧。 用得着那么繁琐一大堆吗。注意UTF-8可是国际编码。

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zidasine
    • 等级:
    发表于:2008-07-14 08:36:595楼 得分:0
    ls回复很全面,
    楼主可以结合上面的自己去实践一下
    把你的问题自己去试一下可以加深理解
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-14 08:42:096楼 得分:0
    该回复于2008-07-15 09:56:36被版主删除
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-14 08:54:047楼 得分:0
    引用 4 楼 javazhuobin 的回复:
    1,流行的关系数据库系统都支持数据库  encoding,也就是说在创建数据库时可以指定它自己的字符集设置,数据库的数据以指定的编码形式存储。当应用程序访问数据时,在入口和出口处都会有  encoding  转换。对于中文数据,应当保证数据的完整性。GB2312,GBK,UTF-8  等都是可选的数据库  encoding;如果选择  ISO8859-1(8-bit  SBCS),那么应用程序在写数据之前须将  16Bit  的一个汉字或  Unicode  拆分成两个  8-bit  的字符,…



    这个回答精彩!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-14 08:54:478楼 得分:0
    up
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-14 09:05:409楼 得分:0
    4.我在JSP页面上设置charset=UTF-8 那POST出去的是不是就是UTF-8?我用getParameter("name")得到的是不是也是UTF-8的?
    POST的出去的不是UTF-8,你要用String str = new String(request.getParameter("name").getBytes("iso8859-1"),"utf-8");
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-14 09:05:4210楼 得分:0
    4.我在JSP页面上设置charset=UTF-8   那POST出去的是不是就是UTF-8?我用getParameter( "name ")得到的是不是也是UTF-8的?  
    POST的出去的不是UTF-8,你要用String   str   =   new   String(request.getParameter( "name ").getBytes( "iso8859-1 "), "utf-8 ");
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-14 09:08:1611楼 得分:0
    java里面的对象都是放在heap中,引用是可以放到stack中的,所以说引用s是对象肯定是错误的说法,String  s=new  String("xyz");在编绎时会把"xyz"作为常量放到类的常量池中,运行时调用new指令时会再在堆中产生一个String类型的对象,把常量池中的"xyz"的值复制过来,然后让s指向堆中的String对象,所以应该是两个对象,一个是String类的Class对象中的常量字符串对象,一个是new出来的堆中的字符串对象.而String  s="abc";则只产生了一个对象,就是String类的Class对象中的常量字符串对象,它只是让s指向了常量池中的那个常量字符串对象.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-14 09:08:4412楼 得分:0
    2,JAVA程序中一般得到的是Unicode。写数据时则相反。 

    3,用fileWrite写一个文件,如果你不指定,就会按照操作系统的编码写文件。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-14 10:47:0513楼 得分:0
    6楼太牛鼻了,什么问题都遇到过,在下佩服
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-14 11:26:3114楼 得分:0
    要是就一种编码方式就好了,可是...
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • M_song
    • 等级:
    发表于:2008-07-14 11:30:4815楼 得分:0
    好好看篇文章;
    http://blog.csdn.net/WebDynpro/archive/2006/10/11/1329533.aspx
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • M_song
    • 等级:
    发表于:2008-07-14 11:31:2416楼 得分:0
    字符集转换的基本思想很简单,用某种字符编码规则编码,就用什么编码规则解码,
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-14 13:30:0317楼 得分:0
    引用楼主 nil2000 的帖子:
    问几个编码问题啊!

    1.从DB读出来的数据是什么编码?是否DB里内容是什么编码读出来就是什么编码?

    2.一个文本文件,用UE转换编码为UTF-8,那我用JAVA默认读出来什么编码?也是UTF-8吗?

    3.我用fileWrite写一个文件,那编码会是什么的?默认按照操作系统的编码写文件吗??

    4.我在JSP页面上设置charset=UTF-8 那POST出去的是不是就是UTF-8?我用getParameter("name")得到的是不是也是UTF-8的?

    5.还经常发现些特别的乱码,前面的都正确如:运动呿、交通障碿、损坏800平方籿(运动员、交通障碍、损坏800平方米)不知道
    这种是怎么形成的?是否是乱码?怎么解决?
    因为我发现我不管怎么转都是这样的,我想是不是我用dw或者ue打开时候编辑器造成?其实他们已经是正确的了?


    1. 数据库服务器,数据库,表,甚至文本类型字段都有默认字符集,另外执行查询得到的结果集也有自己的字符集。服务器默认字符集是建库时你不指定数据库使用何种字符集时它所用采用的字符集,数据库字符集与之相似,当为数据库建表时如果不指定字符集那它采用数据库默认字符集,文本字段字符集同上。这几个字符集决定你存入数据库的文本信息使用的编码,而查询时查到的数据会自动转换成结果集采用的编码,这个过程中如果数据库文本数据的编码是 UTF-8 而结果集编码是 ISO8859-1 就有可能会出现乱码问题,因为不是所有 UTF-8 字符在 ISO8859-1 中都有对应编码。注意这里是有可能,但不一定出现乱码,如果你的查询结果中只有 UTF-8 编码的英文字符,那这个转换编码的过程中是不会出现乱码的,所以测试时要全面。
    2. 文件本身编码无论是什么,读到 Java 程序中时编码都会转换为 Unicode,如果读取时拿错误的字符集(UTF-8外的)对文本文件进行解码,那读到 Java 程序中的文本就会出现乱码。
    3. 你说的对。
    4. 如果你的 JSP 页面使用了 contentType="text/html; charset=UTF-8" 那客户端收到的 HTML 代码就是用 UTF-8 编码的,而 POST 提交方式的表单表单数据使用的编码默认是网页本身使用的编码,对于上面例子就是 UTF-8,在 request.getParameter("name") 前应该使用 request.setCharacterEncoding("UTF-8") 告诉 request 我要使用 UTF-8 编码来解析表单中的数据(你不指定它默认使用 ISO8859-1 当然会出乱码),这样再读取请求参数就不会有乱码问题了。
    5. 这应该是编码值相近的中文字符集间转码造成的。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-14 16:58:4618楼 得分:0
    ding
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-16 10:51:5619楼 得分:0
    学学
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • nil2000
    • 等级:
    发表于:2008-07-23 17:24:4120楼 得分:0
    _sb.toString()是一个从utf-8格式文件读出来的字符串!
    我想把读出来的文件写成一个gb2312格式的html文件!可是
    编码换了无数个了写出来的结果都是utf8的!不知道为什么

    FileWriter fw = new FileWriter(_path);
    BufferedWriter bw = new BufferedWriter(fw);
    bw.write(new String(_sb.toString().getBytes("utf-8"),"GB2312"));
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-23 17:41:1121楼 得分:0
    引用 19 楼 ldy214 的回复:
    学学
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-23 19:37:0022楼 得分:0
    Java code
    import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; public class Txt2Html { public static void main(String[] args) { String pathSource = "D:/tempfolder/source.txt"; String charsetSource = "UTF-8"; String pathTarget = "D:/tempfolder/target.htm"; String charsetTarget = "GBK"; InputStreamReader isr = null; OutputStreamWriter osw = null; try { isr = new InputStreamReader(new FileInputStream(pathSource), charsetSource); osw = new OutputStreamWriter(new FileOutputStream(pathTarget), charsetTarget); //...... osw.flush(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (isr != null) { try { isr.close(); } catch (IOException e) { e.printStackTrace(); } } if (osw != null) { try { osw.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • nil2000
    • 等级:
    发表于:2008-07-24 11:15:5123楼 得分:0
    .
    .
    .
    BufferedReader br2 = new BufferedReader(new InputStreamReader(
    new FileInputStream(_filePath), "UTF-8"));
    String line2 = br2.readLine();
    while (line2 != null) {
    _sb.append(line2).append("\r\n");
    line2 = br2.readLine();
    }
    .
    .
    .
    FileOutputStream fos = new FileOutputStream(_path);
    fw = new OutputStreamWriter(fos, "GBK");
    BufferedWriter bw = new BufferedWriter(fw);
    bw.write(_sb.toString());
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • nil2000
    • 等级:
    发表于:2008-07-24 11:16:0724楼 得分:0
    还是不行啊

    .
    .
    .
    BufferedReader br2 = new BufferedReader(new InputStreamReader(
    new FileInputStream(_filePath), "UTF-8"));
    String line2 = br2.readLine();
    while (line2 != null) {
    _sb.append(line2).append("\r\n");
    line2 = br2.readLine();
    }
    .
    .
    .
    FileOutputStream fos = new FileOutputStream(_path);
    fw = new OutputStreamWriter(fos, "GBK");
    BufferedWriter bw = new BufferedWriter(fw);
    bw.write(_sb.toString());
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-24 11:24:1325楼 得分:0
    你把你的代码帖出来,帖完整一些,光从描述中很难发现问题出在哪儿。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • nil2000
    • 等级:
    发表于:2008-07-24 11:48:1426楼 得分:0
    Java code
    String _rPath = ""; String _wPath = ""; BufferedReader br2 = new BufferedReader(new InputStreamReader( new FileInputStream(_rPath), "UTF-8")); String line2 = br2.readLine(); StringBuffer _sb = new StringBuffer(); while (line2 != null) { _sb.append(line2).append("\r\n"); line2 = br2.readLine(); } if (br2 != null) br2.close(); FileOutputStream fos = new FileOutputStream(_wPath); Writer fw = new OutputStreamWriter(fos, "GBK"); BufferedWriter bw = new BufferedWriter(fw); bw.write(_sb.toString()); if (bw != null) bw.close(); if (fw != null) fw.close();
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-24 12:28:5827楼 得分:119
    我试过了,能正常完成编码转换,你的代码也没问题,你是怎么看你文件的编码的?

    Java code
    import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; public class Txt2Html { public static void main(String[] args) { String pathSource = "D:/test/source.txt"; String charsetSource = "UTF-8"; String pathTarget = "D:/test/target.htm"; String charsetTarget = "GB2312"; InputStreamReader isr = null; OutputStreamWriter osw = null; try { isr = new InputStreamReader(new FileInputStream(pathSource), charsetSource); osw = new OutputStreamWriter(new FileOutputStream(pathTarget), charsetTarget); //************************************************************************** BufferedReader br2 = new BufferedReader(isr); String line2 = br2.readLine(); StringBuffer _sb = new StringBuffer(); while (line2 != null) { _sb.append(line2).append("\r\n"); line2 = br2.readLine(); } BufferedWriter bw = new BufferedWriter(osw); bw.write(_sb.toString()); //************************************************************************** bw.flush(); osw.flush(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (isr != null) { try { isr.close(); } catch (IOException e) { e.printStackTrace(); } } if (osw != null) { try { osw.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lujunjsp
    • 等级:
    发表于:2008-07-24 13:27:4128楼 得分:0
    引用 4 楼 javazhuobin 的回复:
    1,流行的关系数据库系统都支持数据库  encoding,也就是说在创建数据库时可以指定它自己的字符集设置,数据库的数据以指定的编码形式存储。当应用程序访问数据时,在入口和出口处都会有  encoding  转换。对于中文数据,应当保证数据的完整性。GB2312,GBK,UTF-8  等都是可选的数据库  encoding;如果选择  ISO8859-1(8-bit  SBCS),那么应用程序在写数据之前须将  16Bit  的一个汉字或  Unicode  拆分成两个  8-bit  的字符,…

    正解
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天