当前位置: 首页 > article >正文

如何很快将文件转换成另外一种编码格式?编码?按指定编码格式编译?如何检测文件编码格式?Java .class文件编码和JVM运行期内存编码?

如何很快将文件转换成另外一种编码格式?

  • 利用VS Code右下角的"选择编码"功能,选择"通过编码保存"可以很方便将文件转换成另外一种编码格式。尤其,在测试w/ BOM或w/o BOM, 或者ANSI编码和UTF编码转换,特别方便。
  • VS文件另存为有高级保存选项,如下:

编码

大家都遇到过乱码,本质在于默认和使用的字符集不同,用不同的编码在交流。尽管Unicode是世界标准,但它在某些场合未必是最优的编码,不一定会采用。

编码举例

比如python.py:
s = '你好'
$ hexdump -c python.py
0000000 s = ' 344 275 240 345 245 275 ' \r \n

每个中文是3个字节,是UTF-8编码。

源代码的编码

  • VS2019: C语言代码开头默认插入EF BB BF标志(BOM标志), 代表UTF-8编码。如果修改为Unicode Little Endian编码保存,代码开头会被插入FF FE.
  • Javac提供-encoding编译选项指定代码编码。
  • HTML提供charset属性指定编码格式。

乱码的本质

  • 以Python为例:从源代码角度,程序员写完之后保存编码格式A,放到Python解释器运行,它按编码格式B解析,最终输出的结果也可能在命令行窗口展示,它使用编码C. 只有A/B/C都适配,结果才是预期。

BOM标记

  • 为了更清晰标明字符编码,引入了BOM ( Byte-Order Mark). BOM的设计高明之处在于它将字符编码信息放在文件开头,而非文件之外,强制要求对字符编码的判断。注意,BOM只对UTF-16和UTF-8有效,对其他编码是无效的。

按指定编码格式编译?

当源代码编码格式是xxx时,gcc可以用参数-finput-charset=xxx用xxx编码格式编译。例如源代码并不是UTF-8,是UTF-16LE,可以用gcc -finput-charset=UTF-16LE demo.c编译。所有可支持的编码格式可以通过iconv -l获取。

当然,对于gcc, 如果仅仅用新的编码格式,你大概率会遇到编译错误。原因是你可能包含了系统头文件,而它们是用默认UTF-8编码的。

如果是VS,就没有这样的烦恼,它可以自动检测编码,即使是UTF-16LE编码,可以用cl.exe demo.c轻松编译通过,不用特别指定编码。但对于UTF-8,必须是带BOM头,否则也会编译错误。

指定并编译编码格式为UTF-16LE源代码,依然报错?

如何检测文件编码格式?

世界无奇不有,编码格式也五花八门,在预先不知道编码格式的情况下,检测编码格式除了靠一些特定标志,剩下的就是靠猜。

  • Unicode世界有BOM头,凭此可以找到编码格式。
  • 某些文件在开头有编码指示,例如XML和HTML有charset的说明。
  • 利用编程语言的字符编码检测库,例如Python的chardet库,Node.js中的jschardet库等。
  • 利用file -i命令猜测文件编码。
  • 许多文本编辑器,例如Visual Studio Code,Notepad++, Sublime Text等,具有检测文件编码的功能。当你打开一个文件时,编辑器通常会自动检测编码,并可以点击右下角的编码格式选择新的编码。
  • 利用在线编码检测网站,例如file-encode-detect.

Java .class文件编码和JVM运行期内存编码

  • Java源代码可以是任意编码格式,javac需要指定编码格式-encoding即可正确编译。
  • javac编译出.class文件是UTF-8编码。
  • JVM读取.class文件加载到内存中,编码格式为UTF-16.
  • java执行.class文件使用默认字符串输出(Windows平台是GBK),如对应的终端或显示设备编码不同,使用-Dfile.encoding=xxx指定编码。


若文章对您有帮助,欢迎关注 程序员小迷 。助您在编程路上越走越好!

微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。

我是 程序员小迷 (致力于C、C++、C#、Android、iOS、Java、Kotlin、Objective-C、Swift、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。


http://www.kler.cn/a/471877.html

相关文章:

  • 关于Mac中的shell
  • RP2K:一个面向细粒度图像的大规模零售商品数据集
  • 使用ML.NET进行对象检测
  • opencv摄像头标定程序实现
  • Go语言的语法
  • 会员制营销与门店业绩提升:以开源AI智能名片S2B2C商城小程序为例的深度剖析
  • 基于微信小程序的考研资料分享系统的设计与实现springboot+论文源码调试讲解
  • 【阅读】认知觉醒
  • Mermaid 使用教程之流程图 - 从入门到精通
  • 2025新春烟花代码(一)HTML5夜景放烟花绽放动画效果
  • 基于Thinkphp6+uniapp的陪玩陪聊软件开发方案分析
  • flutter web 路由问题
  • 【Qt】C++11 Lambda表达式
  • C语言文件学习
  • 数据库回滚:大祸临头时
  • 复合机器人助力手机壳cnc加工向自动化升级
  • JAVA学习记录1
  • 【Linux】Linux的权限问题
  • 李正国教授、张钊博士到访美尔斯通,共绘心磁图技术新蓝图
  • jenkins入门10--自动化构建