字符编码--笔记

本文深入探讨了原码、反码、补码的概念及计算方法,并解释了不同类型的校验码及其工作原理。此外,还详细介绍了字节序、bit序、有效位等概念,以及Unicode与UTF-8编码的具体应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、原码、反码、补码

  • 补码:
    1. CPU的减法,通过加法器和补码实现
    2. 溢出(循环):256-1 与 -1 二进制一样。
  • 负数补码计算方法:数值位(符号位外的后7位),取反+1 //不”+1”的话,减法不能成功地变为加法

    1. -128 1000,0000 //-128是人为规定的,从-127而来,也是”+1”的原因之一
    2. -127 1000,0001
    3. -1 1111,1111
    4. 0 0000,0000 //-1 + 1 = 1,0000,0000就会溢出了,因为-1 与 256-1 效果一样
    5. 1 0000,0001
    6. 127 0111,1111
  • byte -255[-1, 1]

    1. 原码10000000,1111111//数值位取反–>
    2. 反码11111111,0000000–>+1
    3. 补码1111’1111,0000001
  • int -255[-1, -1, -1, 1]
    1. 原码1000’0000,0000’0000,0000’0000,1111111–>数值位取反
    2. 反码1111’1111,1111’1111,1111’1111,0000000–>+1
    3. 补码1111’1111,1111’1111,1111’1111,0000001

二、二进制校验码

  • 奇偶校验码-奇校验码 和 偶校验码 的统称.
原编码奇校验偶校验
00000000 10000 0
00100010 00010 1
  • 海明校验码-多重奇偶校验检错码

    1. 可以检测任何位出错,并能纠正1位错误
    2. 必须满足:pow(2,k)-1 >= n+k //pow(2,k) (代表2的k次方)
  • CRC即 循环冗余校验码–广泛应用于数据通信领域和磁介质存储系统中.

三、字节序、bit序、有效位

字节序: 一个数据单元(多字节)的字节顺序。不必考虑byte内部bit的细节。
  • 大,小:权值大,权值小
  • 端:开端,左边是开端,左边是低地址,人的思维从左到右,
  • Big-Endian
    1. 人的习惯。
    2. 权值最大(高)的字节(MSB)放在低地址(端)。
    3. 符号位的判定固定为第一个字节,容易判断正负。
    4. 实例:java,TCP。
  • Little-Endian
    1. 计算机的习惯。
    2. 权值最小的字节(MSB)放在低地址(端)。
    3. 强制转换数据不需要调整字节内容,1、2、4字节的存储方式一样。
    4. 实例:win7
bit序:一个字节内,bit的顺序。大都是大端序,左大右小,比如TCP中6bits的标志位:
  • URG=2^5=32=0x20
  • ACK=2^4=16=0x10
  • PSH=2^3=8=0x08
  • RST=2^2=4=0x04
  • SYN=2^1=2=0x02
  • FIN=2^0=1=0x01
有效位
  • 最低有效位(lsb,least significant bit):
    1. lsb指一个二进制数字中的第0位(即最低位,最低权重位,权值为2^0)
    2. LSB(the Least Significant Byte),多字节序列中具有最大权重的字节。
  • 最高有效位(msb,Most Significant Byte)
    1. lsb的反面。
    2. LSB的反面

Unicode & UTF-8

  • Unicode (uniqueness code) 唯一码。是个字符集,是内存中的值
  • UTF-8,以字节为单位对Unicode进行编码。
    1. “汉”的Unicode编码是0x6C49, 在0x0800-0xFFFF之间,使用3字节模板了:1110xxxx 10xxxxxx 10xxxxxx
    2. 0x6C49对应的二进制:0110 1100 0100 1001, 依次代替3字模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。
Unicode编码(十六进制)UTF-8 字节流(二进制)
000000-00007F0xxxxxxx //兼容ASCII的前127位
000080-0007FF110xxxxx 10xxxxxx //”110”表明:占用2个字节
000800-00FFFF1110xxxx 10xxxxxx 10xxxxxx
010000-10FFFF11110xxx10xxxxxx10xxxxxx10xxxxxx
  • UTF-16, 以16位无符号整数为单位。略
  • UTF-32, 以32位无符号整数为单位。略
