怎么用程序解析iso-iso 8859 1解码控制码

python关于ISO-8859-2的编码解码问题? - 知乎2被浏览66分享邀请回答1添加评论分享收藏感谢收起Java 编码中文问题系统透彻讲解 UNICODE GBK UTF-8 ISO-8859-1 之间的区别 | 基于实例代码分步讲解 一站式学习Java |
本视频是解读性视频,所以希望您已经看过了本知识点的内容,并且编写了相应的代码之后,带着疑问来观看,这样收获才多。 不建议一开始就观看视频
本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器
如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)
走神了?退回10秒
计算机存放数据只能存放数字,所有的字符都会被转换为不同的数字。就像一个棋盘一样,不同的字,处于不同的位置,而不同的位置,有不同的数字编号。有的棋盘很小,只能放数字和英文有的大一点,还能放中文有的&足够&大,能够放下世界人民所使用的所有文字和符号如图所示,英文字符 A 能够放在所有的棋盘里,而且位置都差不多中文字符, 中文字符 中 能够放在后两种棋盘里,并且位置不一样,而且在小的那个棋盘里,就放不下中文
工作后经常接触的编码方式有如下几种:ISO-8859-1 ASCII 数字和西欧字母GBK GB2312 BIG5 中文UNICODE (统一码,万国码)其中ISO-8859-1 包含 ASCIIGB2312 是简体中文,BIG5是繁体中文,GBK同时包含简体和繁体以及日文。UNICODE 包括了所有的文字,无论中文,英文,藏文,法文,世界所有的文字都包含其中
根据前面的学习,我们了解到不同的编码方式对应不同的棋盘,而UNICODE因为要存放所有的数据,那么它的棋盘是最大的。 不仅如此,棋盘里每个数字都是很长的(4个字节),因为不仅要表示字母,还要表示汉字等。如果完全按照UNICODE的方式来存储数据,就会有很大的浪费。比如在ISO-8859-1中,a 字符对应的数字是0x61而UNICODE中对应的数字是 0x,倘若一篇文章大部分都是英文字母,那么按照UNICODE的方式进行数据保存就会消耗很多空间在这种情况下,就出现了UNICODE的各种减肥子编码, 比如UTF-8对数字和字母就使用一个字节,而对汉字就使用3个字节,从而达到了减肥还能保证健康的效果UTF-8,UTF-16和UTF-32 针对不同类型的数据有不同的减肥效果,一般说来UTF-8是比较常用的方式UTF-8,UTF-16和UTF-32 彼此的区别在此不作赘述,有兴趣的可以参考
写在.java源代码中的汉字,在执行之后,都会变成JVM中的字符。而这些中文字符采用的编码方式,都是使用UNICODE. &中&字对应的UNICODE是4E2D,所以在内存中,实际保存的数据就是十六进制的0x4E2D, 也就是十进制的20013。
public class TestStream {
public static void main(String[] args) {
String str = &中&;
public class TestStream {
public static void main(String[] args) {
String str = &中&;
以字符 中 为例,查看其在不同编码方式下的值是多少也即在不同的棋盘上的位置
import java.io.UnsupportedEncodingE
public class TestStream {
public static void main(String[] args) {
String str = &中&;
showCode(str);
private static void showCode(String str) {
String[] encodes = { &BIG5&, &GBK&, &GB2312&, &UTF-8&, &UTF-16&, &UTF-32& };
for (String encode : encodes) {
showCode(str, encode);
private static void showCode(String str, String encode) {
System.out.printf(&字符: \&%s\& 的在编码方式%s下的十六进制值是%n&, str, encode);
byte[] bs = str.getBytes(encode);
for (byte b : bs) {
int i = b&0
System.out.print(Integer.toHexString(i) + &\t&);
System.out.println();
System.out.println();
} catch (UnsupportedEncodingException e) {
System.out.printf(&UnsupportedEncodingException: %s编码方式无法解析字符%s\n&, encode, str);
接下来讲,字符在文件中的保存字符保存在文件中肯定也是以数字形式保存的,即对应在不同的棋盘上的不同的数字用记事本打开任意文本文件,并且另存为,就能够在编码这里看到一个下拉。ANSI
这个不是ASCII的意思,而是采用本地编码的意思。如果你是中文的操作系统,就会使GBK,如果是英文的就会是ISO-8859-1Unicode UNICODE原生的编码方式Unicode big endian 另一个 UNICODE编码方式UTF-8 最常见的UTF-8编码方式,数字和字母用一个字节, 汉字用3个字节。
eclipse也有类似的编码方式,右键任意文本文件,点击最下面的&property&就可以看到Text file encoding也有ISO-8859-1,GBK,UTF-8等等选项。其他的US-ASCII,UTF-16,UTF-16BE,UTF-16LE不常用。
为了能够正确的读取中文内容1. 必须了解文本是以哪种编码方式保存字符的2. 使用字节流读取了文本后,再使用对应的编码方式去识别这些数字,得到正确的字符如本例,一个文件中的内容是字符中,编码方式是GBK,那么读出来的数据一定是D6D0。再使用GBK编码方式识别D6D0,就能正确的得到字符中注: 在GBK的棋盘上找到的中字后,JVM会自动找到中在UNICODE这个棋盘上对应的数字,并且以。
import java.io.F
import java.io.FileInputS
import java.io.IOE
public class TestStream {
public static void main(String[] args) {
File f = new File(&E:\\project\\j2se\\src\\test.txt&);
try (FileInputStream fis = new FileInputStream(f);) {
byte[] all = new byte[(int) f.length()];
fis.read(all);
//文件中读出来的数据是
System.out.println(&文件中读出来的数据是:&);
for (byte b : all)
int i = b&0x000000
//只取16进制的后两位
System.out.println(Integer.toHexString(i));
System.out.println(&把这个数字,放在GBK的棋盘上去:&);
String str = new String(all,&GBK&);
System.out.println(str);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
FileReader得到的是字符,所以一定是已经把字节根据某种编码识别成了字符了而FileReader使用的编码方式是Charset.defaultCharset()的返回值,如果是中文的操作系统,就是GBKFileReader是不能手动设置编码方式的,为了使用其他的编码方式,只能使用InputStreamReader来代替,像这样:new InputStreamReader(new FileInputStream(f),Charset.forName(&UTF-8&)); 在本例中,用记事本另存为UTF-8格式,然后用UTF-8就能识别对应的中文了。解释: 为什么中字前面有一个?如果是使用记事本另存为UTF-8的格式,那么在第一个字节有一个标示符,叫做BOM用来标志这个文件时用UTF-8来编码的。
import java.io.F
import java.io.FileInputS
import java.io.FileNotFoundE
import java.io.FileR
import java.io.IOE
import java.io.InputStreamR
import java.io.UnsupportedEncodingE
import java.nio.charset.C
public class TestStream {
public static void main(String[] args) throws UnsupportedEncodingException, FileNotFoundException {
File f = new File(&E:\\project\\j2se\\src\\test.txt&);
System.out.println(&默认编码方式:&+Charset.defaultCharset());
//FileReader得到的是字符,所以一定是已经把字节根据某种编码识别成了字符了
//而FileReader使用的编码方式是Charset.defaultCharset()的返回值,如果是中文的操作系统,就是GBK
try (FileReader fr = new FileReader(f)) {
char[] cs = new char[(int) f.length()];
fr.read(cs);
System.out.printf(&FileReader会使用默认的编码方式%s,识别出来的字符是:%n&,Charset.defaultCharset());
System.out.println(new String(cs));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
//FileReader是不能手动设置编码方式的,为了使用其他的编码方式,只能使用InputStreamReader来代替
//并且使用new InputStreamReader(new FileInputStream(f),Charset.forName(&UTF-8&)); 这样的形式
try (InputStreamReader isr = new InputStreamReader(new FileInputStream(f),Charset.forName(&UTF-8&))) {
char[] cs = new char[(int) f.length()];
isr.read(cs);
System.out.printf(&InputStreamReader 指定编码方式UTF-8,识别出来的字符是:%n&);
System.out.println(new String(cs));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
&姿势不正确,事倍功半。
找出 E5 B1 8C 这3个十六进制对应UTF-8编码的汉字
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频
本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器
如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)
走神了?退回10秒
import java.io.UnsupportedEncodingE
public class TestStream {
public static void main(String[] args) throws UnsupportedEncodingException {
找出 E5 B1 8C 这3个十六进制对应UTF-8编码的汉字
byte[] bs = new byte[3];
bs[0] = (byte) 0xE5;
bs[1] = (byte) 0xB1;
bs[2] = (byte) 0x8C;
String str
=new String(bs,&UTF-8&);
System.out.println(&E5 B1 8C 对应的字符是:&+str);
import java.io.UnsupportedEncodingE
public class TestStream {
public static void main(String[] args) throws UnsupportedEncodingException {
找出 E5 B1 8C 这3个十六进制对应UTF-8编码的汉字
byte[] bs = new byte[3];
bs[0] = (byte) 0xE5;
bs[1] = (byte) 0xB1;
bs[2] = (byte) 0x8C;
String str
=new String(bs,&UTF-8&);
System.out.println(&E5 B1 8C 对应的字符是:&+str);
&姿势不正确,事倍功半。
如果用记事本根据UTF-8编码保存汉字就会在最前面生成一段标示符,这个标示符用于表示该文件是使用UTF-8编码的。找出这段标示符对应的十六进制,并且开发一个方法,自动去除这段标示符
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频
本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器
如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)
走神了?退回10秒
import java.io.F
import java.io.FileInputS
import java.io.IOE
import java.util.A
public class TestStream {
public static void main(String[] args) {
File f = new File(&E:\\project\\j2se\\src\\test.txt&);
try (FileInputStream fis = new FileInputStream(f);) {
byte[] all = new byte[(int) f.length()];
fis.read(all);
System.out.println(&首先确认按照UTF-8识别出来有?&);
String str = new String(all,&UTF-8&);
System.out.println(str);
System.out.println(&根据前面的所学,知道'中'字对应的UTF-8编码是:e4 b8 ad&);
System.out.println(&打印出文件里所有的数据的16进制是:&);
for (byte b : all) {
int i = b&0
System.out.print(Integer.toHexString(i)+ & &);
System.out.println();
System.out.println(&通过观察法得出 UTF-8的 BOM 是 ef bb bf&);
byte[] bom = new byte[3];
bom[0] = (byte) 0
bom[1] = (byte) 0
bom[2] = (byte) 0
byte[] fileContentWithoutBOM= removeBom(all,bom);
System.out.println(&去掉了BOM之后的数据的16进制是:&);
for (byte b : fileContentWithoutBOM) {
int i = b&0
System.out.print(Integer.toHexString(i)+ & &);
System.out.println();
System.out.println(&对应的字符串就没有问号了:&);
String strWithoutBOM=new String(fileContentWithoutBOM,&UTF-8&);
System.out.println(strWithoutBOM);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
private static byte[] removeBom(byte[] all, byte[] bom) {
return Arrays.copyOfRange(all, bom.length, all.length);
把你的代码复制到下面区域。 如果在线比较不好用,请使用客户端比较软件:
代码高亮插件双击即可选中,不过部分同学反应,通过代码高亮插件复制的代码无法在IDEA里正常显示,这里提供TEXTAREA的方式,方便复制,谢谢
根据练习目标尽量自己实现代码效果,期间会碰到疑问,难题,和自己不懂的地方,这些都是必要的过程
完成过程中,碰到无法解决的问题,带着疑问,查看答案,分析答案的解决思路
依然有不明白的地方,点开视频讲解,带着疑问,听视频讲解有问题的部分
理解后,再从头做一遍,把有疑问的地方都捋清楚
最后再总结一边,总结思路,总结解决办法,以后遇到类似的问题,怎么处理
把这时的想法,思路,研究都记录下来,等全部学完了,再回过头来巩固和理解,学习效果就会很好,知识点掌握得也牢固
答案时间:
请至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到
答案时间:
请至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到
答案时间:
请至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到
答案时间:
请至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到
答案时间:
答案时间:
答案时间:
请至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到
答案时间:
答案时间:
答案时间:
答案时间:
答案时间:
答案时间:
请至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到
答案时间:
请至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到
答案时间:
答案时间:
答案时间:
请至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到
答案时间:
答案时间:
请至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到
提问之前请
归校在即,收心学习,全场五折,优惠码:GOODSTUDY
可用于全站通
有效期8.29- 8.3140911人阅读
Java(24)
Unicode、UTF-8 和 ISO8859-1到底有什么区别
将以&中文&两个字为例,经查表可以知道其GB2312编码是&d6d0 cec4&,Unicode编码为&4e2d 6587&,UTF编码就是&e4b8ad e69687&。注意,
这两个字没有iso8859-1编码,但可以用iso8859-1编码来&表示&。&
2. 编码基本知识&
最早的编码是iso8859-1,和ascii编码相似。但为了方便表示各种各样的语言,逐渐出现了很多标准编码,重要的有如下几个。&
2.1. iso8859-1 通常叫做Latin-1
属于单字节编码,最多能表示的字符范围是0-255,应用于英文系列。比如,字母a的编码为0x61=97。&
很明显,iso8859-1编码表示的字符范围很窄,无法表示中文字符。但是,由于是单字节编码,和计算机最基础的表示单位一致,所以很多时候,
仍旧使用iso8859-1编码来表示。而且在很多协议上,默认使用该编码。比如,虽然&中文&两个字不存在iso8859-1编码,以gb2312编码为例,应
该是&d6d0 cec4&两个字符,使用iso8859-1编码的时候则将它拆开为4个字节来表示:&d6 d0 ce c4&(事实上,在进行存储的时候,也是以字节为
单位处理的)。而如果是UTF编码,则是6个字节&e4 b8 ad e6 96 87&。很明显,这种表示方法还需要以另一种编码为基础。&
2.2. GB2312/GBK&
这就是汉子的国标码,专门用来表示汉字,是双字节编码,而英文字母和iso8859-1一致(兼容iso8859-1编码)。其中gbk编码能够用来同时表示
繁体字和简体字,而gb2312只能表示简体字,gbk是兼容gb2312编码的。&
2.3. unicode&
这是最统一的编码,可以用来表示所有语言的字符,而且是定长双字节(也有四字节的)编码,包括英文字母在内。所以可以说它是不兼容iso8859-1编
码的,也不兼容任何编码。不过,相对于iso8859-1编码来说,uniocode编码只是在前面增加了一个0字节,比如字母a为&00 61&。&
需要说明的是,定长编码便于计算机处理(注意GB2312/GBK不是定长编码),而unicode又可以用来表示所有字符,所以在很多软件内部是使用unicode
编码来处理的,比如java。&
考虑到unicode编码不兼容iso8859-1编码,而且容易占用更多的空间:因为对于英文字母,unicode也需要两个字节来表示。所以unicode不便于传输和存
储。因此而产生了utf编码,utf编码兼容iso8859-1编码,同时也可以用来表示所有语言的字符,不过,utf编码是不定长编码,每一个字符的长度从1-6个字
节不等。另外,utf编码自带简单的校验功能。一般来讲,英文字母都是用一个字节表示,而汉字使用三个字节。&
注意,虽然说utf是为了使用更少的空间而使用的,但那只是相对于unicode编码来说,如果已经知道是汉字,则使用GB2312/GBK无疑是最节省的。不过另
一方面,值得说明的是,虽然utf编码对汉字使用3个字节,但即使对于汉字网页,utf编码也会比unicode编码节省,因为网页中包含了很多的英文字符。&
3. java对字符的处理&
在java应用软件中,会有多处涉及到字符集编码,有些地方需要进行正确的设置,有些地方需要进行一定程度的处理。&
3.1. getBytes(charset)&
这是java字符串处理的一个标准函数,其作用是将字符串所表示的字符按照charset编码,并以字节方式表示。注意字符串在java内存中总是按unicode编码
存储的。比如&中文&,正常情况下(即没有错误的时候)存储为&4e2d 6587&,如果charset为&gbk&,则被编码为&d6d0 cec4&,然后返回字节&d6 d0 ce c4&。
如果charset为&utf8&则最后是&e4 b8 ad e6 96 87&。如果是&iso8859-1&,则由于无法编码,最后返回 &3f 3f&(两个问号)。&
3.2. new String(charset)&
这是java字符串处理的另一个标准函数,和上一个函数的作用相反,将字节数组按照charset编码进行组合识别,最后转换为unicode存储。参考上述getBytes
的例子,&gbk& 和&utf8&都可以得出正确的结果&4e2d 6587&,但iso8859-1最后变成了&003f 003f&(两个问号)。&
因为utf8可以用来表示/编码所有字符,所以new String( str.getBytes( &utf8& ), &utf8& ) === str,即完全可逆。&
3.3. setCharacterEncoding()&
该函数用来设置http请求或者相应的编码。&
对于request,是指提交内容的编码,指定后可以通过getParameter()则直接获得正确的字符串,如果不指定,则默认使用iso8859-1编码,需要进一步处理。
参见下述&表单输入&。值得注意的是在执行setCharacterEncoding()之前,不能执行任何getParameter()。java doc上说明:This method must be called prior to reading request parameters or reading input using getReader()。而且,该指定只对POST方法有效,对GET方法无效。分析原因,应该是在执行第一个getParameter()的时候,java将会按照编码分析所有的提交内容,而后续的getParameter()不再进行分析,所以setCharacterEncoding()无效。而对于GET方法提交表单是,提交的内容在URL中,一开始就已经按照编码分析所有的提交内容,setCharacterEncoding()自然就无效。
4.iso-8859-1是JAVA网络传输使用的标准 字符集,而gb2312是标准中文字符集,当你作出提交表单等需要网络传输的操作的时候,就需要把 iso-8859-1转换为gb2312字符集显示,否则如果按浏览器的gb;式来解释iso-8859-1字符集的话,由于2者不兼容,所以会 是乱码.
最后来看一个编码的例子:
String s = &你好&;
byte[] utf = s.getBytes(&utf-8&);
byte[] gbk = s.getBytes(&gbk&);
System.out.println(&utf-8编码:& + Arrays.toString(utf)); // [-28, -67, -96, -27, -91, -67]
System.out.println(&gbk编码:& + Arrays.toString(gbk)); // [-60, -29, -70, -61] 4个字节
String s1 = new String(utf, &utf-8&); // 你好
String s2 = new String(utf, &gbk&);// gbk解码:浣犲ソ gbk用2个字节解码,所以会多一个字符
String s3 = new String(gbk, &utf-8&);// gbk用utf-8解码:???
utf-8解码需要6个字节
System.out.println(&--------------------&);
System.out.println(&utf-8解码:& + s1);
System.out.println(&gbk解码:& + s2);
System.out.println(&gbk用utf-8解码:& + s3);
System.out.println(&---------------------&);
System.out.println(&用utf-8编码回去&);
s3 = new String(s3.getBytes(&utf-8&), &gbk&);
// 锟斤拷锟?
gbk用utf-8解码后无法编回去
System.out.println(s3);规律:
&utf-8编码可以用gbk和iso8859-1解码后编回去
gbk编码后只能用iso8859-1解码后编回去
在JSP页面获取表单的值时会出现乱码,有两种解决方法:
一种是在调用getParameter之前通过request.setCharacterEncoding设置字符编码,另一种是调用new String(str.getBytes(&iso8859-1&), &UTF-8&);编码后解码,这两种方法都可以得到正确的结果
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:225373次
积分:2297
积分:2297
排名:第16826名
原创:58篇
转载:10篇
评论:18条
(1)(1)(2)(2)(5)(9)(5)(35)(8)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'

我要回帖

更多关于 iso 8859 1编码表 的文章

 

随机推荐