记录一次IDEA非法字符报错
报错及Bug报错及Bug约 549 字大约 2 分钟
UTF8 与 UTF8-BOM,大端与小端等编码到底有何不同
1. 问题发现
最近在运行一个开源项目的时候,后端SpringBoot工程运行时,报了一个错,截图如下

BOM
出于好奇,我们查一下这个编码\\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 | 高内存地址 |
2. 思路
解决的思路是将文件编码格式由其他编码格式转为 UTF-8格式。
3. 解决方式
3.1 方式一
选择一个其他编码,如GBK。(我选的是GBK)。如下图

第二步:重复步骤一,再将编码选择回来,即第二次选择UTF-8编码。
第三步:嗯,没有第三步,这时候问题应该已经解决了。
3.2 方式二
使用编辑器软件/IDE(windows记事本程序除外)将文件内容复制一份重新保存,并删除旧文件。