<think>我们正在讨论字符编码的相关问题。用户之前询问过《UnicodeExplained》中文版电子书下载,现在转向字符编码笔记和资料的需求。根据用户的引用内容,我们可以知道用户已经阅读了一些关于字符编码笔记(如引用[2][3][4]),特别是涉及ASCII、Unicode和UTF-8的内容。因此,我们需要整理一份关于字符编码的清晰笔记,涵盖基本概念、常见字符集和编码方式,重点放在Unicode及其编码(如UTF-8、UTF-16)上。回答要求:1.所有行内数学表达式用$...$,独立公式用$$...$$。2.使用中文回答。3.生成相关问题。4.引用的内容自然添加引用标识,如[^1](注意:我们的引用已经给出,但引用编号需要对应到我们回答中引用的部分,由于用户提供了4个引用,我们可以直接使用这些引用编号,但需注意引用内容实际上来自用户提供的参考,我们只是参考这些内容来编写答案)注意:用户提供的引用内容:[^1]:MySQL字符集和字符集编码的定义及区别[^2]:字符编码笔记:ASCII,Unicode和UTF-8(重点介绍Unicode的码点和UTF-8的编码规则)[^3]:零散专题21字符编码笔记(重点介绍UTF-16)[^4]:同一篇字符编码笔记,还提到了一个必读文章我们将根据这些引用内容来组织答案。目标结构:1.基本概念:字符集与字符编码的区别2.常见的字符集和编码:ASCII、ISO-8859-1、GB2312、GBK等3.Unicode字符集:概念、码点范围4.Unicode的编码方式:UTF-8、UTF-16、UTF-32(重点介绍UTF-8和UTF-16)5.在编程中需要注意的问题(如BOM、字节顺序)由于要求生成相关问题,在最后提出3个相关问题。注意:在回答中,我们会引用用户提供的参考,因此需要标注引用来源,例如在谈到字符集和编码区别时引用[^1],在谈到UTF-8规则时引用[^2]等。</think> ### 字符编码核心笔记与解析 #### 一、基本概念区分 1. **字符集**:符号的抽象集合(如字母、数字、汉字),定义字符范围但不涉及存储形式 - 例:ASCII(128字符)、Unicode(111万+字符)[^2] 2. **字符编码**:字符映射为二进制数据的规则 - 例:UTF-8(1-4字节)、UTF-16(2或4字节)[^1][^3] #### 二、核心编码方案对比 | 编码方案 | 最小单位 | 码点范围 | 汉字存储 | 特点 | |---------|---------|----------|---------|------| | **ASCII** | 1字节 | U+0000~U+007F | × | 仅基础拉丁字符 | | **UTF-8** | 1-4字节 | U+0000~U+10FFFF | 3字节 | 兼容ASCII,网络首选[^2] | | **UTF-16** | 2/4字节 | U+0000~U+10FFFF | 2或4字节 | 含BOM头,平面区分[^3] | #### 三、Unicode编码原理 1. **码点计算** - Unicode将字符映射到 $0$ 到 $0x10FFFF$ 整数空间 - 最大码点二进制计算: $$0x10FFFF_{16} = 100001111111111111111_2$$(21位长度) 2. **变长编码必要性** - 单字节:$00000000_2$~$01111111_2$(ASCII字符) - 双字节:$110xxxxx_2$~$11011111_2$(常用汉字) - 三/四字节存放高位字符(如生僻字、emoji)[^2] 3. **BOM(字节顺序标记)** - UTF-16开头插入 `0xFEFF` 标志字节序 - 示例:文件头 `FF FE` 表示小端序 #### 四、实战注意要点 1. **乱码根源**:解码/编码方案不匹配(如UTF-8文本用GBK解码) 2. **编程建议**: ```python # Python 正确解码示例 with open('file.txt', 'r', encoding='utf-8') as f: content = f.read() ``` 3. **数据库配置**:`NLS_CHARACTERSET`(普通列)与 `NLS_NCHAR_CHARACTERSET`(NVARCHAR2列)需统一[^1] ```mermaid graph LR A[字符输入] --> B{编码选择} B -->|英文字符| C[UTF-8单字节] B -->|常用汉字| D[UTF-8三字节] B -->|特殊符号| E[UTF-16四字节] C --> F[二进制存储] D --> F E --> F ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值