本文仅是对原文进行了再排版。
类型 | 实例字符 | 编码类型 | 解码类型 | 原因描述 |
---|---|---|---|---|
问号 | ??Java | ISO8859-1 | UTF-8 | 中文字符采用了ISO8859-1进行编码,然后经过UTF-8解码。 中文变问号的乱码情况是非常常见的,大部分开源软件的默认编码设置成了ISO8859-1,这点需要格外注意。 |
符号 | ä½ å¥½ | UTF-8/GBK | ISO8859-1 | 对中文字符先用UTF-8编码或GBK编码,再由ISO8859-1解码,就会变成奇怪字符。对照ISO8859-1编码表后发现:e4 bd a0分别对应三个字符:"ä½ “,e5 a5 bd分别对应三个字符"好”, |
复杂中文,日韩文 | 浣犲ソJava | UTF-8 | GBK | 中文字符用UTF-8进行编码,然后用GBK解码就得到了"复杂中文"。同理,如果GBK编码的中文用UTF-8来解码的话,同样会出现乱码问题。 |
口字码 | �� | GBK | UTF-8 | 以UTF-8编码读取GBK编码数据 |
黑色菱形问号 | ��你好Java | UTF-16BE | UTF-8 | 中文字符用UTF-16BE进行编码,然后用UTF-8解码。 首先问号+黑色菱形的字符是Unicode中的"REPLACEMENT CHARACTER",该字符的主要作用是用来表示不识别的字符。 所以产生乱码的原因可能有很多,下面通过原字符串:“你好Java”,重现一种乱码方式:原字符串:String str = "你好Java"经过UTF-16BE编码后对应的字节序列:fe ff 4f 60 59 7d 0 4a 0 61 0 76 0 61 其中"fe ff"就是字节流起始的BOM标识符。“fe ff"在Unicode标准中属于"noncharacters”,只用于内部使用。所以在使用UTF-8解码输出该字节序列的时候,没有该码元对应的字符,对于不识别字符,就会用��替代。 |
拼音码 | бéÖÃöaoÃoÃNsI°iiioé | GBK | ISO8859-1 | |
问句码 | 由月要好好学习天天向?? | UTF-8 | UTF-8 | UTF-8=>GBK=>UTF-8 以GBK方式读取UTF-8编码的中文,然后又用UTF-8的格式再次读取 字符串长度为偶数时正确,长度为奇数时最后的字符变为问号 |
锟斤拷 | 锟斤拷锟斤拷要锟矫猴拷学习锟斤拷锟斤拷锟斤拷 | GBK | GBK | GBK=>UTF-8=>GBK 以UTF-8方式读取GBK编码的中文,然后又用GBK的格式再次读取 全中文字符,且大部分字符为"锟斤拷”这几个字符 |
参考文档:
UTF-16BE、UTF-16LE、UTF-16 三者之间的区别_utf16le和utf16be-CSDN博客
起因:
换公司,从头搭服务,对接SAP系统,接口调通,中文乱码。莫名其妙的,引apache的包,默认编码是ISO-8859-1
import org.apache.http.entity.StringEntity;
import cn.hutool.json.JSONObject;
……
JSONObject jsonObject = new JSONObject();
jsonObject.put("header", paramHeader);
jsonObject.put("lists", paramList);
String string = jsonObject.toString();
//不传编码类型,使用默认值IOS-8859-1
//StringEntity entity = new StringEntity(string);
StringEntity entity = new StringEntity(string, StandardCharsets.UTF_8);
……