十万个为什么「 你知道为什么汉字有时会乱码变成(问号)<?>或别的字符 吗?」


这个问题就瞎扯一下,我有兴趣就多说一点,没兴趣的部分就不多扯

Sclifftop「你知道为什么汉字有时会乱码变成问号(?)或别的字符吗?」


至于字符集和编码方式的区别,现在都混起来了,你可以用编码两个字包括它们所有

从哪开始说呢,先从字符集开始说吧

先说下ASCII,我发现很多人把后面的当作罗马数字2(Ⅱ),不是的,它是两个大写的字母i,全称是American Standard Code for Information Interchange,共定义了128个字符,它是针对英语,后面又有了扩展的ASCII码

但还是不够,就有了Unicode字符集,Unicode采用了16位,基本上包含了所有的语言字符

ISO-8859-1:单字节编码,向下兼容ASCII,0x00-0x7F之间完全和ASCII一致,0x80-0x9F之间是控制字符,0xA0-0xFF之间是文字符号


然后稍微说下几个编码方式

UTF-8:是一种针对Unicode的可变长度字符编码,俗称万国码,海贼里大妈想要实现的最终理想就是“建立万国”,她建立万国是要干什么(可能是用来日)后面剧情没看,别问,问就是不知道

GB2312:GB2312是1980年由国家标准总局发布,适用于汉字处理,每个汉字和符号用两个字节来表示

GBK:最初是由微软对GB2312的扩展

还有很多UTF-16什么的,你们自己去查


然后就是产生的原因

为了便于理解,我就拿java来说,不为别的,就是因为俺有现成的源码可以看,就问你气不气,如果你不知道那没关系,慢慢看代码,看不懂也不影响下面结论,相差不大,都是从C,C++,java过来的,有什么看不懂的

先说下java其中的方法getBytes

getBytes方法使用指定的字符集将字符串编码为byte序列,并将结果存储到一个新的byte数组中

先看下getBytes方法是什么样的

  951       public byte[] getBytes(String charsetName)952           throws UnsupportedEncodingException953       {954           if (charsetName == null) throw new NullPointerException();955           return StringCoding.encode(charsetName, value, offset, count);956       }976       public byte[] getBytes(Charset charset) {977           if (charset == null) throw new NullPointerException();978           return StringCoding.encode(charset, value, offset, count);979       }994       public byte[] getBytes() {995           return StringCoding.encode(value, offset, count);996       }

