文件的编码是一个怎样的机制

比如我在mac上有个f.txt文件,系统是utf-8编码其中有数据 "\xE6\x97\A5"——在utf-8编码下为汉字"日"

那么我用ultraedit将f.txt另存为以下几个文件:

  1. f1.txt文件其实际存储的内容为"\xE6\x97\A5",让ultraedit将其解释为是gb18030编码,那么在ultraedit界面显示为乱码。之后另存为gb18030编码的文件,在mac系统打开却是utf-8,显示正常的。
  2. f2.txt文件实际存储内容为"\xE6\x97\A5",解释为utf-8,那么显示为"日"
  3. f3.txt文件直接另存为gb18030编码,那么ultraedit会自动改变编码 即把"\xE6\x97\A5"变为"\xC8\xD5"。之后vim打开文件调用ascii编码解释。

问题来了,
既然实际存储数据是"\xE6\x97\A5",那我的编辑器凭什么解释为utf-8编码呢?我想得到GBK解释的乱码怎么办?
是在文档的二进制头部加入某种标记吗,如果是,这种标记该如何查看?
是在编辑器端进行基于编码的语义分析吗?

1

就拿 vim 来说吧

一个文本文件,vim 打开的时候按某种编码A打开,转换成某种编码B,然后保存的时候转换成另一种编码C,其他文本编辑器类似,可能没有vim这么可以设置和自动完成。编码B:对于整个文件没有影响,只是事关显示的,就是vim与操作系统交互时候使用的编码。

编码A:使用 set fileencodings=ucs-bom,utf-8,gbk,cp936,latin-1设置。vim 按照设置的顺序检查检测文件的编码。因为某些编码里不存在某些二进制序列的组合,所以如果检测到就认为不是这种编码,检查下一种编码,否则就认为是这一种。因为latin-1可以出现任何二进制序列的组合,所以如果放到第一个,那么将永远以latin-1显示。

在一般的二进制文件里是不存在字符编码的标记的。但是Unicode里面有个特殊叫做零宽度空格(\FE\FF)而\FF\FE是不存在的编码,所以在Unicode的标准里可以人为的在开始加入这个字符(这个字符在任何字体下都是没有宽度的,在中文字符里面没有任何的效果跟没有一样,是为了照顾东南亚某些语言的显示而设置的)。这样就便于文本编辑器检查字符和字节顺序,但是在代码里include这种文件经常会出问题(这可是个大坑,编译器会认为这是一个非法字符,可是你又看不到)。

编码Bset fileencoding=utf-8,保存时候使用的编码,保存的时候自动转换为另一种编码。但是如果一开始打开的时候就识别错了编码,再转换的时候一个不存在的字符也是不会完转换的。

所以 f1.txt 另存为 gp18030 可能不会进行编码的转换。

”问题来了,我想要得到实际存储数据是"\xE6\x97\A5",但是用gb18030编码解释,该如何做?“ 这个是什么意思?

2

文件编码就是实际以何种方式存储的代码规定,首先就回答你的问题,UTF8编码中是\xE6\x97\A5,你就不可能说采用GB18030编码结果还为\xE6\x97\A5字。

编辑器识别文本文件编码有不同的方式,有的文件编码带有Magic头,可以直接识别其前几个字节来完成,不过大部分文本文件不带有此类识别码,完全靠编辑器通过上下文和使用者的语言环境进行猜测。

时间: 2024-12-11 02:57:44

文件的编码是一个怎样的机制的相关文章

分享文件转编码的插件(eclipse)

最近碰到一个编码的问题,有一个项目是用GBK编码的,由于要把项目移植到Linux,考虑到通用性,想将项目转成UTF-8编码格式的,刚开始用UE.EditPlus转,发现文件内容还是无法转移,全部是乱码,后来在网上到找一个非常好用的插件(com.lifesting.tool.encoding_1.0.0.jar),使用方法如下: 第一步 将插件com.lifesting.tool.encoding_1.0.0.jar拷贝到eclipse/plugins目录下,如果是eclipse3.5以上,请放在

java读取UTF-8的txt文件发现开头的一个字符问题

今天遇到一个奇葩问题,在读取一个TXT文件时,出现开头多了一个问号(?).如下图: 莫名奇妙的多了一个.最后通过网上资料,知道在Java中,class文件采用utf8的编码方式,JVM运行时采用utf16.Java的字符串是永远都是unicode的,采用的是UTF-16的编码方式. 想测试一下,java对UTF-8文件的读写的能力,结果发现了一个很郁闷的问题,如果通过java写的UTF-8文件,使用Java可以正确的读,但是如果用记事本将相同的内容使用UTF-8格式保存,则在使用程序读取是会从文

如何改变CSV文件的编码

通常我.csv文件的编码都不是我们想要的,比如我要把他保存为Utf-8格式的,好让我可以导入数据库,不乱码 工具/原料电脑,.csv文件方法/步骤1首先,将.csv文件保存一下.然后鼠标右击打开方式记事本.2然后,以记事本的方式打开了.文件-另存为 这时弹出一个窗口,右下方,编码,这时候你就可以选择自己想要的编码格式,然后保存,就是这么简单

如何在Eclipse中设置默认的JSP文件头部编码

如何在Eclipse中设置默认的JSP文件头部编码 在eclipse中新建一个jsp页面时,一般默认的编码不是utf-8,而我们一般项目都是统一采用utf-8编码,如果要一个个改很麻烦? 那么我们只能这样这么麻烦吗? 大家一般都会想到如果更改默认设置. 我之前是这样设置的: windows-----preferences-----general-----content types-----text-----jsp那里设置默认编码(操作步骤如下图所示) 可惜的是这样还是没有达到我想要的结果. 后来

eclipse实现批量修改文件的编码方式

http://blog.csdn.net/haorengoodman/article/details/38493007 在eclipse+MyEclipse环境下,打开一个jsp文件,经常发现汉字无法显示,右键点击查看这个文件属性,发现文件的字符编码属性为ISO-8859-1.   目前的解决方法有:1. 手工把文件属性改成GBK,每个文件都要做设置,很麻烦.2. 不要在Eclipse中编辑jsp,来回在两个环境中切换,也很麻烦3. 在每个jsp中加入pageEncoding指令,明确指定编码.

java动态获取上传文件的编码类型

package com.sjfl.main; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net

Python学习之路4 - 文件操作&编码转换

文件操作 文件操作大概分三步: 把文件打开. 操作文件. 把文件关上. 打开文件 打开文件用open()函数,打开成功后返回一个资源,具体语法如下. open(要打开的文件,打开方式,打开文件的格式,默认为utf-8) #例如 f = open('passengers.txt','r',encoding='utf-8') 上例用open以只读的模式打开文件,因为该文本是utf-8编码的,所以第三个参数是utf-8 w 模式是写入,是创建一个新文件的写,所以如果已经有了该文件就会被覆盖掉,注意安全

Java—IO流 文件的编码

文件的编码 package cn.test; import java.io.UnsupportedEncodingException; public class Demo15 { public static void main(String[] args) throws UnsupportedEncodingException { String str = "你好ABC123"; byte[] b1 = str.getBytes();//转换成字节系列用的是项目默认的编码 for (b

删除一个目录下的所有文件,但保留一个指定文件

此题问题虽小,但是初学者还是很难给出合理的答案的!本文来自老男孩21期网络班学员 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 面试题:删除一个目录下的所有文件,但保留一个指定文件 解答: 假设这个目录是/xx/,里面有file1,file2,file3..file10  十个文件