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

锟斤拷

Unicode和老编码体系的转化过程中,肯定有一些字,用Unicode是没法表示的,Unicode官方用了一个占位符来表示这些文字,这就是:U+FFFD REPLACEMENT CHARACTER。
那么U+FFFD的UTF-8编码出来,恰好是 '\xef\xbf\xbd'。如果这个'\xef\xbf\xbd',重复多次,例如 '\xef\xbf\xbd\xef\xbf\xbd',然后放到GBK/CP936/GB2312/GB18030的环境中显示的话,一个汉字2个字节,最终的结果就是:锟斤拷——锟(0xEFBF),斤(0xBDEF),拷(0xBFBD)[1]  。

http://baike.baidu.com/link?url=GCoDM7HBIV_JcJfXzIU9p1Rx7r8Ns2w6jVoZwnhn9ZizxhNG7egrUWojSETDzxb74uZFeVGIBK_qZYgNTo7So_

锘锘锘原理

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下的不二之选。


烫烫烫屯屯屯

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

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

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

锟斤拷则涉及unicode的字符集转换问题,Unicode和老编码体系的转化过程中,肯定有一些字,用Unicode是没法表示的,Unicode官方用了一个占位符来表示这些文字,这就是:U+FFFD REPLACEMENT CHARACTER。U+FFFD的UTF-8编码是0xEFBFBD,如果重复多次形成:EFBFBDEFBFBDEFBFBD 这样

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


### 关于代码输出“”的可能原因 在编程过程中,当遇到代码输出异常字符(如“”),通常可能是由于以下几个方面引起的: #### 1. **编码问题** 如果程序涉及字符串处理或文件读写操作,则可能存在编码不匹配的情况。例如,在某些情况下,UTF-8 编码的 BOM 字节可能会被误解读为普通字符,从而导致显示异常[^1]。 解决方案可以尝试以下措施: - 明确指定源文件和运行环境中的编码方式。 - 如果使用的是 UTF-8 文件,建议去掉 BOM 头部。 ```python with open('file.txt', 'r', encoding='utf-8-sig') as f: content = f.read() print(content) ``` #### 2. **未初始化变量** 在调试模式下,编译器会自动填充未初始化的内存区域以帮助开发者发现潜在问题。例如,在 Visual Studio 的 Debug 模式中,未初始化的内存会被设置为 `0xCC`,这可能导致意外的行为或输出[^2]。 对于这种情况,应确保所有变量都已正确定义并赋初值后再参与运算。 ```c++ int value = 0; // 初始化变量 std::cout << value; ``` #### 3. **数据传输错误** 假设当前项目依赖某种输入/输出框架来传递消息至终端屏幕。“”现象也可能源于网络协议栈解析失败或是序列化反序列化进程中的偏差。基于系统论视角来看待此类状况时,需着重审查三个要素——即实际传入的数据流形式、中间转换逻辑以及最终呈现效果之间的关联性[^3]。 #### 4. **动态分配资源不当** 通过 C++ 中的新建实例机制创建对象期间如果没有妥善调用构造函数就可能出现不可预期的结果。这是因为即使成功获取堆地址但仍缺少必要的属性配置步骤所致[^4]。因此务必遵循标准流程实现完整的实例生成过程。 --- ### 提供一段示范修复后的伪代码片段如下所示: ```cpp class Example { public: std::string text; Example() : text("default") {} // 构造函数显式定义默认值 }; Example* examplePtr = new Example(); delete examplePtr; // 使用完毕释放指针指向的对象 examplePtr = nullptr; // 防止悬空指针隐患 ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值