根据上面看以看出它调用的是StringCoding.encode()方法,那我们看下encode方法

  326       static byte[] encode(String charsetName, char[] ca, int off, int len)327           throws UnsupportedEncodingException328       {329           StringEncoder se = deref(encoder);330           String csn = (charsetName == null) ? "ISO-8859-1" : charsetName;331           if ((se == null) || !(csn.equals(se.requestedCharsetName())332                                 || csn.equals(se.charsetName()))) {333               se = null;334               try {335                   Charset cs = lookupCharset(csn);336                   if (cs != null)337                       se = new StringEncoder(cs, csn);338               } catch (IllegalCharsetNameException x) {}339               if (se == null)340                   throw new UnsupportedEncodingException (csn);341               set(encoder, se);342           }343           return se.encode(ca, off, len);344       }382       static byte[] encode(char[] ca, int off, int len) {383           String csn = Charset.defaultCharset().name();384           try {385               return encode(csn, ca, off, len);386           } catch (UnsupportedEncodingException x) {387               warnUnsupportedCharset(csn);388           }389           try {390               return encode("ISO-8859-1", ca, off, len);391           } catch (UnsupportedEncodingException x) {392               // If this code is hit during VM initialization, MessageUtils is393               // the only way we will be able to get any kind of error message.394               MessageUtils.err("ISO-8859-1 charset not available: " + x.toString());396               // If we can not find ISO-8859-1 (a required encoding) then things397               // are seriously wrong with the installation.398               System.exit(1);399               return null;400           }401       }402   }

Charset.defaultCharset()是干嘛的知道不,这是获取默认的编码格式,那问题又来了,这个“默认”指的是什么,听好了嗷,“默认”指的是环境变量里配置的编码格式

从源码可以看出,如果你不指定编码,那就先获取默认的编码格式,如果没有或者是不支持那就使用ISO-8859-1

那你又想问了,如果不支持ISO-8859-1怎么办,怎么办?能怎么办,国际通用到你这都变不通用了,我也不知道该怎么办


先写下面的一段代码:

结果:

根据上面可以看出,如果使用ISO-8859-1,截取一个字节后中文字符编码会变为63,你随便找个表,就拿ASCII说,63对应的就是字符?

至于其他的乱码字符(例如:�Ĵ�ʡ�ɶ��� ����),和上面的差不多,截取的太多或太少,转译出来的就会有变化,至于变成了什么那就要去表里查一下了



十万个为什么 「你知道为什么汉字有时会乱码变成问号(?)或别的字符吗?」相关推荐

  1. Myeclipse中导入项目后java类中汉字注释出现乱码问题(已解决)

    Myeclipse中导入项目后java类中汉字注释出现乱码问题(已解决) 参考文章: (1)Myeclipse中导入项目后java类中汉字注释出现乱码问题(已解决) (2)https://www.cn ...

  2. 设计需要冲击力:「不怕没品味的人,就怕没品味的人用心」

    "如何让一个网站看起来高大上?或者更有设计感?" 姑且仅理解为视觉层面上如何更好,当然一个网站不仅仅只有视觉,最终的结果是多方因素的完美结合. 让人感受"高大上" ...

  3. Qt使用socket通信时接收的汉字信息显示时乱码

    显示乱码的原因是因为编码格式不一致. 下面附上一个曾经的例子. QString str = ui->textEdit->toPlainText();QByteArray text = st ...

  4. java jsp输出乱码,这是小弟我的JSP文件,输出后,汉字显示为乱码,怎么解决

    当前位置:我的异常网» Java Web开发 » 这是小弟我的JSP文件,输出后,汉字显示为乱码,怎么解 这是小弟我的JSP文件,输出后,汉字显示为乱码,怎么解决 www.myexceptions.n ...

  5. Java 汉字转拼音(倒叙显示,过滤字符,字母,有数字添加到末尾)

    汉字转拼音(倒叙显示,过滤字符,字母,有数字添加到末尾) 第三方架包下载地址:https://sourceforge.net/projects/pinyin4j/files/ package a; i ...

  6. Java中「与运算,或运算,异或运算,取反运算。」

    Java中「与运算,或运算,异或运算,取反运算.」 文章目录 Java中「与运算,或运算,异或运算,取反运算.」 Java中的「与运算(AND) & 」 规则 :都为1时才为1,否则为0 Ja ...

  7. html英文模板显示中文,网上下的网站模板,用dreamweaver修改字体后,我如果用搜狗打进去汉字就显示乱码,但如果我打的是英文就能显示,不知道怎么解决,求各位大神帮忙。...

    网上下的网站模板,用dreamweaver修改字体后,我如果用搜狗打进去汉字就显示乱码,但如果我打的是英文就能显示,不知道怎么解决,有没有知道是什么情况,求各位大神帮忙. Photographica- ...

  8. C语言在读取txt类型文件中的汉字字符串出现乱码的解决办法

    题目 C语言在读取txt类型文件中的汉字字符串出现乱码的解决办法 以下是本篇文章正文内容,欢迎朋友们进行指正,一起探讨,共同进步.--来自考研路上的lwj 一.前言 当我们在练习文件这一章节时,因为需 ...

  9. [转]SQL数据库查询到的汉字字段是乱码

    使用英文版SQL数据库查询到的汉字字段是乱码的解决方案 2007-12-04 14:55:45 标签: 函数  SQL  数据库  乱码  排序规则 原创作品,允许转载,转载时请务必以超链接形式标明文 ...

最新文章

  1. uclinux与linux的区别
  2. Qt中多线程与界面组件的通信
  3. ubuntu18.04下pyaudio的安装
  4. Scrapy源码阅读分析_1_整体框架和流程介绍
  5. C#测量程序运行时间及cpu使用时间(转)
  6. 大数据之-Hadoop源码编译_源码编译具体流程_以及编译步骤---大数据之hadoop工作笔记0046
  7. [转] 先验概率与后验概率贝叶斯与似然函数
  8. FIND、FINDINDEX、INDEXOF、LASTINDEX、INCLUDES 数组五种查询条件方法介绍
  9. iOS 推送功能打包后获取不到deviceToken
  10. 转 GRE -- ME 似乎有件事,一直等待着我去做,努力去做。
  11. 利用Racher轻松构建PASS平台
  12. 金士顿100 G3U盘写保护无法格式化的解决方法记录
  13. 15s是什么意思c语言,15s是什么意思
  14. 3G中的A-GPS移动定位技术
  15. 0x00007FFE9071C408 (ucrtbase.dll) (xxx.exe 中)处有未经处理的异常: 将一个无效参数传递给了将无效参数视为严重错误的函数。
  16. 小米手机刷机为Linux,小米5 刷机LineageOS 14.1的详细教程
  17. linux的标准输入输出
  18. [Java并发包学习]深度剖析ConcurrentHashMap
  19. 再谈数据安全:TCG Opal介绍
  20. android rndis

热门文章

  1. c语言怎么打出花边图案,甄嬛舌尖各种版本苏牙咬人 连黄梅戏C语言都来了
  2. 每周资讯 | 三星成为加拿大Telus5G设备供应商、高通发布骁龙690处理器、诺基亚与博通合作开发5G芯片……...
  3. bzoj 3398: [Usaco2009 Feb]Bullcow 牡牛和牝牛
  4. Elasticsearch-Cat命令详解
  5. 猿创征文|unity中的MVC编程思想基础
  6. win2019离线安装.NET Framework 3.5的方法
  7. 史上最全SQL基础知识总结
  8. corex9服务器组装攻略,ROG M7H+ GTX980+Tt Core X9怪兽级主机攒机记
  9. git 忽略某些文件
  10. VBA编程——范例一