编码解码模型中编码方案的确定策略
2015-10-10 19:20
337 查看
关于如何确定“字符编码过程中和字节解码过程中的编码方案”所采取的策略,归纳来说,主要有3种。
1、"约定编码方案"的策略
在这种策略中,对“字符编码过程中和字节解码过程中的编码方案”进行约定。
比如Java Class文件对应的文件规范。
在Java Class文件的场景中,字符编码过程中和字节解码过程中的编码方案约定为UTF-8的某个特定变种[1]。比如从.java文件编译获得.class文件的时候(写入.class文件的内容基于.java文件,而不完全是来自.java文件,因为这是编译过程,会引入一些其他的内容),约定编码方案为该UTF-8变种;那么下次从.class文件解码的时候,也需使用该UTF-8变种。
比如在.java文件中有这样的语句
String s="你好";
System.out.println(s);
那么编译成相应的.class文件的时候,会使用该UTF-8变种对"你好"进行编码,然后在执行"System.out.println(s);"的语句的时候(执行针对的是.class文件,而不是.java文件),首先会以该UTF-8变种编码对字节流解码,得到"你好"字符串,然后再进行输出。
2、"元数据保存编码方案"的策略
在这种策略中,将“字符编码过程中和字节解码过程中的编码方案”写入元数据中。
比如odt文件,xml文件等对应的文件规范,"Content-Type: application/json"对应的http协议。
1)当我们使用LibreOffice创建Odt文件时,选定了某个编码方案后,保存字符流的时候,字符编码过程中会使用该选定的编码方案,编码得到的字节流写入Odt文件,同时该编码方案会写入odt文件的元数据中,具体是元数据的db:encoding小节中。[2]
当我们使用LibreOffice读取已存在的odt文件时,会首先从元数据中读取该编码方案,然后使用该编码方案解码字节流,得到字符流并进行显示。
2)XML文件中通过<?xml version="1.0" encoding="gbk"?>来记录所使用的编码方案
3)"Content-Type:application/json"的http协议中,通过"Content-Type:application/json;charset=UTF-8"中的charset来记录所使用的编码方案
3、"检测编码方案"的策略
在这种策略中,可以自由指定字符编码过程中使用的编码方案,但是字节解码过程中的编码方案由检测获得,检测得到的编码方案有可能不是字符编码过程中所使用的编码方案,即存在一定的检测错误率。
1)比如我们使用记事本,选定了GBK编码方案,当我们保存字符流的时候,会使用GBK进行编码,得到的字节流被写入txt文件中。
当我们使用记事本读取存在的txt文件的时候,通过检测字节流,推测合理的编码方案进行解码。
具体的检测编码方案的介绍可见[3]。
2).java文件对应的文件规范也采用了该解决方案。比如我们使用Intellij Idea中的.java文件编辑器,选定了UTF-8编码方案,当我们保存字符流的时候,会使用UTF-8进行编码,得到的字节流被写入.java文件中。
当我们使用该.java文件编辑器读取存在的.java文件的时候,通过检测字节流,推测合理的编码方案进行解码。
参考文献:
[1]https://en.wikipedia.org/wiki/Java_class_file
[2]http://docs.oasis-open.org/office/v1.2/cd05/OpenDocument-v1.2-cd05-part1.html#a_19_52_db_encoding
[3]https://en.wikipedia.org/wiki/Charset_detection
1、"约定编码方案"的策略
在这种策略中,对“字符编码过程中和字节解码过程中的编码方案”进行约定。
比如Java Class文件对应的文件规范。
在Java Class文件的场景中,字符编码过程中和字节解码过程中的编码方案约定为UTF-8的某个特定变种[1]。比如从.java文件编译获得.class文件的时候(写入.class文件的内容基于.java文件,而不完全是来自.java文件,因为这是编译过程,会引入一些其他的内容),约定编码方案为该UTF-8变种;那么下次从.class文件解码的时候,也需使用该UTF-8变种。
比如在.java文件中有这样的语句
String s="你好";
System.out.println(s);
那么编译成相应的.class文件的时候,会使用该UTF-8变种对"你好"进行编码,然后在执行"System.out.println(s);"的语句的时候(执行针对的是.class文件,而不是.java文件),首先会以该UTF-8变种编码对字节流解码,得到"你好"字符串,然后再进行输出。
2、"元数据保存编码方案"的策略
在这种策略中,将“字符编码过程中和字节解码过程中的编码方案”写入元数据中。
比如odt文件,xml文件等对应的文件规范,"Content-Type: application/json"对应的http协议。
1)当我们使用LibreOffice创建Odt文件时,选定了某个编码方案后,保存字符流的时候,字符编码过程中会使用该选定的编码方案,编码得到的字节流写入Odt文件,同时该编码方案会写入odt文件的元数据中,具体是元数据的db:encoding小节中。[2]
当我们使用LibreOffice读取已存在的odt文件时,会首先从元数据中读取该编码方案,然后使用该编码方案解码字节流,得到字符流并进行显示。
2)XML文件中通过<?xml version="1.0" encoding="gbk"?>来记录所使用的编码方案
3)"Content-Type:application/json"的http协议中,通过"Content-Type:application/json;charset=UTF-8"中的charset来记录所使用的编码方案
3、"检测编码方案"的策略
在这种策略中,可以自由指定字符编码过程中使用的编码方案,但是字节解码过程中的编码方案由检测获得,检测得到的编码方案有可能不是字符编码过程中所使用的编码方案,即存在一定的检测错误率。
1)比如我们使用记事本,选定了GBK编码方案,当我们保存字符流的时候,会使用GBK进行编码,得到的字节流被写入txt文件中。
当我们使用记事本读取存在的txt文件的时候,通过检测字节流,推测合理的编码方案进行解码。
具体的检测编码方案的介绍可见[3]。
2).java文件对应的文件规范也采用了该解决方案。比如我们使用Intellij Idea中的.java文件编辑器,选定了UTF-8编码方案,当我们保存字符流的时候,会使用UTF-8进行编码,得到的字节流被写入.java文件中。
当我们使用该.java文件编辑器读取存在的.java文件的时候,通过检测字节流,推测合理的编码方案进行解码。
参考文献:
[1]https://en.wikipedia.org/wiki/Java_class_file
[2]http://docs.oasis-open.org/office/v1.2/cd05/OpenDocument-v1.2-cd05-part1.html#a_19_52_db_encoding
[3]https://en.wikipedia.org/wiki/Charset_detection
相关文章推荐
- MQTT message push实现研究
- 我的Android进阶之旅------>Android中如何高效率的进行简繁体转换
- 结构体指针做函数参数
- java反射机制详解 及 Method.invoke解释
- 机器人走方格问题
- UWP开发细节记录:判断文件类型
- codeforces 581C Developing Skills
- Linux命令 grep
- 现在广告都可以收藏了
- 类似于小球一样的,下弹 在跳起来的功能
- 黑马程序员——Java语言--面向对象(一)
- 常用命令
- 十步完全理解SQL
- LeetCode -- Single Number
- 图像平滑处理
- 常用命令
- tomcat 启动了,浏览器访问不了,查看防火墙 Linux
- Linux将程序前台转后台执行
- Linux系统学习
- Android在java代码中使用layout_gravity和gravity这两个属性