分析乱码产生的原因及常见乱码的解决方法_常见的乱码_qq_33157775的博客-程序员宅基地

技术标签: java  乱码  其他  


在了解怎么解决乱码之前,很有必要了解几种编码格式。

1、为什么需要编码

主要有以下几个原因

  1. 计算机中存储信息的最小单元是一个字节即 8 个 bit,所以能表示的字符范围是 0~255 ;
  2. 人类要表示的符号太多,无法用一个字节来完全表示;
  3. 要解决这个问题,就需要编码

2、常见编码

ASCII

ASCII(American Standard Code for Information Interchange,美国信息互换标准代码),是现今最通用的单字节编码系统。

ASCII 的高位是0,低 7 位表示具体字符。共有 128个字符,0-31、127 是控制字符如换行回车删除等;32~126 是特殊字符、字母、数字等。

具体能表示的字符可见 ASCII码对照表

为了保持与ASCII 码的兼容性,一般都是将最高位设置为1。也就是说,当最高位为0时,表示ASCII 码,当为1时就是各个国家自己的字符。

在这些扩展的编码中,在西欧国家中流行的是ISO-8859-1和Windows-1252,在中国是GB2312,GBK,GB18030和Big5,我们逐个来看下这些编码。

ISO-8859-1(扩展ASCII编码)

128 个字符显然是不够用的,于是 ISO 组织在 ASCII 码基础上又制定了一些列标准用来扩展 ASCII 编码,它们是 ISO-8859-1 ~ ISO-8859-15,其中 ISO-8859-1 涵盖了大多数西欧语言字符,应用最广泛。

ISO-8859-1 仍然是单字节编码。它向下兼容ASCII,它总共能表示 256 个字符。

具体能表示的字符可见 ISO-8859-1字符

Windows-1252

ISO 8859-1虽然号称是标准,用于西欧国家,但它连欧元(€) 这个符号都没有,因为欧元比较晚,而标准比较早。实际使用中更为广泛的是Windows-1252编码,这个编码与ISO8859-1基本是一样的,区别 只在于数字128到159,Windows-1252使用其中的一些数字表示可打印字符。

这个编码中加入了欧元符号以及一些其他常用的字符。基本上可以认为,ISO-8859-1已被Windows-1252取代,在很多应用程序中,即使文件声明它采用的是ISO-8859-1编码,解析的时候依然被当做Windows-1252编码。

GB2312

它是双字节编码,总的编码范围是 A1-F7,其中从 A1-A9 是符号区,总共包含 682 个符号,从 B0-F7 是汉字区,包含 6763 个汉字。

GBK(扩展GB2312)

是为了扩展 GB2312,加入更多的汉字,它的编码范围是 8140~FEFE(去掉 XX7F)总共有 23940 个码位,它能表示 21003 个汉字, 兼容GB2312 ,也就是说用 GB2312 编码的汉字可以用 GBK 来解码,并且不会有乱码。

GB18030(兼容GB2312,GBK)

GB18030向下兼容GBK,增加了五万五千多个字符,共七万六千多个字符。包括了很多少数民族字符,以及中日韩统一字符。

用两个字节已经表示不了GB18030中的所有字符,GB18030使用变长编码,有的字符是两个字节,有的是四个字节。

在两字节编码中,字节表示范围与GBK一样。在四字节编码中,第一个字节的值从0x81到0xFE,第二个字节的值从0x30到0x39,第三个字节的值从0x81到0xFE,第四个字节的值从0x30到0

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_33157775/article/details/106303682

智能推荐

FreeRTOS响应中断延迟问题_freertos延迟中断_0x9DEFA478的博客-程序员宅基地

FreeRTOS响应中断延迟问题问题详情解决方法问题详情问题的起因在https://blog.csdn.net/qq_42907191/article/details/120734795.中断操作信号量/消息队列时,应该被唤醒的线程却被延迟唤醒了。解决方法在中断操作信号量/消息队列后,调用portYIELD_FROM_ISR()是否切换线程由IsScheduler决定int H_TS_SemaphoreGive_ISR(void* Sem){ BaseType_t IsScheduler;_freertos延迟中断

操作系统发展_操作系统 tina_蒂娜Tina的博客-程序员宅基地

操作系统演变及历史介绍 操作系统的目标 方便:使计算机系统易于使用 有效:以更有效的方式使用计算机系统资源 扩展:方便用户有效开发、测试和引进新功能 操作系统的功用 进程管理/内存管理/文件系统/设备控制/网络管理 操作系统在计算机系统中承上启下的地位——向下封装硬件,向上提供操作接口 操作系统的发展经历 无操作系统 简单8位、16位操作系统阶段 复杂的多任务、多用户操作系统阶段 主流操作系统 PC:windows家族._操作系统 tina

