乱码,乱码

当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的。二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”。计算机处理文本,就必须把文本转换为二进制才能处理。

一、字符编码

早期计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255(二进制11111111=十进制255),如果要表示更大的整数,就必须用更多的字节。

1. ASCII码

ASCII(美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统。比如大写字母A的编码是65,小写字母a的编码是97。由于标准ASCII字符集字符数目有限,在实际应用中往往无法满足要求。

2. Unicode

至于汉字,不同的字符集用的ASCII码的范围也不一样,常用的汉字字符集有GB2312、GBK,至少需要两个字节。全世界有上百种语言,日本把日文编到Shift_JIS里,韩国把韩文编到Euc-kr里,各国有各国的标准,就会不可避免地出现冲突,结果就是,在多语言混合的文本中,显示出来会有乱码。因此,Unicode应运而生。Unicode把所有语言都统一到一套编码里,是计算机科学领域里的一项业界标准,包括字符集、编码方案等。解决了传统的字符编码方案的局限性,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。

3. ASCII编码和Unicode编码的区别

ASCII编码是1个字节,而Unicode编码通常是2个字节。

  • 字母“A”用ASCII编码是十进制的65,二进制的01000001;
  • 汉字“中“已经超出了ASCII编码的范围,用Unicode编码是十进制的20013,二进制的01001110 00101101。

如果把ASCII编码的”A“用Unicode编码,只需要在前面补0就可以,因此,”A“的Unicode编码是00000000 01000001。

4. UTF-8

新的问题又出现了:如果统一成Unicode编码,乱码问题从此消失了。但是,如果你写的文本基本上全部是英文的话,用Unicode编码比ASCII编码需要多一倍的存储空间,在存储和传输上就十分不划算。所以,本着节约的精神,又出现了把Unicode编码转化为“可变长编码”的UTF-8编码。UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。

5. UTF-8、UTF-16、UTF-32区别

  • UTF-8是一种针对Unicode的可变长度字符编码,英文字母被编码成1个字节,汉字通常是3个字节,节省空间;
  • UTF-32每个字符都使用4字节,字节内容一一对应码点,转换规则简单直观,查找效率高;
  • UTF-16字符要么是2个字节,要么是4个字节。

二、编码转换

在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。

示例:用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件:

示例:浏览网页的时候,服务器会把动态生成的Unicode内容转换为UTF-8再传输到浏览器:

<meta charset="UTF-8" />的信息,表示该网页正是用的UTF-8编码。

三、JavaScript中的编码

1. 字符串长度

注意:汉字的码点是0x20BB7,UTF-16编码为0xD842 0xDFB7(十进制为55362 57271),需要4个字节储存。对于这种4个字节的字符,JavaScript不能正确处理,字符串长度会误判为2。

2. 访问字符串中特定字符的方法

注意:”≈”,charAt方法无法读取整个字符

3. ES6提供了正确处理4个字节储存的字符

特别说明:由于CSDN博客编码问题,导致文中”??”()无法正常展示,所以只能使用截图。实属无奈,敬请谅解!!!

时间: 2024-12-10 22:45:55

乱码,乱码的相关文章

乱码的根本原因是字节和字符的问题(转)

1,为什么会出现乱码 乱码的根本原因是字节和字符的问题. 我们在大学学习c的时候,老师就有介绍字符和字节. 字节由8个bit位表示,最早的编码是ASCII码,ASCII码是单字节的编码字符.因为单字节8个bit位对于中文字符和其他国家的字符来说根本不够用,需要更多的bit位来表示字符.我们现在常见的编码有GBK,BIG5,GB2312,UTF-8,通过编码映射表可以确定bit位和字符之间的映射关系. 一个应用从服务端把需要展现的文字换成一段字节流传输给浏览器,浏览器把字节流组装字符展现的过程一般

(转)request和response的中文乱码问题

request乱码指的是:浏览器向服务器发送的请求参数中包含中文字符, 服务器获取到的请求参数的值是乱码; response乱码指的是:服务器向浏览器发送的数据包含中文字符,浏览器中显示的是乱码; 乱码产生的原因:不管是request乱码还是response乱码,其实都是由于客户端(浏览器)跟服务器端采用的编码 格式不一致造成的. 以request乱码为例:浏览器向服务器发送请求,因为浏览器与服务器之间的通信实质上是socket流,所以要先 将请求参数(字符)转换成字节,也就是编码过程,服务器接

css代码乱码怎么解决

乱码引起的CSS失效原理: 由于一个中文是两个字符组成,在编码不一致的情况下会引发字符的“重新”组合,(半个汉字的编码字符与后面的字符组合生成新的“文字”)引发原本的结束符合“变异”,从而导致找不到结束符号,使得后面的CSS就会失效. 解决方法一: CSS中出现的乱码都是由于CSS字符编码与页面的字符编码不一致所引起的,因此最直接的方法就是使字符编码一致.将CSS指定编码类型,例:@charset "utf-8";(指定编码类型为utf-8,须写在CSS文件第一行) 解决方法二: CS

史上最通俗,彻底搞懂字符乱码问题的本质

1.引言 IM等社交应用的开发工作中,乱码问题也很常见,比如: 1)IM聊天消息中的Emoji表情为什么发给后端后MySQL数据库里会乱码: 2)文件名中带有中文的大文件聊天消息发送后,对方看到的文名是乱码: 3)Http rest接口调用时,后端读取到APP端传过来的参数有中文乱码问题: ... ... 那么,对于乱码这个看似不起眼,但并不是一两话能讲清楚的问题,是很有必要从根源了解字符集和编码原理,知其然知其所以然显然是一个优秀码农的基本素养,所以,便有了本文,希望能帮助到你. 2.正文概述

