如何很快将文件转换成另外一种编码格式?编码?按指定编码格式编译?如何检测文件编码格式?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.mzph.cn/web/65290.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PCL点云库入门——PCL库点云特征之PFH点特征直方图(Point Feature Histograms -PHF)

1、算法原理 PFH点(Point Feature Histogram)特征直方图的原理涉及利用参数化查询点与邻域点之间的空间差异,并构建一个多维直方图以捕捉点的k邻域几何属性。这个高维超空间为特征表示提供了一个可度量的信息空间,对于点云对应曲面…

5. CSS引入方式

5.1 CSS的三种样式 按照 CSS 样式书写的位置(或者引入的方式),CSS样式表可以分为三大类: 1.行内样式表(行内式) 2.内部样式表(嵌入式) 3. 外部样式表(链接式) 5.2 内部样式表 …

为什么ip属地一会河南一会江苏

在使用互联网的过程中,许多用户可能会遇到这样一个问题:自己的IP属地一会儿显示为河南,一会儿又变成了江苏。这种现象可能会让人感到困惑,甚至产生疑虑,担心自己的网络活动是否受到了某种影响。为了解答这一疑问&#…

unity3d-搞个场景漫游如何实现Alpha

要处理两个问题: 如何设置地面人不掉下去 方法一、 游戏物体加刚体,将游戏物体和地面加collider。如果是地形,可以使用 Terrain Collider;如果是简单的平面,可以添加 Box Collider 或者 Mesh Collider(如果…

git merge rebase

merge操作 Git自己分支合并dev分支 rebase 操作 git rebase

doris 2.1 temporay partition 测试及总结

测试步骤 创建表 drop table order_info_shuffle; CREATE TABLE order_info_shuffle ( order_id varchar(20), user_id varchar(20), goods_id

jmeter性能测试例子

目录 一、介绍 二、操作例子 设置线程数 添加同步定时器 添加聚合报告 一、介绍 在软件测试中,一般用jmeter来对接口做性能测试,对对接口进行一个压力的测试。 简述: 在接口的线程中设置线程的数量和时间,添加一个定时器…

C# 设计模式(行为型模式):解释器模式

C# 设计模式(行为型模式):解释器模式 (Interpreter Pattern) 什么是解释器模式? 解释器模式(Interpreter Pattern)是一种行为型设计模式,用于定义一种语言的语法表示,并提供一个解释…

ubuntu16 重启之后lvm信息丢失故障恢复

一、背景 1、问题背景 业务有一台物理开发服务器,文件系统有损坏;由于重启时没有检查,导致重启卡住。后面通过断电重新启动之后,无法进入系统;进入救援模式,注释数据盘挂载。重启之后进入系统&#xff0c…

React函数组件中与生命周期相关Hooks详解

React 函数组件及其钩子渲染流程是 React 框架中的核心概念之一。以下是对该流程的详细解析: 一、React 函数组件基础 定义: React 函数组件是一个接收 props 作为参数并返回 React 元素的函数。它们通常用于表示 UI 的一部分,并且不保留内部…

水一篇水水水

为了拿推广卷,但不想把我原本完整的文章拆成零散的多篇,只能出此下策随便发一篇,认真写的都笔记专栏里 网络是由若干节点和连接这些节点的链路构成,表示诸多对象及其相互联系。 在1999年之前,人们一般认为网络的结构都…

PDFelement 特别版

Wondershare PDFelement Pro 是一款非常强大的PDF编辑软件,它允许用户轻松地编辑、转换、创建和管理PDF文件。这个中文特别版的软件具有许多令人印象深刻的功能,PDFelement Pro 提供了丰富的编辑功能,可以帮助用户直接在PDF文件中添加、删除、…

C语言的正则表达式

C语言中的正则表达式 引言 正则表达式是一种用于描述字符串模式的工具,它可以用来进行字符串匹配、查找、替换等操作。在编程中,正则表达式被广泛应用于数据验证、信息提取等场景。C语言虽然没有内置的正则表达式支持,但通过一些库我们同样…

【OpenCV】使用Python和OpenCV实现火焰检测

1、 项目源码和结构(转) https://github.com/mushfiq1998/fire-detection-python-opencv 2、 运行环境 # 安装playsound:用于播放报警声音 pip install playsound # 安装opencv-python:cv2用于图像和视频处理,特别是…

GO随想:GO的并发等待

协程并发等待技术——WaitGroup 类型和 errgroup 包 waitgroup 阻塞等待多个并发任务执行完成。WaitGroup 类型主要包含下面几个方法。 func (wg *WaitGroup) Add(delta int) func (wg *WaitGroup) Done() func (wg *WaitGroup) Wait() 第一个是 Add 方法,在任务运…

深入理解Mybatis原理》MyBatis的sqlSessi

sqlSessionFactory 与 SqlSession 正如其名,Sqlsession对应着一次数据库会话。由于数据库会话不是永久的,因此Sqlsession的生命周期也不应该是永久的,相反,在你每次访问数据库时都需要创建它(当然并不是说在Sqlsession…

《HarmonyOS第一课》焕新升级,赋能开发者快速掌握鸿蒙应用开发

随着HarmonyOS NEXT发布,鸿蒙生态日益壮大,广大开发者对于系统化学习平台和课程的需求愈发强烈。近日,华为精心打造的《HarmonyOS第一课》全新上线,集“学、练、考”于一体,凭借多维融合的教学模式与系统课程设置&…

springboot集成整合工作流,activiti审批流,整合实际案例,流程图设计,流程自定义,表单配置自定义,代码demo流程

前言 activiti工作流引擎项目,企业erp、oa、hr、crm等企事业办公系统轻松落地,一套完整并且实际运用在多套项目中的案例,满足日常业务流程审批需求。 一、项目形式 springbootvueactiviti集成了activiti在线编辑器,流行的前后端…

《探秘计算机视觉与深度学习:开启智能视觉新时代》

《探秘计算机视觉与深度学习:开启智能视觉新时代》 一、追溯起源:从萌芽到崭露头角二、核心技术:解锁智能视觉的密码(一)卷积神经网络(CNN):图像识别的利器(二&#xff0…

设计模式-结构型-适配器模式

在软件开发中,随着系统的不断扩展和模块的不断增加,往往会遇到不同模块之间接口不兼容的情况。此时,如果我们能通过某种方式将一个接口转化为另一个接口,那么开发工作将变得更加灵活和高效。适配器模式(Adapter Patter…