好书推荐#《敏捷转型:智能商业时代的组织变革》_reany2019的博客-程序员宅基地

**《敏捷转型:智能商业时代的组织变革》**本书简介VUCA时代,企业面临的复杂问题越来越多。激活组织,一直是企业聚焦的核心。那么,组织激活与个体之间如何形成良性的价值互动呢?如何在思维、能力及治理结构上达成一种内在的向上突破?如何达成内生性增长与外延式增长的共舞?本书结合国内外数十家企业转型升级的案例研究以及对国内企业转型升级咨询项目的成功实践,提出敏捷转型四因子,系统地指导企业在智能商...

app上传图片以及识别身份证信息_上传身份证照片读取身份证号_weixin_43098742的博客-程序员宅基地

app上传图片以及识别身份证信息主要功能实现:1手机端拍照上传身份证照片到服务器,然后读取出身份证的信息。前端://选择相册 var files=[]; var index=1; function getImage(){ var cmr = plus.camera.getCamera(); cm..._上传身份证照片读取身份证号

Recyclerview&..多布局_recyclerview多布局的作用_aimer______的博客-程序员宅基地

Recyclerviewrecyclerview比listview的优点RecyclerView比listview实现效果更多RecyclerView根据项目需要插拔功能RecyclerView默认不支持点击事件->程序员代码中通过回调接口的方式添加监听一.效果:线性/网格/瀑布流二.重要的方法1.RecyclerView横向滑动:LinearLayoutManager...._recyclerview多布局的作用

websocket 带头部信息请求 header_BeetleX之Websocket协议分析详解-程序员宅基地

Websocket应用协议已经普及多年了,它是HTTP1.1的内部升级协议,主要作用是补充HTTP1.1无法灵活地主动推送消息给客户端的缺陷问题。在这里主要介绍一下使用组件如何扩展一个完整的Websocket协议。协议介绍Websocket并不复杂,但协议文档内容还是很全面的,以下是协议原文https://tools.ietf.org/html/rfc64..._websocket可以携带头信息吗

随便推点

WPF复杂形状按钮_cmis7645的博客-程序员宅基地

方法很简单,将图片转换为就可以了(需要用到Photoshop)不过一般情况下制作按钮都不会用到这种方法,通常只要用image填充一张图片或者把路径转成按钮控件就可以了。之所以这样做,是见到一位坛友提问说:如何根据PNG图片的形状来决定按钮的形状,大概意思可能就是只有在PNG图像形状范围内触发器才有效,不过他说的我也没怎么听明白,呵呵。。。自己试着做了一下。目前就想到了这个方法,也许还有

ImageDataGenerator生成器的flow_from_directory()函数_狂奔的菜鸡的博客-程序员宅基地

作用:获取目录的路径并生成增强数据批参数如下:def flow_from_directory(self, directory, target_size=(256, 256), color_mode='rgb', ..._flow_from_directory

使用 GNU 的 GDB调试器,内存布局和栈_gun 栈怎么调试_leileicaocao的博客-程序员宅基地

我们会学些什么? 为了更高效的学习使用GDB,你必须了解帧,通常也成为栈帧,因为帧构成了栈。为了学习栈,我们需要了解可执行文件的内存布局。这里的讨论主要都是理论上的,但是为了使学习比较有趣,在本章结束之前我们将通过GDB来展现栈和栈帧的例子。 本章学习的东西似乎相当的理论化,但是对于达到以下目的来说却是非常有用的:1. 理解栈对于_gun 栈怎么调试

地址随机化--ASLR_aslr 地址随机 stack_runshui27的博客-程序员宅基地

如何判断当前LINUX系统启用了ASLR:http://blog.sina.com.cn/s/blog_702eef6501011v07.html_aslr 地址随机 stack

ubuntu16.04安装TFTP服务_fttony2020的博客-程序员宅基地

1、安装TFTP服务TFTP服务的设置$ apt-get install tftp tftpd$ apt-get install openbsd-inetd2、创建tftpd目录$ mkdir /home/tony/tftpdir随便拷贝一个zImage进去做测试$ cp -fv zImage /home/tony/tftpdir$ chmod 777 /hom

android 动态设置TextView值,例:金额增加_aaronyan1990的博客-程序员宅基地

一说到动态递增设置TextView值,很多人应该马上就想到起个线程,让后在线程中睡眠指定时间,使用handler发送消息更新TextView值!这样是实现了动态递增设置TextView值但是效率不咋滴吧,需要的话可以自己去试试,如1到100,10s内显示完,会感觉到有点卡的!这里有个更好的方法,使用ValueAnimator进行设置,而且不需要...

推荐文章

热门文章

相关标签