十万个为什么 「你知道为什么汉字有时会乱码变成问号(?)或别的字符吗?」
十万个为什么「 你知道为什么汉字有时会乱码变成(问号)<?>或别的字符 吗?」
这个问题就瞎扯一下,我有兴趣就多说一点,没兴趣的部分就不多扯
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对应的就是字符?
至于其他的乱码字符(例如:�Ĵ�ʡ�ɶ��� ����),和上面的差不多,截取的太多或太少,转译出来的就会有变化,至于变成了什么那就要去表里查一下了
十万个为什么 「你知道为什么汉字有时会乱码变成问号(?)或别的字符吗?」相关推荐
- Myeclipse中导入项目后java类中汉字注释出现乱码问题(已解决)
Myeclipse中导入项目后java类中汉字注释出现乱码问题(已解决) 参考文章: (1)Myeclipse中导入项目后java类中汉字注释出现乱码问题(已解决) (2)https://www.cn ...
- 设计需要冲击力:「不怕没品味的人,就怕没品味的人用心」
"如何让一个网站看起来高大上?或者更有设计感?" 姑且仅理解为视觉层面上如何更好,当然一个网站不仅仅只有视觉,最终的结果是多方因素的完美结合. 让人感受"高大上" ...
- Qt使用socket通信时接收的汉字信息显示时乱码
显示乱码的原因是因为编码格式不一致. 下面附上一个曾经的例子. QString str = ui->textEdit->toPlainText();QByteArray text = st ...
- java jsp输出乱码,这是小弟我的JSP文件,输出后,汉字显示为乱码,怎么解决
当前位置:我的异常网» Java Web开发 » 这是小弟我的JSP文件,输出后,汉字显示为乱码,怎么解 这是小弟我的JSP文件,输出后,汉字显示为乱码,怎么解决 www.myexceptions.n ...
- Java 汉字转拼音(倒叙显示,过滤字符,字母,有数字添加到末尾)
汉字转拼音(倒叙显示,过滤字符,字母,有数字添加到末尾) 第三方架包下载地址:https://sourceforge.net/projects/pinyin4j/files/ package a; i ...
- Java中「与运算,或运算,异或运算,取反运算。」
Java中「与运算,或运算,异或运算,取反运算.」 文章目录 Java中「与运算,或运算,异或运算,取反运算.」 Java中的「与运算(AND) & 」 规则 :都为1时才为1,否则为0 Ja ...
- html英文模板显示中文,网上下的网站模板,用dreamweaver修改字体后,我如果用搜狗打进去汉字就显示乱码,但如果我打的是英文就能显示,不知道怎么解决,求各位大神帮忙。...
网上下的网站模板,用dreamweaver修改字体后,我如果用搜狗打进去汉字就显示乱码,但如果我打的是英文就能显示,不知道怎么解决,有没有知道是什么情况,求各位大神帮忙. Photographica- ...
- C语言在读取txt类型文件中的汉字字符串出现乱码的解决办法
题目 C语言在读取txt类型文件中的汉字字符串出现乱码的解决办法 以下是本篇文章正文内容,欢迎朋友们进行指正,一起探讨,共同进步.--来自考研路上的lwj 一.前言 当我们在练习文件这一章节时,因为需 ...
- [转]SQL数据库查询到的汉字字段是乱码
使用英文版SQL数据库查询到的汉字字段是乱码的解决方案 2007-12-04 14:55:45 标签: 函数 SQL 数据库 乱码 排序规则 原创作品,允许转载,转载时请务必以超链接形式标明文 ...
最新文章
- uclinux与linux的区别
- Qt中多线程与界面组件的通信
- ubuntu18.04下pyaudio的安装
- Scrapy源码阅读分析_1_整体框架和流程介绍
- C#测量程序运行时间及cpu使用时间(转)
- 大数据之-Hadoop源码编译_源码编译具体流程_以及编译步骤---大数据之hadoop工作笔记0046
- [转] 先验概率与后验概率贝叶斯与似然函数
- FIND、FINDINDEX、INDEXOF、LASTINDEX、INCLUDES 数组五种查询条件方法介绍
- iOS 推送功能打包后获取不到deviceToken
- 转 GRE -- ME 似乎有件事,一直等待着我去做,努力去做。
- 利用Racher轻松构建PASS平台
- 金士顿100 G3U盘写保护无法格式化的解决方法记录
- 15s是什么意思c语言,15s是什么意思
- 3G中的A-GPS移动定位技术
- 0x00007FFE9071C408 (ucrtbase.dll) (xxx.exe 中)处有未经处理的异常: 将一个无效参数传递给了将无效参数视为严重错误的函数。
- 小米手机刷机为Linux,小米5 刷机LineageOS 14.1的详细教程
- linux的标准输入输出
- [Java并发包学习]深度剖析ConcurrentHashMap
- 再谈数据安全:TCG Opal介绍
- android rndis
热门文章
- c语言怎么打出花边图案,甄嬛舌尖各种版本苏牙咬人 连黄梅戏C语言都来了
- 每周资讯 | 三星成为加拿大Telus5G设备供应商、高通发布骁龙690处理器、诺基亚与博通合作开发5G芯片……...
- bzoj 3398: [Usaco2009 Feb]Bullcow 牡牛和牝牛
- Elasticsearch-Cat命令详解
- 猿创征文|unity中的MVC编程思想基础
- win2019离线安装.NET Framework 3.5的方法
- 史上最全SQL基础知识总结
- corex9服务器组装攻略,ROG M7H+ GTX980+Tt Core X9怪兽级主机攒机记
- git 忽略某些文件
- VBA编程——范例一