Python cmd 中文显示乱码

方法一:# -*- coding:utf-8 -*- content = "我是中文" content_unicode = content.decode("utf-8") content_gbk = content_unicode.encode("gbk") print content_gbk 方法二: 解决非常简单 先引入import sys 再加一句:type=sys.getfilesystemencoding() 然后在输出乱码的数据的时候

Linux环境下MySQL数据库用SQL语句插入中文显示 “问号或者乱码 ” 问题解决!

问题: 在普通用户权限下执行 mysql -u root -p进入mysql数据库,中间步骤省略,插入数据:insert into 库名(属性)values('汉字'); 会出现如下提示:  Query OK, 1 row affected, 1 warning (0.00 sec)    表明出现错误,没有插入成功,然后执行select * from 表名   就会出现如下的问题:显示的表中出现乱码或者问号. 如图: 解决方案: 首先重新打开一个终端窗口(方便操作),进入root用户模式 执行

Activiti Linux部署流程图出现乱码

前段时间使用Activiti在本机以及window环境下测试发现流程图正常显示,在linux下汉字变成了小方块. 经网上查找资料: 发现自己的京东云未安装中文字体,由于本人系统activiti配置文件设置的"宋体",因此需在window系统中找到宋体字体复制到linux系统中进行安装. 1,进入C:\Windows\Fonts,找到"宋体 常规"文件simsun.ttc 2,进入cd /usr/java/jdk1.7.0_79/jre/lib/fonts,新建fal

centos6.7下安装mysql5.6.22同时解决中文乱码问题

1.下载 http://dev.mysql.com/downloads/mysql/ 或者使用wget下载: wget http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-5.6.22-1.el6.i686.rpm-bundle.tar 2.安装 2.1.  检测是否已经安装了mysql rpm -qa | grep mysql 如果已经安装了,将其卸载,如: rpm -e --nodeps  mysql-libs-5.1.71-1.el6.x8

页面与后台传递中文乱码问题(java乱码)

1.前台中文传递到后台乱码. 前台不须要处理, 系统一般都会默认把中文转化为ISO-8859-1类型. 仅仅需在后台接受数据是处理 Str为前台传过来的中文字符串: String inputer = new String( Str.getBytes("ISO-8859-1") , "GB2312"); 2.前台不仅包括中文.并且包括特殊字符,假设仅仅在后台转码,比較困难.採用前台转码,那么就採用后台解码的方式处理 var theid = encodeURI(enco

java web 程序乱码问题

1.问题:今日观别人代码,发现前端输入正确,保存后出现乱码.数据库中也为乱码. 输入: 输入完成后,列表页面乱码如下: 数据库乱码如下: 分析问题:??? 解决问题:???