经典乱码“烫烫烫”和“屯屯屯”

转载参考自 https://blog.csdn.net/me4weizhen/article/details/51920343
转载参考自 https://blog.csdn.net/jarelzhou/article/details/19013037
转载参考自 https://blog.csdn.net/sinat_27382047/article/details/72810390

文章目录

  • 经典乱码“烫烫烫”和“屯屯屯”
    • 1. 烫烫烫屯屯屯
    • 2. 锟斤拷
    • 3. 锘锘锘原理

1. 烫烫烫屯屯屯

在 Visual Studio 中的 Debug 模式下,如果声明一个变量,但是没有初始化,微软会给未初始化的内存复制为 0xCC。给为初始化的内存赋 0xCC 是有原因的,0xCC 其实是 INT3 中断指令,所以如果在Debug 模式下试图去执行这块未初始化的内存的话就会中断程序。

但 VS 中调试器默认的字符集是 MBCS,而在 MBCS 中 0xCCCC (就是两个0xcc)正好就是中文 (一个汉字两字节) 中的“烫”,所以显示出来就都是烫……

如果是用分配堆的内存,会初始化成 0xCD,0xCDCD 在MBCS 字符集中就是屯……

演示代码:

#include<stdio.h>
#include<malloc.h>
int main()
{//烫烫烫char a[5];a[0] = 'a';//第一个赋了值printf("%s\n", a);//屯屯屯char *p = (char *)malloc(16);if (p)printf("%s", p);free(p);return 0;
}

运行结果:

这种情况只有在 debug 模式下才会出现,为什么不适用于 release 模式,我的猜测是节省内存开销,此外 release 模式下声明一个变量却不初始化,这个变量中存放的应该是过去被使用的某个值。

2. 锟斤拷

锟斤拷则涉及 unicode 的字符集转换问题,Unicode和老编码体系的转化过程中,肯定有一些字,用 Unicode 是没法表示的,Unicode 官方用了一个占位符来表示这些文字,这就是
U+FFFD REPLACEMENT CHARACTER (译为 U+FFFD 替换字符)。

U+FFFD 的 UTF-8 编码是 0xEFBFBD (\xef\xbf\xbd),如果出现两个连着的 \xef\xbf\xbd\xef\xbf\xbd,按照两个字节一个字显示成汉字,就成了 锟斤拷 这三个字。

在 GBK/CP936/GB2312/GB18030 的环境(都是中国标准惹的祸)中显示的话,一个汉字 2 个字节,最终的结果就是:锟斤拷——锟(0xEFBF),斤(0xBDEF),拷(0xBFBD)……

演示代码

#include<stdio.h>
int main()
{//锟斤拷char *a = "\xef\xbf\xbd\xef\xbf\xbd";printf("%s\n", a);//锘锘锘char *b = "\xef\xbb";printf("%s\n", b);return 0;
}

运行结果

3. 锘锘锘原理

BOM 是 Byte Order Mark 的缩写。是 UTF 编码方案里用于标识编码的标准标记,在 UTF-16 里本来是FF FE,到 UTF-8 就成了EF BB BF。这个标记是可选的,因为 UTF8 字节没有顺序,所以它可以被用来检测一个字节流是否是 UTF-8 编码的。

锘 EFBB
匡 BFEF
豢 BBBF

出现这个问题肯定是你写网页的时候用了记事本 ,记事本在保存文件的时候把原本文件的编码改了记事本会默认保存为UTF-8 的编码,而如果你原本网页是 GBK 编码的,就会出现乱码~

BOM 就是把一个 Unicode 保留字符 U+FEFF,按照文件存储者的编码方式编码后,塞到文件内容的最前边。这样用不同的 Unicode 编码去解析文件头,就可以得知文件的编码方式和大小端顺序。结果就是文件头部多出来了两三个字节。

有了 BOM 所有的程序都必须为 BOM 作出修改,这无疑是一个“大折腾”的行为。所以一般不认为 BOM 是个好主意。BOM 引发的问题,我能想起来两个:

