需要恢复乱码的访客可使用
此类服务
,或参考下面的例子与您需要恢复的乱码进行对照。
本文尝试对各种乱码的特征进行描述,并给出在各种编码中转换的一些方案。
记得原来看到过一张很简明的关于乱码的解释图,不过找不到了。有那张图的同学希望能告诉我一下。
什么编码?
这里我们讨论最常见的几个:
Windows-1252
(CP-1252)、
GBK
(以及 GB2312。GBK 范围稍大且兼容 GB2312,故取此)、
Big5
(大五码,常用于繁体中文)、
Shift-JIS
(常用于日文)。
当然还有
遍地开花
的
UTF-8
。
长什么样?
以下列举出各种编码的特征。不同编码服务于不同的文字类型,因此其字符表中的内容也不同,乱码的特征也不同。幸运的是,(半角)英文字符和数字通常不受影响,它们在这些编码中转换的时候不会出现问题。
Windows-1252
Windows-1252 大概是最好区分的。它是拉丁字母的编码,所以被以 Windows-1252 解码的结果是没有汉字的。只有以下内容:
(图源:
Wikimedia Commons
)
另外,它与
ISO 8859-1
非常相似,也常有人把 Windows-1252 当作 ISO 8859-1 宣告。
WHATWG 的标准
中是要求把以 ISO 8859-1 宣告的文本当作 Windows-1252 编码来解析的。
举几个乱码的例子:
-
巡音ルカ
(GBK) ->
ѲÒô¥ë¥«
(Windows-1252)
-
巡音ルカ
(UTF-8) ->
巡音ルカ
(Windows-1252)
GBK 和 Big5
这两种编码的结果比较像。因为其中编码的多是汉字,所以其它编码的字符以它们解码得到的常是「汉字的集合(非常用汉字占绝大部分)」(UTF-8 -> GBK、UTF-8 -> Big5 或 GBK <-> Big5),或是一堆不可识别字符和 tofu(方块)。例如:
-
我能吞下玻璃而不伤身体。
(GBK) ->
扂夔迒狟產薛奧祥夼旯极﹝
(Big5)
-
我能吞下玻璃而不傷身體。
(Big5) ->
и唰]U良τぃ端ō砰C
(GBK,
errors='ignore'
)
-
(这里使用了繁体的原因是「伤」字在 Big5 中无编码。)
-
我能吞下玻璃而不伤身体。
(UTF-8) ->
鎴戣兘鍚炰笅鐜荤拑鑰屼笉浼よ韩浣撱
(GBK,
errors='ignore'
)
-
我能吞下玻璃而不伤身体。
(UTF-8) ->
賢銝餌銝隡方澈雿
(Big-5,
errors='ignore'
)
(这句话的来源,参见
这里
。)
顺便也用ルカ测试一下:
-
巡音ルカ
(Shift-JIS) ->
弰壒儖僇
(GBK)
-
巡音ルカ
(Shift-JIS) ->
J
(Big5,
errors='ignore'
)
Shift-JIS
刚才说过了,这是给日文用的编码。因此,被以 Shift-JIS 解码的结果自然是日文居多,更明显的特征是有相当多的半长文字。英文同样不受影响。
举几个乱码的例子:
-
巡音ルカ
(GBK) ->
蟾。髻ウ繝ォ繧ォ
(Shift-JIS)
-
巡音ルカ
(UTF-8) ->
ムイメ・・ォ
(Shift-JIS,
errors='ignore'
)
-
巡音ルカ
(BIG5) ->
ィオュオヌ・ヌC
(Shift-JIS)
UTF-8
UTF-8 由于其目标远大(说白了,什么字都有,再带上 emoji),所以以其解码的结果中什么都有可能出现,无论是汉字、日文,还是符号。甚至有时候可以幸运地凑出
组合字符
。
-
袩褉懈胁械虂褌
(GBK) ->
Приве́т
(UTF-8)
-
啶ㄠぎ啶膏嵿い啷
(GBK) ->
नमसत
(UTF-8,
errors='ignore'
)
如何在各种编码中转换?
最方便的方案是用
类似这样的网站
(或者
r12a 的编码转换工具
,感谢 RainSlide 推荐)。如果没有的话,Python 也行。
转换编码,可以这么做(
Python 3
环境):
"以 ENCODING_A 编码的字符串".encode('ENCODING_A').decode('ENCODING_B')
python
Python 3 会把原来的字符串以 ENCODING_A 编码,转换至 Unicode 字符集的 byte,再以 ENCODING_B 解码。如果编码或解码出问题的话(例如码表里没有这个字符),会报 UnicodeEncodeError
或 UnicodeDecodeError
。如果想忽略错误的话,在相应的地方加入参数 errors='ignore'
即可,像是:
"以 ENCODING_1 编码的字符串".encode('ENCODING_A', errors='ignore').decode('ENCODING_B', errors='ignore') # 暴力编码+解码
python
而如果要解码二进制字符串,可以这么做:
b'\xaa\xbb\xcc'.decode('ENCODING')
python
那么锟斤拷、烫烫烫、屯屯屯和锘锘锘呢?
In a nutshell: 「锟斤拷」是连续的 UTF-8 容错字符以 GBK 解码的结果。
b'\xef\xbf\xbd\xef\xbf\xbd'.decode('gbk') # -> '锟斤拷'
python
「烫烫烫」和「屯屯屯」是 MSVC 填充未初始化内存的字节以 GBK 解码的结果。
b'\xcd\xcd\xcd\xcd\xcd\xcd'.decode('gbk') # -> '屯屯屯'
b'\xcc\xcc\xcc\xcc\xcc\xcc'.decode('gbk') # -> '烫烫烫'
python
「锘锘锘」则是 UTF-8 BOM 以 GBK 解码的结果。
b'\xef\xbb'.decode('gbk') # -> '锘'
python
(怎么都特么是 GBK 的锅)
参考来源:
所以…为什么水了这篇文?
下载的一些 VOCALOID 歌曲(其中不小的一部分来自网易云)的元数据标签是 GBK 编码的,Rhythmbox(以及 Lollypop 还有 kid)会以 Windows-1252 来解码,于是播放列表的显示就爆炸了。
反正我是真切地记住了 ³õÒô¥ß¥¯
(Windows-1252) => 初音ミク
(GBK)。看这乱码,多整齐啊。
附注:常见编解码错误表
名称 | 举例 | 特点 | 产生原因 |
---|
「古文码」 | 鎴戣兘鍚炰笅鐜荤拑鑰屼笉浼よ韩浣撱 | 大部分为不认识的古文,夹杂日韩文 | 以 GBK 方式读取 UTF-8 编码的中文 |
这个在上文中提到过。被误以 GBK 和 Big-5 解码经常会得到看起来像中日韩文字的结果。运气好的时候能全部或大部分恢复。 |
「口字码」 | ��������������� | 大部分字符为方块 | 以 UTF-8 的方式读取 GBK 编码的中文 |
这个方块是对不能显示的字符的替换符号,码位是 0xFFFD。通常来说内容是不能恢复的了。 |
「符号码」 | 巡音ルカ | 大部分字符为符号 | 以 ISO8859-1 方式读取 UTF-8 编码的中文 |
(见下条。) |
「拼音码」 | ѲÒô¥ë¥« | 大部分字符为头顶带有各种声调符号的字母 | 以 ISO8859-1 方式读取 GBK 编码的中文 |
上两条指的就是上文中提到的 Windows-1252 的例子。因为多是可见符号,显示上也没什么问题,所以很多时候可以完全恢复。 |
「问句码」 | 我能吞下玻璃而不伤身?? | 字符串长度为偶数时正确,字符串长度为奇数时最后的字符变为问号 | 以 GBK 方式读取 UTF-8 编码的中文(然后保存),然后又用 UTF-8 格式再次读取 |
由于编码特性问题,用 GBK 保存 UTF-8 文档可能会有内容损失。至于那俩问号...只是问号而已,最后的一个字是找不回来的。 |
「锟拷码」 | 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷 | 全中文字符,且大部分字符为「锟斤拷」这几个字符 | 以 UTF-8 方式读取 GBK 编码的中文,然后又用 GBK 格式再次读取 |
这个在上文也提到过。显然在这种案例下,内容是不可恢复的了。 |
其实,其实,这里最优雅的方案应是 Musicbrainz Picard(或类似产品)。
<br /> 今天练习孙鑫老师MFC视频中第五章的文本编辑程序时遇到了一个很令人蛋疼的问题,就是Unicode版本的问题,会出现乱码,大家都知道中文是2个字节的,如果按照非Unicode字符处理,就会出现乱码,试了半天,终于解决,现在把我遇到的问题以及解决方法整理一下:(以孙鑫老师视频中例子为例)大家也可以创建SDK工程,关键是掌握方法。<br /> <br /> 1。先新建一个工程<br /> 2。然后按照视频写好代码,当输入英文时,一切好好的,我想输入中文试试,问题来了,这时按下退格键
作为一名程序员,我不得不说,字符乱码是我们经常遇到的一个令人头疼的问题。它不仅会影响我们的工作效率,还可能导致重要信息的丢失。但别担心,今天我就来和大家分享一下字符乱码的常见原因以及解决方法,让你以后遇到这种情况时不再手足无措。
首先,让我们来看看最常用的一种解决方案:
文本乱码转码助手(小白推荐,工具由"勤学道人"开发)
分析乱码产生的原因及常见乱码的解决方法1、为什么需要编码2、常见编码ASCII 码ISO-8859-1(扩展ASCII编码)GB2312GBK(扩展GB2312)Unicode编码集UTF-16UTF-8几种编码的比较3. 乱码产生的原因尝试恢复乱码
在了解怎么解决乱码之前,很有必要了解几种编码格式。本文主要基于以下几个方面介绍
为什么需要编码
常见的编码格式
乱码产生的原因
尝试恢复乱码
1、为什么需要编码
主要有以下几个原因
计算机中存储信息的最小单元是一个字节即 8 个 bit,所以能表示的字符
在平常我们开发的过程中,可能会遇到各种各样的问题,其中中文乱码问题是最普遍最麻烦的,因为寻常的中文乱码会有各种形式,有前端原因,也有后台原因,所以需要具体问题具体分析。下面将从几个常见乱码问题入手,分析其原理,给出解决方案,以便到后续开发中能够尽量避免此问题的发生。目录引言一、问题阐述与分析 1.1 IDEA控制台乱码问题 1.2 页面乱码问题 1.3 前台参数乱码问题 1.4 数据库插入乱码问题 1.5 服务器乱码问题 1.6 CSV等文件中文乱码问题 1.7 U
展开全部1、×&%¥e69da5e887aa62616964757a686964616f31333433636136#@……2、§№☆●◎□◆○◎★▲△■※£¤¢℃¥ξοωχυλβιμητσ3、@#$^&%!$# ……*&%¥&@34%#!4、★☆★$ & ¤ § | °゜ ¨ ± · × ÷ ˇ ˉ ˊ ˋ ˙ Γ Δ Θ Ξ Π Σ Υ Φ Ψ Ω α ...
对于Java由于默认的编码方式是 UNICODE,所以用中文也易出问题,常见的解决是String s2 = new String(s1.getBytes(“ISO-8859-1”),”GBK”);前三种方法是我比较常用的方法,别人的经验告诉我:通常get方法通过改server.xml解决,post方法通过过滤器或者设置字符集解决,呵呵,不知道是否可行!1、utf8解决JSP中文乱码问题一般说来在每
//1 以GBK方式读取UTF-8码的中文 古文+日韩
String str = "我爱你啊分为了交流大多为不认识的古";
String s0 = new String(str.getBytes(), "GBK");
System.out.println("s0 = " + s0);
//2 以UTF-8的方式读取GBK码的中文 小方块
String s1 = new String(str.getBytes(...
3、各种符号,以ISO8859-1方式读取UTF-8
4、拼音码,带声调的字母,以ISO8859-1方式读取GBK
5、长度为奇数时,最后的字符变成问号,以GBK读取UTF-8编码,再用UTF-8格式再次读取。
6、大部分文字为锟斤拷,以UTF-8方式读取GBK码,再次用GBK格式再次读取。