文本文件编码与格式转换

时间:2024-03-29 11:31:26

不知道大家注意过没有,我们在软件开发过程中经常会发生如下情况:

  • 用keil打开一个文件,显示乱码。
  • Keil IDE编辑器编写的文件,在其他软件打开乱码

为什么会发生这样子的情况呢?根本原因是你使用的编写文件的工具使用的编码规则和另外一个打开该文件的工具的编码规则不一样,打个比喻,就像搞地下活动的时候,加密和解密用的密码本不一样,自然解密出来的意思就不一样了。
我们简单的普及一下文字的编码:
 把世界上各个国家的文字统一编码的规范叫Unicode。在这个编码规范里面,任何一个字符的编码是唯一的,不会发生重复。
 Windows早期的代码页的方式编码,叫OEM编码,每一个国家根据自己的需要对本国语言进行了编码并形成一个标准,比如中国的文字,我们的标准叫GB2312和GB18030,在window就是代码页code page 936。那如此一来,不同国家的文字就有可能采用一个同样的编码,发生冲突(一个编码比如0xDEA0,在不同的OEM编码里面就会表示不同的字符)。
 UTF8,UTF16.类unix和linux系统使用的编码,和windows系统使用的Unicode类似,编码唯一,但是编码长度可变,占用的空间较小。一般在网络传输中使用该编码比较多来。
好了,有了这些基本知识,那我们该如何选择使用呢?各种编码之间如何转换呢?
在基于keil 的IDE编写和开发程序的过程中,最好的编码是使用UTF8,不要选择Unicode和GB2312等其他编码方式,主要的好处是便于和git等工具兼容(毕竟很多开源工具是linux风格的),方便查看起来没有乱码。
如下,在keil的菜单edit->configuration对话框选择:
文本文件编码与格式转换
那我们怎么知道我们使用的文件是哪一种编码呢?
最简单的一种方式,是使用ultraedit工具,打开该文件,在下面的状态栏,就可以看到我们的文件编码类型。
文本文件编码与格式转换
各种编码类型之间可以使用ultraedit进行任意转换:
打开菜单: 文件->格式转换,就会有非常多的选项,下面我们简要的说明一下这些选项的作用。
文本文件编码与格式转换
对于文本文件的保存方式,除了编码方式以外,在每一行的结尾和换行,dos(Windows),mac(苹果),unix(linux)的标识也不一样:
mac系统文本文件的一行结尾只有CR(carriage return 回车符号,编码0x0D)
Unix系统文本文件的一行结尾只有LF(line feed换行符合,编码0x0A)
DOS系统(Windows),有CRLF。
对应上面菜单的功能:

  1. unix/mac转dos: 转换规则,查找文件中的所有CR和LF字符,缺少任意一个,都添加另外一个变为CRLF,比如找到CR,下一个不是LF,就添加LF;如果找到只有LF,前面没有CR,就添加CR,最终变为dos格式的CRLF。
  2. DOS转unix:将CRLF转换为LF
  3. DOS转mac:将CRLF转换为CR
  4. EBCDIC转为ASCII:EBCDIC (Extended Binary Coded Decimal Interchange Code) 为国际商用机器公司(IBM)于1963年-64年间推出的字符编码表,根据早期打孔机式的二进化十进数(BCD, Binary Coded Decimal)排列而成。
  5. ASCII和EBCDIC两者的差别是同样一个字符,编码的数值不一样,也可以认为EBCDIC是另外一种OEM编码。
    文本文件编码与格式转换
  6. OEM to ASCII: 比如将GB2312编码转换为ASCII,并不处理行尾的(下同)
    ASCII to OEM: 将ASCII转换为OEM编码
    其他菜单表示不同格式之间的互相转换
    状态栏显示文件状态的意思: U前缀表示是Unicode编码,U8表示UTF8编码
    比如DOS,MAC,UINIX,U-DOS, U- MAC, U- UINIX, U8-DOS,U8- MAC, U8- UINIX

原创文章,欢迎转载,请注明来源,未经书面允许,请勿用于商业用途。