Vim 编码格式encoding详解

回忆

插入ascii字符

  • 我们新建一个oeasy.txt
    • i进入插入模式
    • 输入ctrl+v 65
    • 输入ctrl+v 66
    • 输入ctrl+v 67
    • 输入ctrl+v 68
    • esc 退出
  • 屏幕上可以见到插入了 ABCD 四个字符
  • 这就是使用ascii具体编码来插入字符
  • 那我能用其他的进制
  • 比如八进制和十六进制来插入ascii字符么?
  • :h i_ctrl-v

图片描述

用其他进制插入ascii字符

  • 使用八进制
    • 输入ctrl+v o117
    • 输入ctrl+v o101
    • 输入ctrl+v o105
    • 输入ctrl+v o123
    • 输入ctrl+v o131
  • 使用十六进制
    • 输入ctrl+v x41
  • 能否用这个方式插入中文么?
  • 先查一下

插入unicode字符

  • 输入ctrl+v u4e00
    • 可以看到插入了中文字符
    • 具体二进制是如何存储的呢?
  • :.!xxd

图片描述

  • 为什么会是这样呢?

utf-8 编码格式

  • 那这个东西怎么具体存储和操作呢?
    • 这个unicode编码是0x4e00
    • 存储的时候需要避免和ascii中的前127个字符混淆
    • 需要用utf-8的方式存储
    • 状态栏上也可以看出此文件的编码格式

图片描述

  • 一(4E00) 属于第三行的范围

图片描述

  • 所以

    • e4b880对应着
    • 0a 对应着 <LF>
  • 除了utf-8之外还有别的编码格式么?

查看当前语言和编码

  • :language可以查看当前编码格式

图片描述

修改编码

  • :set encoding=latin1
    • 修改之后,状态栏的中文不认识了
    • 屏幕的字符也变了模样
    • 其实他是用latin1来解释e4b880
  • :set encoding=gb2312
    • 换成中文gb2312
    • 文件存储形式没变
    • 解释方式变了
    • 我们也无法理解
  • :set encoding=utf-8
    • 改回来了
    • 我们又可以看到
  • :set encoding=gb2312
    • 硬要说他是gb2312的编码
    • 然后就保存

图片描述

  • 什么是fenc呢?
  • :h fenc

文件编码格式

图片描述

  • encoding
    • 是读取内容并放入内存缓冲buffer时
    • 在屏幕显示字符时的所用编码格式
  • fileencoding 是保存文件时
    • 在硬盘上保存二进制文件的编码格式
    • 我们用utf-8写下了
    • 内存中对应e4b880
  • :set encoding=gb2312
    • 这是在用gb2312编码格式解码utf-8格式的编码
    • e4b880理解为涓~并显示在屏幕上
  • :set fileencoding=gb2312
    • 根据gb2312
    • 涓~在硬盘上写成e4b880
  • vi oeasy.txt
    • 根据utf-8
    • e4b880理解为并显示在屏幕上
  • 如果我就想写一个gb2312的到硬盘
  • 怎么办呢?

使用gb2312

  • :set encoding=gb2312
    • 插入模式下输入一
    • :set fileencoding=gb2312
    • 注意状态栏的变化

图片描述

  • :%!xxd
    • 这次内存中的d2bbgb2312格式下被理解为
  • :%!xxd -r
    • 恢复回来
  • :w! o2z.txt
    • 这次把用gb2312编码,也就是d2bb
    • 写到了硬盘里

打开文件

  • vi o2z.txt
  • 只能看到一个h
    • 好多不可见
    • 这是在用utf-8编码格式解释gb2312编码的内容
  • 因为是用utf-8解码gb2312编码的文件
  • :%!xxd
    • 可以看到从硬盘读到缓存的内容为d2bb
  • %!xxd -r
    • 恢复回来
  • :set encoding=gb2312
    • 这次可以看到用gb2312解码d2bb

总结

  • 这次我们了解了编码格式
    • 屏幕显示的encoding
    • 文件保存的fileencoding
  • 不能搞乱了
  • 用什么编的就用什么解
  • 解铃还须系铃人
  • vim还有什么能帮助我们快速操作的方法么?🤔
  • 下次再说!✋

教程来源于Github,感谢overmind1980大佬的无私奉献,致敬!

技术教程推荐

Spring Boot与Kubernetes云原生微服务实践 -〔杨波〕

TypeScript开发实战 -〔梁宵〕

编译原理之美 -〔宫文学〕

To B市场品牌实战课 -〔曹林〕

深度学习推荐系统实战 -〔王喆〕

技术领导力实战笔记 2022 -〔TGO 鲲鹏会〕

现代C++20实战高手课 -〔卢誉声〕

AI大模型之美 -〔徐文浩〕

LangChain 实战课 -〔黄佳〕