您的位置:首页 > 其它

编码解码模型中编码方案的确定策略

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: