- 浏览: 481996 次
- 性别:
- 来自: 沈阳
文章分类
- 全部博客 (437)
- Windows设置 (2)
- oracle数据库 (39)
- bug--jsp (4)
- j2se (13)
- js (40)
- bug-tomcat不能启动程序 (1)
- Hibernate (29)
- eclipse (20)
- java (65)
- 设计模式 (6)
- bug (18)
- PL/SQL (11)
- 前台 (5)
- 杂谈 (25)
- UML (1)
- jdbc编程 (2)
- 技术调研 (1)
- 数据通信 (2)
- ios (1)
- servlet自学笔记 (10)
- tomcat (9)
- SQL学习笔记 (6)
- java工具 (1)
- 数据库设计 (4)
- javascript (10)
- jsp (11)
- struts (17)
- ajax (7)
- linix/Unix (6)
- 资源 (3)
- spring (14)
- 算法 (5)
- 计算机网络 (2)
- http (5)
- c++ (2)
- web应用 (3)
- jvm (5)
- java中的字符编码 (14)
- java代码库 (2)
- classloader (1)
- 读书笔记 (1)
- c (1)
- 开源软件 (1)
- svn (1)
- AOP (1)
- java序列化 (1)
- 多线程 (4)
- The legendary programmers (1)
- Apache http Server (1)
- html tag (3)
- struts1.X学习笔记 (5)
- buffalo (1)
- 自己收藏 (0)
- TOEFL(IBT) (1)
- 网络翻墙 (0)
- 编译原理 (1)
- 书籍推荐 (1)
- css (10)
- javaee环境搭建资料 (1)
- 开源工具 (1)
- 美国生活 (1)
- spring自学 (3)
- log4j (3)
- 算法与数据结构 (5)
- 病毒,插件处理大全 (1)
- flex (2)
- webservice (1)
- git (7)
- cs (1)
- html (4)
- javaee (6)
- 开车 (0)
- springmvc (3)
- 互联网架构 (2)
- intellij idea (18)
- maven (15)
- mongodb (2)
- nginx (1)
- react (3)
- java基础例子 (2)
- springboot (2)
- 培训 (5)
- mysql (3)
- 数据库 (3)
- 生活 (2)
- intellij (3)
- linux (2)
- os (3)
最新评论
-
潇洒天涯:
[color=blue][color=cyan] ...
oracle 通过 nvl( )函数sql 查询时为 空值 赋默认值 -
hekai1990:
受教了..
oracle中的varchar2
今天又研究了一下字符编码。写了些测试代码,算是比较了解了。
主要是研究 iso-8859-1
建议先看这篇:《第二篇:JAVA字符编码系列二:Unicode,ISO-8859-1,GBK,UTF-8编码及...》
http://my.oschina.net/whp/blog/36846
然后再看看 iso-8859-1 的定义。
http://baike.baidu.com/view/2613676.htm
这一句话非常关键:
因为ISO-8859-1编码范围使用了单字节内的所有空间,在支持ISO-8859-1的系统中传输和存储其他任何编码的字节流都不会被抛弃。换言之,把其他任何编码的字节流当作ISO-8859-1编码看待都没有问题。这是个很重要的特性,MySQL数据库默认编码是Latin1就是利用了这个特性。
在工作中,从 web 提交的数据,到了 web 容器后,变成了 iso-8859-1 的字符串。
可以认为,被执行了如下代码:
byte[] buf_gbk = s.getBytes("gbk");
String sIso88591 = new String(buf_gbk, "iso-8859-1");
所以,我们获取数据时需要执行:
byte[] buf_iso88591 = sIso88591.getBytes("iso-8859-1");
String sGbk = new String(buf_iso88591, "gbk");
将编码转回 gbk。
我们本应该用gbk的编码来读取数据并解码成字符串,但结果却采用了ISO-8859-1的编码,导致生成一个错误的字符串。要恢复,就要先把字符串恢复成原始字节数组,然后通过正确的编码gbk再次解码成字 符串(即把以gbk编码的数据转成unicode的字符串)。注意,jvm中的字符串永远都是unicode编码的。
但编码转换并不是负负得正那么简单,这里我们之所以可以正确地转换回来,是因为 ISO8859-1 是单字节编码,所以每个字节被按照原样转换为String ,也就是说,虽然这是一个错误的转换,但编码没有改变,所以我们仍然有机会把编码转换回来!
看完这两篇后,写了段测试代码:
- package com.fsti.enc;
- public class EncUtil {
- public static String getHex(byte b)
- {
- String hex = Integer.toHexString(b & 0xff);
- if(hex.length()==1)
- {
- hex = "0" + hex;
- }
- return hex;
- }
- public static void showBytes(byte[] buffer)
- {
- for(int i=0; i<buffer.length; i++)
- {
- System.out.print( getHex(buffer[i]) + " ");
- }
- System.out.println();
- }
- public static void showChar(String s)
- {
- for(int i=0; i<s.length(); i++)
- {
- System.out.print( getHex((byte)(s.charAt(i))) + " ");
- }
- System.out.println();
- }
- }
- package com.fsti.enc;
- /**
- * http://baike.baidu.com/view/2613676.htm
- * @author zch
- * @date Apr 20, 2012
- *
- */
- public class Test_Iso8859_1 extends EncUtil{
- public static String s =
- "http://baike.baidu.com/view/2613676.htm\r\n" +
- " ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF," +
- "0x00-0x7F之间完全和ASCII一致,0x80-0x9F之间是控制字符,0xA0-0xFF之间是文字符号。" +
- "ISO-8859-1收录的字符除ASCII收录的字符外,还包括西欧语言、希腊语、泰语、阿拉伯语、希伯来语" +
- "对应的文字符号。欧元符号出现的比较晚,没有被收录在ISO-8859-1当中。\r\n" +
- " 因为ISO-8859-1编码范围使用了单字节内的所有空间,在支持ISO-8859-1的系统中传输和存储其他任何" +
- "编码的字节流都不会被抛弃。换言之,把其他任何编码的字节流当作ISO-8859-1编码看待都没有问题。这是" +
- "个很重要的特性,MySQL数据库默认编码是Latin1就是利用了这个特性。ASCII编码是一个7位的容器," +
- "ISO-8859-1编码是一个8位的容器。\r\n" +
- " Latin1是ISO-8859-1的别名,有些环境下写作Latin-1。";
- public static void testChar(char c) throws Exception
- {
- //char c = '中';
- System.out.println( c );
- System.out.println( (int)c );
- System.out.println( Integer.toHexString(c) );
- if(c>255)
- {
- byte low = (byte)(c / 256);
- byte hight = (byte)(c % 256);
- System.out.println( getHex(low) );
- System.out.println( getHex(hight) );
- }
- }
- public static void testString() throws Exception
- {
- for(int i=0; i<s.length(); i++)
- {
- testChar(s.charAt(i));
- }
- }
- public static void testString_02() throws Exception
- {
- StringBuffer sb = new StringBuffer();
- for(int i=0; i<s.length(); i++)
- {
- char c = s.charAt(i);
- if(c>255)
- {
- char hight = (char)(c / 256);
- char low = (char)(c % 256);
- sb.append(hight);
- sb.append(low);
- }
- else
- {
- sb.append(c);
- }
- }
- String sIso88591 = sb.toString();
- System.out.println(sIso88591);
- byte[] buf = sIso88591.getBytes("iso-8859-1");
- showBytes(buf);
- String sUtf_8 = new String(buf, "gbk");
- System.out.println(sUtf_8);
- }
- public static void testString_03() throws Exception
- {
- System.out.println("s:" + s);
- byte[] buf_gbk = s.getBytes("gbk");
- System.out.println("buf_gbk:");
- showBytes(buf_gbk);
- StringBuffer sb = new StringBuffer();
- for(int i=0; i<buf_gbk.length; i++)
- {
- char c = (char)buf_gbk[i];
- sb.append( c );
- System.out.println(c + ":" + getHex((byte)c));
- }
- String sIso88591 = sb.toString();
- System.out.println("sIso88591:");
- System.out.println(sIso88591);
- System.out.println("showChar(sIso88591):");
- showChar(sIso88591);
- byte[] buf_iso88591 = sIso88591.getBytes("iso-8859-1");
- System.out.println("buf_iso88591:");
- showBytes(buf_iso88591);
- String sUtf_8 = new String(buf_iso88591, "gbk");
- System.out.println(sUtf_8);
- }
- public static void testString_04() throws Exception
- {
- System.out.println("s:" + s);
- byte[] buf_gbk = s.getBytes("gbk");
- System.out.println("buf_gbk:");
- showBytes(buf_gbk);
- String sIso88591 = new String(buf_gbk, "iso-8859-1");
- System.out.println("sIso88591:");
- System.out.println(sIso88591);
- System.out.println("showChar(sIso88591):");
- showChar(sIso88591);
- byte[] buf_iso88591 = sIso88591.getBytes("iso-8859-1");
- System.out.println("buf_iso88591:");
- showBytes(buf_iso88591);
- String sGbk = new String(buf_iso88591, "gbk");
- System.out.println(sGbk);
- }
- /**
- * @param args
- */
- public static void main(String[] args) throws Exception{
- //testString();
- //testString_02();
- testString_04();
- }
- }
参考资料:
http://my.oschina.net/whp/blog/36846
http://baike.baidu.com/view/2613676.htm
发表评论
-
【转】字符编码笔记:ASCII,Unicode 和 UTF-8
2017-12-12 19:09 414今天中午,我突然想搞清楚 Unicode 和 UTF-8 之 ... -
【转】HTTP协议及浏览器编码行为
2012-12-19 13:48 1335转自:http://blog.csdn.net/hap ... -
【转】JSP中request.getParameter()乱码问题
2012-09-11 14:12 3077第一,存文件必须以一种编码存;读文件也必须以一种编码读,如不特 ... -
【转】说说字符集和编码
2012-09-10 22:41 762很久很久以前,有一 ... -
【转】解决get方法传递URL参数中文乱码问题
2012-08-27 22:18 0来自:http://www.javaeye.com/top ... -
判断一个文本文件的编码格式
2012-08-27 17:40 0文件的字符集在Windows下有两种,一种是ANSI,一 ... -
【转】为什么用记事本保存的UTF-8格式的java文件不能编译通过?
2012-08-27 17:26 0Windows记事本默认保存的ANSI格式,java编 ... -
Eclipse中的Text File Encoding与文本文件的编码的关系
2012-08-27 17:25 1458当我们编写一个txt文件或jsp页面时,我们用默认的一种编码区 ... -
【转】有关保存文件时的编码选项与html/jsp页面设定字符编码的配置
2012-08-27 16:10 738分两种情况介绍 注:首先,各位得对一次 请求/响应 的 ... -
【转】内码转换技术
2012-08-27 16:04 0内码转换技术 好吧 ... -
【转】JAVA字符编码系列一:Unicode,GBK,GB2312,UTF-8概念基础
2012-08-27 13:25 930这两天抽时间又总结/整理了一下各种编码的实际编码方式, ... -
【转】又一篇介绍计算机字符编码的好文——计算机中的字是如何处理的?
2012-08-26 21:50 0如果你用放大镜看一下,可以看出屏幕上的字是由一个一个的像素点组 ... -
【转】利用javascript完成URLEncoding功能
2012-08-27 11:25 720日常开发中,经常遇到由于页面不一致,导致由页面表单提交或超连接 ... -
【转】Java编码规范,在您进行编码之前应该阅读的规范
2012-08-27 11:25 796本文转载于:http://www.web3d.com. ... -
【转】第三篇:JAVA字符编码系列三:Java应用中的编码问题
2012-08-26 21:42 769这部分采用重用机制,引用一篇文章来完整本部分目标。 来源 ... -
【转】第二篇:JAVA字符编码系列二:Unicode,ISO-8859-1,GBK,UTF-8编码
2012-08-26 21:17 9191、函数介绍 在Java中,字符串用统一的Unico ... -
【转】form表单提交数据编码方式及tomcat的接受编码方式
2012-08-26 21:15 1548form有2中方法把数据提交给服务器,get和post,分别说 ... -
【转】TOMCAT中文问题,解决(全)(转载)
2012-09-11 14:30 651TOMCAT中文问题解决了.其他应用服务器的问题也可以 ...
相关推荐
关于JAVA字符编码:Unicode,ISO-8859-1,GBK,UTF-8编码及相互转换
JAVA字符编码:Unicode,ISO-8859-1,GBK,UTF-8编码及相互转换
ava支持UTF 8 ISO 8859 1 GBK等各种字体编码 可笔者发现Java中字体编码的问题仍难倒了不少程序员 网上虽然也有不少关于在Java中如何正确显示中文的文章 但都不够全面 笔者特意总结如下 影响Java中字体编码正确显示...
乱码 编码方式解决 gbk ISO8859-1 utf8 编码 乱码 编码方式解决 gbk ISO8859-1 utf8 编码
各种字符集编码表,包括iso-8859-1,gbk,gb18030, unicode,以及字符集的转换说明(主要是Java国际化的一些字符集转化说明)
实现不同文件代码类型,诸如 Shift_JIS、EUC-JP、ISO-2022-JP、 Unicode、UTF-8 的相互変換,FREE软件
通过Java实现文件编码的转换功能,提供了Demo用于测试。 目前仅测试了GB2312 UTF-8之间的相互转换,ISO-8859-1不支持。其余的没有测试
Java支持多种字符编码类型,包括ASCII、ISO-8859-1、UTF-8等,每种编码都有其特定的应用场合和优势。 Java字符编码的使用与转换 Java提供了丰富的API用于字符编码的处理,如Charset类可以获取系统默认的字符编码,...
java编码转换工具
北京动力节点-Java编程零基础教程-051-Java基本语法-ISO8859-1.avi 北京动力节点-Java编程零基础教程-052-Java基本语法-GB码.avi 北京动力节点-Java编程零基础教程-053-Java基本语法-Unicode码.avi 北京动力节点...
由于Web容器使用了ISO-8859-1的编码格式,所以在Web应用的业务处理中也会使用ISO-8859-1编码格式。虽然浏览器提交的请求使用的是中文编码格式UTF-8,但经过业务处理中的ISO-8859-1编码,仍然会出现中文乱码现象。...
-DtoEncoding=ISO-8859-15 switch-encoding ant compile BUILD FAILED 。 这个怎么运作 错误编码的编译失败是由以下任一原因引起的: 使€的字符文字无法用错误的编码表示。 利用Java的要求,switch语句中的所有case...
CodeDetectorDetect File encoding, Now support UTF-8,GBK,UTF-16LE,UTF-16BE, Java检查文件编码,主要针对中文文本。目前支持 UTF-8(BOM或无BOM)、GBK、UTF-16LE、UTF-16BE单个文件或文件夹,支持编码批量转换。...
使用此修补程序,您可以轻松发送带有ISO-2022-JP编码的邮件(所谓的“ JIS-CODE”)。 (ja) mail-iso-2022-jpは, に対するパッチです。チです利用するとISO-2022-JP (いわゆる「JISコード」)でのメール送信が...
ISO_8859_1("ISO-8859-1","ISO 拉丁字母表 No.1,也叫作 ISO-LATIN-1"), UTF_8("UTF-8","8 位 UCS 转换格式"), UTF_16BE("UTF-16BE","16 位 UCS 转换格式,Big Endian(最低地址存放高位字节)字节顺序"), UTF_...
通过实例和代码演示了使用平台默认字符编码和指定UTF-8、ISO-8859-1字符编码的情况。getBytes()方法在处理字符串和字节数据之间的转换时非常有用,特别是在跨平台和处理不同字符集的情况下。记得在使用指定字符编码...
request取参数时转化编码 ## param = no param.from=ISO-8859-1 param.to=GB2312 <br># 写入数据到数据库转化编码 encode = no encode.from=ISO-8859-1 encode.to=GB2312 <br># 从数据库...
,由于是单字节编码,和计算机最基础的表示单位一致,所以很多时候,仍旧使用ISO-8859-1编码来表示。 而且在很多协议上,默认使用该编码。 Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。通常...
1. 概述 本文主要包括以下几个方面:编码基本知识,java,系统软件,url,工具软件等。 在下面的描述中,将以"中文"两个字为例,经查表可以知道...注意,这两个字没有iso8859-1编码,但可以用iso8859-1编码来"表示"。
介绍了各种编码集,如ISO-8859系列以及其他的编码