字符编码和换行问题

1、不同平台的换行符

平台 换行符
windows CRLF \r\n
UNIX, linux, macOS (>=10.0) LF \n
macOS(<10.0) CR \r
  • \r:0x0D, 回车, CR(Carriage Return)光标回到开头
  • \n 0x0A, 换行, LF(Line Feed)下一行

2. 字符编码

产生顺序:

  • 🇨🇳:GB2312 -> GBK -> GB18030
  • ISO: unicode ( Universal Multiple-Octet Coded Character Set) 简称UCS2 固定2字节
  • Ken Thompson:UTF-8 (8-bit Unicode Transformation Format) 1-6字节变长编码

解释:

  1. 🇨🇳通过对ASCII编码的中文扩充,产生了 GB2312 编码,可以表示6000多个常用汉字;
  2. 但是汉字实在是太多了,包括繁体和各种字符,于是产生了 GBK 编码,它包括了 GB2312 中的编码,同时扩充了很多;
  3. 中国是个多民族国家,各个民族几乎都有自己独立的语言系统,为了表示那些字符,继续把 GBK 编码扩充为 GB18030 编码。
  4. 每个国家都出现了自己的编码十分混乱,ISO 的组织看不下去了,大家一起创造了一种编码UNICODE,这种编码非常大,大到可以容纳世界上任何一个文字和标志。所以只要电脑上有 UNICODE 这种编码系统,无论是全球哪种文字,只需要保存文件的时候,保存成 UNICODE 编码就可以被其他电脑正常解释;
  5. UNICODE 在网络传输中,出现了两个标准 UTF-8 和 UTF-16,分别每次传输 8个位和 16个位;
  6. 目前开发统一编码:UTF-8。

BOM

有的文件开头会带上编码的标识,称作BOM头,(最好使用utf-8无BOM)
编码 | BOM头
—|—-
UTF-8 | EF BB BF
UTF-16LE (UCS2的扩展,UCS) | FF FE (小尾)
UTF-16BE | FE FF (大尾)
UTF-32LE | FF FE 00 00
UTF-32BE | 00 FE FF
UTF-16是UCS2的扩展,可变长

唐 字编码

编码
gbk ccc6
gb2312 ccc6
utf-8 E59490
utf-16be 5510
utf-16le 1055

utf-16: 自动根据开头两个字节指示来判断(feff(BE) )

3. 编码转换

Linux查看字符编码命令

1
2
file a.txt
file -i a.txt 强制显示编码

转换编码

1
2
iconv -f gbk -t utf-8 filename  # 将gbk转换为utf-8
iconv -l # 列出所有编码

转换所有文件的编码

1
2
3
4
5
6
7
or f in $(find ./ -name "*.java")
do
iconv -f gbk -t utf-8 $f>tmp && mv -f tmp $f # 1
done

# 1 用&&目的是前面执行成功了再进行覆盖操作, 否则会因为操作失败导致文件被清空
# 2 不用 $f>$f 因为会循环执行吧

0%