- 浏览: 502349 次
- 性别:
- 来自: 沈阳
文章分类
- 全部博客 (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 448今天中午,我突然想搞清楚 Unicode 和 UTF-8 之 ... -
【转】HTTP协议及浏览器编码行为
2012-12-19 13:48 1390转自:http://blog.csdn.net/hap ... -
【转】JSP中request.getParameter()乱码问题
2012-09-11 14:12 3118第一,存文件必须以一种编码存;读文件也必须以一种编码读,如不特 ... -
【转】说说字符集和编码
2012-09-10 22:41 781很久很久以前,有一 ... -
【转】解决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 1485当我们编写一个txt文件或jsp页面时,我们用默认的一种编码区 ... -
【转】有关保存文件时的编码选项与html/jsp页面设定字符编码的配置
2012-08-27 16:10 758分两种情况介绍 注:首先,各位得对一次 请求/响应 的 ... -
【转】内码转换技术
2012-08-27 16:04 0内码转换技术 好吧 ... -
【转】JAVA字符编码系列一:Unicode,GBK,GB2312,UTF-8概念基础
2012-08-27 13:25 954这两天抽时间又总结/整理了一下各种编码的实际编码方式, ... -
【转】又一篇介绍计算机字符编码的好文——计算机中的字是如何处理的?
2012-08-26 21:50 0如果你用放大镜看一下,可以看出屏幕上的字是由一个一个的像素点组 ... -
【转】利用javascript完成URLEncoding功能
2012-08-27 11:25 744日常开发中,经常遇到由于页面不一致,导致由页面表单提交或超连接 ... -
【转】Java编码规范,在您进行编码之前应该阅读的规范
2012-08-27 11:25 820本文转载于:http://www.web3d.com. ... -
【转】第三篇:JAVA字符编码系列三:Java应用中的编码问题
2012-08-26 21:42 803这部分采用重用机制,引用一篇文章来完整本部分目标。 来源 ... -
【转】第二篇:JAVA字符编码系列二:Unicode,ISO-8859-1,GBK,UTF-8编码
2012-08-26 21:17 9471、函数介绍 在Java中,字符串用统一的Unico ... -
【转】form表单提交数据编码方式及tomcat的接受编码方式
2012-08-26 21:15 1581form有2中方法把数据提交给服务器,get和post,分别说 ... -
【转】TOMCAT中文问题,解决(全)(转载)
2012-09-11 14:30 688TOMCAT中文问题解决了.其他应用服务器的问题也可以 ...
相关推荐
UTF-8、ISO-8859-1 和 GBK 是三种常见的字符编码格式,每种都有其特定的应用场景和优缺点。 首先,UTF-8 是一种广泛使用的多字节编码,能够表示几乎所有的Unicode字符,包括中文。在Java中,UTF-8 支持国际化,是...
### JAVA字符编码详解:Unicode, ISO-8859-1, GBK, UTF-8 及其相互转换 #### 一、引言 在Java编程中,字符编码的管理和转换是一项基本而又重要的任务。不同的编码标准适用于不同的场景,而理解和掌握这些编码之间...
### 关于JAVA字符编码:Unicode, ISO-8859-1, GBK, UTF-8 编码及相互转换 在Java开发过程中,字符编码是处理文本数据的基础,不同的编码方式会影响数据的存储、传输以及显示。本文将详细介绍几种常见的字符编码...
标题提到的"OC GZIP解压/压缩ISO-8859-1编码格式"涉及到的是Objective-C(简称OC)中的GZIP操作以及字符编码ISO-8859-1。这里我们将深入探讨这两个知识点。 首先,让我们来了解一下`GZIP`。GZIP是一种基于DEFLATE...
字符编码标准之GBK、GB2312、UTF-8和ISO-8859-1的比较 字符编码标准是计算机领域中的一项基本技术,用于将文字或符号转换为计算机能够识别的二进制代码。常见的字符编码标准有GBK、GB2312、UTF-8和ISO-8859-1等,...
2. **ISO 8859-1编码**:ISO 8859-1是一种单字节编码方案,也被称为Latin-1,主要用于西欧语言。它包含128个基本ASCII字符以及128个额外的西欧语言特殊字符,但不支持中文等东亚语言。 3. **UTF-8编码**:UTF-8是...
本文将深入探讨四种常见的字符集编码:ISO-8859-1、GBK、GB18030以及Unicode,并结合Java国际化的字符集转换进行详细说明。 1. ISO-8859-1:这是一种西欧字符编码,包含拉丁字母、数字、标点符号和一些特殊字符。它...
在Java中,当我们从客户端接收数据时,有时数据可能是按照ISO-8859-1编码的。如果我们要正确处理这些数据,需要将其转换为Java默认或者更通用的UTF-8编码。转换的代码如下所示: ```java public static String ...
- 这种转换会导致乱码,因为GBK编码的字节流不能直接转换为ISO-8859-1编码。 - 解决方法:先将GBK编码的字节流转换为Unicode,然后再从Unicode转换为ISO-8859-1。 - 示例:`String s = "中文"; byte[] gbks = s....
附件中:FileEncodeDetector.java 此文件可以检测指定文件的编码格式 public static String getFileEncode(File file) {...} 附件中:FileCharsetConverter.java 此文件可以实现两个编码的相互转换 ...
ISO-8859-1是一种单字节编码,主要用于西欧语言,如果需要支持,只需要将`Charset.forName()`中的编码名替换为"ISO-8859-1"即可。 在实际应用中,确保正确选择编码是至关重要的,否则可能会导致乱码问题。因此,...
实现不同文件代码类型,诸如 Shift_JIS、EUC-JP、ISO-2022-JP、 Unicode、UTF-8 的相互変換,FREE软件
java自动获取文件的编码,智能识别文件编码,支持本地file及指定url的编码识别,支持多达40余种编码的识别,包括最常见的UTF-8,GBK,GB2312,BIG5,UNICODE,ISO8859_1,ASCII等,FileUtil.java里有对...
在这个场景下,"java转码代码"指的是用于解决Java程序中遇到的乱码问题的代码段,而"ISOtoGbk.java"可能是一个源代码文件,专门用于将遵循ISO-8859-1编码的字符转换为GBK编码。 GBK是中文环境下广泛使用的字符编码...
- **定义**:ISO-8859-1是一种8位的字符编码标准,也称为Latin-1,主要用于表示西欧语言。 - **特点**: - 支持更多的字符集(256个字符),包括西欧国家的语言字符。 - 兼容ASCII字符集。 - **示例代码**: ```...
java编码转换工具
这里 `getString` 方法默认返回的是按照ISO-8859-1编码的字符串。通过 `getBytes("ISO-8859-1")` 和 `new String(..., "GB2312")` 的组合,可以将该字符串转换为GB2312编码。 **3. 浏览器与服务器间的编码一致性** ...
使用此修补程序,您可以轻松发送带有ISO-2022-JP编码的邮件(所谓的“ JIS-CODE”)。 (ja) mail-iso-2022-jpは, に対するパッチです。チです利用するとISO-2022-JP (いわゆる「JISコード」)でのメール送信が...
然而,这种方法仅适用于UTF-8的检测,且无法识别其他编码格式,如GBK、ISO-8859-1等。当需要处理各种未知编码格式的文件时,可以借助第三方库cpdetector。 cpdetector是一个轻量级的开源项目,它的大小大约为500KB...
这是因为Java默认使用Unicode编码,而数据库可能使用ISO-8859-1。在存储时,需要将Unicode字符串转换为ISO-8859-1,从数据库读取时再转换回来。例如,`new String(str.getBytes("gbk"), "iso-8859-1")` 和 `new ...