✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人
个人主页:Leo的博客
当前专栏: 报错以及Bug
✨特色专栏: MySQL学习
本文内容:记录一次IDEA非法字符’\ufeff’报错
️个人小站 :个人博客,欢迎大家访问
个人知识库: 知识库,欢迎大家访问
UTF8 与 UTF8-BOM,大端与小端等编码到底有何不同
最近在运行一个开源项目的时候,后端SpringBoot工程运行时,报了一个错,截图如下
出于好奇,我们查一下这个编码\\ufeff
是个什么东东,查询得知,这是一个标识字节存储顺序的编码。
这个涉及到一个名词:BOM
。
BOM:**Byte Order Mark,**中文名译作“字节顺序标记”。我们知道一个UNICODE编码中一个汉字大多数占用2个字节,那个这两个字节哪个存储在存储地址高位,哪个存储在低位呢?
Unicode编码中,FEFF表明字节流是Big-Endian(大端序,内存低地址存放高位数据),FFFE则表明字节流是Little- Endian(小端序,内存的低地址存放低位数据)。
(可以巧妙区分为:内存低地址存的是低位就是小端序,内存低地址存的是高位就是大端序)
如“0x11223344”,这个变量的高字节是”0x11“,最低字节是为”0x44“,大端存储时为:
内存地址 | 数据 | |
---|---|---|
0x0010 | 0x11 | 低内存地址,高位数据 |
0x0011 | 0x22 | |
0x0012 | 0x33 | |
0x0013 | 0x44 | 高内存地址 |
而小端时数据的顺序则是相反的:
内存地址 | 数据 | |
---|---|---|
0x0010 | 0x44 | 低内存地址,低位数据 |
0x0011 | 0x33 | |
0x0012 | 0x22 | |
0x0013 | 0x11 | 高内存地址 |
解决的思路是将文件编码格式由其他编码格式转为 UTF-8格式。
选择一个其他编码,如GBK。(我选的是GBK)。如下图
第二步:重复步骤一,再将编码选择回来,即第二次选择UTF-8编码。
第三步:嗯,没有第三步,这时候问题应该已经解决了。
使用编辑器软件/IDE(windows记事本程序除外)将文件内容复制一份重新保存,并删除旧文件。