锟斤拷 (转)

锟斤拷,经常在搜索引擎和网站上看到的字符。是一种因微软漏洞造成的乱码。

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个字节,最终的结果就是:锟斤拷

我们上网的时候不用去关心网站采用了什么编码格式,但是页面中不时出现的乱码还是会让我们头疼。在这点上,Firefox的用户更是深有体会,用Firefox浏览网页看到乱码的机会要比IE多得多。 乱码主要与字符编码系统有关。例如一个网页中常出现的乱码“锟斤拷”(百度,Google),它就是新老编码系统转换中出现的。
网友est专门写了一篇文章来考证问题来源:

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的环境中显示的话就是“锟斤拷——锟(0xEFBF),斤(0xBDEF),拷(0xBFBD)”。

 

http://baike.haosou.com/doc/5600962.html

 

@Test
public void testKunJinKao(){
  String str="我不是锟斤拷";
  try {
    byte[] buff=null;

    //让我们先看看几种错误的转换,let's go

    //1. 正常的GBK字节流,你以为是UTF-8,所以用UTF-8去解码...
    buff=str.getBytes("GBK");//这里只要不抛异常,数据一定不会被破坏
    String str1=new String(buff,"UTF-8");
    System.out.println(str1);//这是一种情形:���

    //2. 正常的UTF-8字节流,你以为是GBK,所以用GBK去解码...
    buff=str.getBytes("UTF-8");//这里只要不抛异常,数据一定不会被破坏
    String str2=new String(buff,"GBK");//这里破坏了
    System.out.println(str2);//这是另外一种情形:

    //说了半天,锟斤拷在哪里呢?come on

    //3. 本来正常的GBK字节码,在你不知道的某个环节已经被错误的使用UTF-8解码了
    String str3=new String(str.getBytes("GBK"),"UTF-8");
    String str4=new String(str3.getBytes("UTF-8"),"GBK");//这里你并不知道数据已经破坏了,这样用是对的。
    System.out.println(str4);//锟斤拷

    /**
     * Got it.How are you,nice to meet you.
     *
     * Why?
     * 如果说情形1、2是开发者自己造成的,
     * 那么情形3往往是开发者被坑了,别人造成的(也可能是容器层),总之你拿到的时候已经乱了。
     */

    /**
     * 细心的你会发现,正是情形1的错误,导致了情形3的发生。之所以表现不同,是因为情形1的程序猿是在UTF-8下打印输出;
     * 而情形3是在GBK下打印输出。
     */

    /**
     * 总结一下,锟斤拷是怎么产生的?
     *
     * 源于GBK字符集和Unicode字符集之间的转换问题。
     * Unicode和老编码体系的转化过程中,肯定有一些字,用Unicode是没法表示的,
     * Unicode官方用了一个占位符(REPLACEMENT CHARACTER)来表示这些文字,这就是:U+FFFD
     *
     * U+FFFD的UTF-8编码出来,恰好是 '\xef\xbf\xbd'。
     *
     * 重复多次,例如 '\xef\xbf\xbd\xef\xbf\xbd',
     * 然后放到GBK/CP936/GB2312/GB18030的环境中显示的话,
     * 一个汉字2个字节,最终的结果就是:锟斤拷——锟(0xEFBF),斤(0xBDEF),拷(0xBFBD)。
     */
  } catch (Exception e) {
    e.printStackTrace();
  }


}

https://blog.csdn.net/54powerman/article/details/71077922

 

### NRF24L01模块连接失败解决方案 当遇到NRF24L01模块连接失败的情况时,可以按照以下几个方面来排查和解决问题。 #### 1. 检查硬件连接 确保SPI接口连线无误,特别是MOSI, MISO, SCK, CE, CSN这些引脚要正确连接到微控制器上。任何松动或错误的连接都可能导致通信异常[^1]。 #### 2. 验证电源供应 确认给NRF24L01供电的是稳定干净的3.3V电压源。不稳定的电源可能会引起工作不稳定甚至完全失效。建议使用带有良好滤波效果的稳压器为设备提供电力支持。 #### 3. 天线调试 对于天线部分,应该保证其处于开放空间内并无遮挡物影响信号传输;另外还需注意所选频段是否受到干扰。必要时可尝试更换不同类型的天线或将现有天线调整至更优位置以改善性能表现。 #### 4. 参数配置审查 仔细核对初始化过程中设置的各项参数(如频道号、地址长度等),确保发送端与接收端之间保持一致。可以通过读取寄存器状态节的方式验证当前设定值是否符合预期要求。 ```cpp // 示例代码片段:检查并打印出一些重要的配置项 void checkConfig() { uint8_t configReg = readRegister(CONFIG); Serial.print("CONFIG Register Value: "); Serial.println(configReg, HEX); // 更多类似的检查... } ``` #### 5. 软件层面测试 编写简单的程序来进行基本功能检测,比如循环往复地向指定目标发送固定模式的数据包,并观察对方能否正常接收到。这有助于快速定位问题所在——究竟是硬件还是软件出了差错。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值