PHP无法指定header(因为有BOM相当于开启输出)
UNIX可执行脚本的Shabang标记(#!)不能识读

任何时候都采用无 BOM 的 UTF-8 编码的 Unicode,绝对是一个引发麻烦最少的最实用策略。UTF-8 是 Unicode 的最佳实践,没有之一。

必须指出的是,何弃疗的微软经常做出非要 DOM 不可的行为,最典型的例子就是那个记事本(存盘就加 DOM)。所以任何时候,都千万别偷懒用记事本编辑 PHP。华语骄傲 Notepad++ 是 Windows 下的不二之选。

PS: 锘锘锘这块的内容我并不是太理解,目前也没有太多时间深究,后续接触到这块内容的话会对博客进行补充。

经典乱码“烫烫烫”和“屯屯屯”相关推荐

  1. PHP经典乱码“锘”字与解决办法

    PHP经典乱码"锘"字与解决办法 这几天看了看 Ajax 的基础知识,在练习一个简单的 请求和响应时,PHP 返回来的数据 在 IE 中开头总显示 一个 "锘" ...

  2. 移动硬盘运行linux很烫,硬盘烫手正常吗

    硬盘是电脑主要的存储媒介之一,由一个或者多个铝制或者玻璃制的碟片组成.碟片外覆盖有铁磁性材料.下面是小编带来的关于硬盘烫手正常吗的内容,欢迎阅读! 硬盘烫手正常吗: 主要是因为硬盘的运行其实是在告诉旋 ...

  3. PHP经典乱码“口”字与解决办法

    这几天看了看 Ajax 的基础知识,在练习一个简单的 请求和响应时,PHP 返回来的数据 在 IE 中开头总显示 一个 "锘" 字!上网 Baidu 了一下,发现这是由于 系统 处 ...

  4. windows utf8 签名 一个很二的问题(经典乱码“锘”字)

    有时候用某个软件保存出xml 发现中文出现乱码,在txt,和vs里都能正常打开,可是用程序或者第三放库打开就是xml解析错误或者中文乱码 微软在自己的UTF-8格式的文本文件之前加上了EF BB BF ...

  5. 烫烫烫和屯屯屯2021

    malloc屯屯屯 #include <stdio.h> #include <stdlib.h>int main(int argc, char **argv) {void *p ...

  6. 手持两把锟斤拷, 口中疾呼烫烫烫, 脚踏千朵屯屯屯, 笑看万物锘锘锘

    锟斤拷的来历 GBK与UTF-8 Unicode和老编码体系的转化进程中,一定有一些字,用Unicode是没法表示的,Unicode官方用了一个占位符来表示这些文字,这就是:U+FFFD REPLAC ...

  7. 你很烫吗?我很烫——关于栈区和静态存储区的思考

    1.引言 相信经常用VC的朋友对屏幕输出的一大堆"烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫"不会陌生,但是也许会很奇怪,为什么会出现"烫"字呢?莫非改程序 ...

  8. 现在无法停止通用卷设备_软化和柔顺有什么区别吗?头发粗硬适合拉直还是烫卷?...

    去理发店做头发,经常被推荐软化.柔顺等项目,五花八门真心搞不懂这些花里胡哨的名词到底都是什么意思.这个话题最近很火,而且引发了网友们的热议,这不仅让人想起去医院看病的时候,面对医生的病例简直是一脸懵, ...

  9. 流行发型--空间修剪+立体空间烫

    瑞丽烫.流行发型--空间修剪+立体空间烫 发型设计:张军权(瑞丽烫形象设计艺术总监) 烫发是美发流程中非常关键的环节,也是技术难度最高的环节,而且烫发技巧翻新速度极快,花样迭出,比如时下流行的烟花烫. ...

最新文章

  1. 对某课程的建议和意见_2021年河南专升本专科专业对照和考试课程征求意见
  2. red5安装时候出现服务不能启动异常
  3. 信息检索的评价指标(Precision、Recall、F-score、MAP、ROC、AUC)
  4. 风控项目-收集基础知识1
  5. Android SQLite (三 ) 全面详解(一)
  6. 批量提取 caffe 特征 (python, C++, Matlab)(待续)
  7. 分数加减法 http://acm.nyist.net/JudgeOnline/problem.php?pid=111
  8. C++ 各种数据类型转换总结(不断更新中.....)
  9. 94. Binary Tree Inorder Traversal
  10. kasp技术优点_【华智技术贴】分子标记技术及育种应用(下):基于测序技术的第三代分子标记...
  11. Slideout.js+YDUI Touch+mescroll
  12. 从底层操作系统到容器云平台:OpenCloudOS与秒云构筑完美兼容链
  13. VB.NET绘图8---总结
  14. 客户管理是企业利润的根本,企业如何进行客户管理呢?
  15. ftp 出现Passive mode refused 解决办法
  16. echarts地图中显示数字或省份
  17. ZT自老罗的博客 Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析...
  18. c语言 topk算法,scala写算法-用小根堆解决topK
  19. 如何在Excel中批量新建工作表
  20. 设计模式之—建造者模式(Builder)-Java实现

热门文章

  1. mt4 虚拟服务器 配置,mt4配置云服务器教程
  2. STM32 使用 ITM 输出调试信息
  3. echarts快速上手
  4. numpy 光速入门示例
  5. ios 后台唤醒应用_iOS 后台运行机制
  6. 千金都难买的到这张表
  7. 全文检索-Elasticsearch安装、集群和使用超全解读
  8. 联想计算机不能进入系统桌面,联想笔记本进不去桌面的解决方法
  9. 大卫·波拉克(David Pollak)和迪克·沃尔(Dick Wall)讨论了采用Scala的障碍
  10. 计算小分子之间的RMSD