笔记_gbk编码互转

  • gbk编码转字符
//测试数据
String encoded = "72746D703A2F2F3131312E3139382E32342E33333A33382F4C312F686F6D6500"; //31

//字符转成字节接受,数据必须为偶数,否则丢失数据
int dataSize = encoded.length()/2;
		byte[] bs = new byte[dataSize];
		for (int i = 0; i < bs.length; i++) {
			bs[i] = (byte) Integer.parseInt(encoded.substring(2*i, 2*i+2), 16);
		}
          String chinese = new String(bs, "GBK");
		
		//输出结果:中文:rtmp://111.198.24.33:38/L1/home
			System.out.println("中文:" + chinese);  
  • 字符转gbk编码
public static String encodeCN(String data) {
		byte[] bytes;
		try {
			bytes = data.getBytes("gbk");
			StringBuilder sb = new StringBuilder(bytes.length * 2);
 
			for (int i = 0; i < bytes.length; i++) {
				sb.append(hexString.charAt((bytes[i] & 0xf0) >> 4));
				sb.append(hexString.charAt((bytes[i] & 0x0f) >> 0));
			}
			return sb.toString();
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return "";
	}

//输出结果:72746D703A2F2F3131312E3139382E32342E33333A33382F4C312F686F6D65
System.out.println(encodeCN("rtmp://111.198.24.33:38/L1/home"));
<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、付费专栏及课程。

余额充值