22nd
Last updated
Was this helpful?
Last updated
Was this helpful?
字符集是字符的集合,规定了字符对应的二进制表示方式,由于计算机只认识 0 和 1,所以我们平时使用的各种字符在计算机底层也必须用二进制表示,Unicode 就是一个包含了世界上几乎所有语言的每一个字符的集合。而字符编码则规定了字符的编码方式,常见的字符编码方案有 UTF-8、UTF-16、GBK 等。如果编码和解码的方式不匹配,就会产生乱码。最著名的乱码当属“锟斤拷”和“烫烫烫”了。
“锟斤拷”的来源是这样的。如果我们想要用 Unicode 编码记录一些文本,特别是一些遗留的老字符集内的文本,但是这些字符在 Unicode 中可能并不存在。于是,Unicode 会统一把这些字符记录为 U+FFFD 这个编码。如果用 UTF-8 的格式存储下来,就是\xef\xbf\xbd。如果连续两个这样的字符放在一起,\xef\xbf\xbd\xef\xbf\xbd,这个时候,如果程序把这个字符,用 GB2312 的方式进行 decode,就会变成“锟斤拷”。
而“烫烫烫”,则是因为如果你用了 Visual Studio 的调试器,默认使用 MBCS 字符集。“烫”在里面是由 0xCCCC 来表示的,而 0xCC 又恰好是未初始化的内存的赋值。于是,在读到没有赋值的内存地址或者变量的时候,程序就会输出“烫烫烫”。
参考资料: