文章目录

  • 1 字符编码
  • 2 为什么需要字符编码
  • 3 字节,字符,字符串
  • 4 进程间的字符信息流动
  • 5 Java 与 Unicode
  • 6 Python 与 Unicode

1 字符编码

1、ASCII & ANSI:

字符码(charcter code)指的是用来代表字符的编码。读者在输入和存储文档时都要使用字符编码。

ASCII 码(单字节): 能够支持256个字符编码.
ANSI(双字节): 能够支持65000个字符编码,中文简体编码 GB2312 实际上是 ANSI 的一个代码页,不同的代码页的内码无法再其他代码中正常显示,日中文/繁体中文/简体中文使用了不同的代码页,

2、Unicode:
Unicode 也是一种字符编码方法,它是由国际组织设计,能够容纳全世界全部语言文字的编码方案。其中 UTF-16 和 Unicode 编码大致一样, UTF-8 为了节省存储空间,以 8 位为单元对 Unicode 进行编码。

BOM (byte order mark) 出现在文本文件的头部,unicode 编码中用 BOM 来标识文件采用哪种格式的编码,UTF-8 的 BOM 编码是 EF BB BF

下面是使用 Binary Viewer 工具查看不同编码的文本文件,其内容为’hello world!你好!’:

utf-8

ansi

2 为什么需要字符编码

字符编码主要是为了实现字符信息(文本)在计算机系统中的存储与传输:

字符,不管是中文字符还是英文字符,在计算机系统中都是以字节的形式来存储的,比如保存了 hello world!你好! 的 txt 文件,指定文件为 utf-8 格式,那么在硬盘中存储的信息是 EF BB BF 68 65 6C 6C 6F 20 77 6F 72 6C 64 21 20 10 77 6F 72 6C 64 21。当我们用记事本(本质上是一个程序)打开 txt 文件,记事本会根据编码识别相应的字符,然后在记事本的内容区域显示字符对应的图形。

字符图形可以是矢量图,也可以是位图。

3 字节,字符,字符串

Unicode(统一码、万国码、单一码)是一套由国际组织制定的可以容纳世界上所有文字和符号的字符编码方案,可以理解为是一套规范,而不是具体的实现方案。UTF-8/UTF-16/UTF-32 是具体的将文本信息进行存储或传输的编码实现方案。

概念 层次 特征
字符/字符串 视图层/应用层 可读写,可理解,矢量图或位图显示
Unicode 逻辑层、语言层 统一性,一致性
utf-8,utf-16,gbk 物理层:内存,磁盘,网络 面向存储

特别需要注意的是 Unicode 是逻辑意义上的编码,每个字符都有自己的 Unicode 码,在程序中可以通过 \u4f60 的形式来表示,与字节流无关!!!而 utf-8 才是 Unicode 在物理层的一种编码方案,对应特定的字节流。

4 进程间的字符信息流动

字符信息是如何通过键盘输入到计算机中,进而保存到磁盘上的呢?

首先,打开 cmd,然后输入 echo 你aa >> a.txt

由上图所示,当输入字符串 你aa 时,输入法程序会根据当前的本地字符集进行编码,然后作为输出给 CMD 程序,字节流为 C4 E3 61 61,然后 cmd 将字节流输出到磁盘文件 a.txt 中,通过 binary viewer 可以查看对应的编码为 C4 E3 61 61

通过 chcp [code_page] 可以修改本地字符集,以下是几种常用的编码:
936 GBK(一般情况下为默认编码)
437 美国英语
65001 utf-8

执行 chcp 65001 将字符集更改为 utf-8,在标题栏点击右键, 打开属性面板, 会看到”选项”标签页下方显示”当前代码页”的编码. 然后选择”字体”标签页, 把字体设置为Lucia Console。

执行 echo 你aa >> b.txt,通过binary viewer 查看文件编码为 E4 BD A0 61 61

可以通过 ultra edit 将 gbk 文件转存为 utf-8 文件。

常见 ASCII 码:
OD OA = \r\n
20 = 空格

另外一个特别需要注意的地方:
windows 平台的 utf-8 文件总是会添加 bom 头,造成在其他编辑器中显示为乱码,比如 vs code。

5 Java 与 Unicode

char 是 Java 的基本类型(原类型) ,默认字符集为 utf-8。多个字符的序列可以是字符数组(mutable),也可以字符串(immutable)。

char 与 byte 是不同的,byte 是数据存储的基本单元,任何数据信息,比如对象,图片,程序,最终都是以 byte 的形式来存储(分为大端、小端)的。char 是字符,同一字符的不同字符编码对应的 byte 流是不一样的。

在 Java 中使用 InputStream/OutputStream 来读写字节(byte)流,使用 Reader/Writer 来读写字符(char)流。

byte char
DataInputStream/DataOutputStream FileReader/FileWriter
ObjectInputStream/ObjectInputStream StringReader/StringWriter
FileInputStream/FileOutputStream
class HelloChar{public static void main(String[] args) {String s = String.valueOf(new char[]{'你', '好'});System.out.println(s);  // 你好char c = '你';char ni = '\u4f60';     // 你char hao = (char)0x597d; // 好System.out.println(c);    // 你byte[] b = s.getBytes();bytes2HexString(b); // E4BDA0E5A5BD}public static void bytes2HexString(byte[] b) {   String ret = "";   for (int i = 0; i < b.length; i++) {   String hex = Integer.toHexString(b[ i ] & 0xFF);   if (hex.length() == 1) {   hex = '0' + hex;   }   ret += hex.toUpperCase();   }  System.out.print(ret);}
}

文本文件 b.txt 内容为 \u4f60\u597d:

通过 Java 代码将 Unicode 与字符串进行转换:

public class unicode {public static void main(String[] args) {BufferedReader br = new BufferedReader(new FileReader(new File("b.txt")));String unicodeStr = br.readLine(); // "\\u4f60\\u597d"String str = unicodeToString(unicodeStr); // "你好"String unicode = stringToUnicode(str); // "\\u4f60\\u597d"}//字符串转换unicodepublic static String stringToUnicode(String string) {StringBuffer unicode = new StringBuffer();for (int i = 0; i < string.length(); i++) {char c = string.charAt(i);  // 取出每一个字符unicode.append("\\u" +Integer.toHexString(c));// 转换为unicode}return unicode.toString();}//unicode 转字符串public static String unicodeToString(String unicode) {StringBuffer string = new StringBuffer();String[] hex = unicode.split("\\\\u");for (int i = 1; i < hex.length; i++) {int data = Integer.parseInt(hex[i], 16);// 转换出每一个代码点string.append((char) data);// 追加成string}return string.toString();}
}

6 Python 与 Unicode

Python 没有 char 类型,一个字符等同于长度为 1 的字符串,字符串与字节流的转换形式更简洁:

s = "hello world!你好!"                 # 默认为 utf-8
ni = '\u4f60'                        # '你' 的 unicode
ni2 = chr(0x4f60)                  # '你' 的 unicode 码十六进制整数转字符# 方法 1
bytes(ni, encoding='utf-8')          # \xe4\xbd\xa0
u = bytes(s, encoding='utf-8')  # b'hello world!\xe4\xbd\xa0\xe5\xa5\xbd!'
g = bytes(s, encoding='gb2312')     # b'hello world!\xc4\xe3\xba\xc3!'
# 方法 2
u2 = s.encode('utf-8')
g2 = s.encode('gb2312')str(u, encoding='utf-8')           # "hello world!你好!"
str(g, encoding='gb2312')            # "hello world!你好!"

深入理解——字节、字符/字符串、Unicode 字符集相关推荐

  1. 使用 _tprintf 宏兼容多字节字符集和Unicode字符集

    我们知道在windows平台上写C程序要考虑字符编码问题,为了兼容多字节字符集和Unicode,涉及字符,字符串操作,都要用TEXT宏围起来. 如果要使用printf,但是不确定字符集,可以使用 _t ...

  2. java字符集与字符编码 Unicode字符集

    字符集与字符编码是两个不同的概念. 字符集,顾名思义就是字符的集合,比如ASCII字符集包含了a-z A-Z 0-9 半角标点符号和特殊控制符号在内的128个符号.对于一个字符集来说,要正确编码转码一 ...

  3. C++ 中ACSII字符集和Unicode字符集转换

    #include "stdio.h" #include "iostream" #include "string" #include &quo ...

  4. 字节 字符 utf-8 unicode 以及提交表单验证字符长度 .......

    通常我们所说的字其实准确的说是指字符, 字符是指计算机中使用的字母.数字.字和符号,包括:1.2.3.A.B.C.~!·#¥%---*()--+等等.不同的编码格式下汉字的字节是不同的,比如GBK中是 ...

  5. 详解Unicode字符集以及字符编码实现(一)

    在日常生活中,我们经常会碰到打开一个文件,但是文件内容乱码的问题,比如我想看<西游记>这部小说. 下载链接:https://m.ijjjxs.com/txt/dl-35-12585.htm ...

  6. 【字符编码详解】ASCII、GB2312、GBK、UTF-8、UTF-16编码与Unicode字符集

    目录 前言 一.什么是编码,数据类型和编码有什么关系? 二.英文字符编码 ASCII编码 三.中文编码 1. GB2312标准 2. GBK编码 3. 其他中文编码 四.Unicode字符集 1. U ...

  7. 《windows核心编程系列》二谈谈ANSI和Unicode字符集

    第二章:字符和字符串处理 使用vc编程时项目-->属性-->常规栏下我们可以设置项目字符集合,它可以是ANSI(多字节)字符集,也可以是unicode字符集.一般情况下说Unicode都是 ...

  8. 字符编码和字符集基础知识

    作者:  崔启亮  | 2005年07月05日13时20分 [内容提要]中文文字数目大,而且还分为简体中文和繁体中文两种不同书写规则的文字,而计算机最初是按英语单字节字符设计的,因此,对中文字符进行编 ...

  9. unicode字符集特殊符号对应html/js/css符号

    原文来源:http://www.cnblogs.com/change-oneself/p/5329837.html 作者 孤独大兔子 使用方法: 这些字符属于unicode字符集,所以,你的文档需要声 ...

最新文章

  1. 前景检测算法_3(GMM)
  2. python下载文件暂停恢复_python下载文件记录黑名单的实现代码
  3. 访问备份数据寄存器时,需要打开BKP时钟吗?
  4. 使用线程池有以下几个目的
  5. 前端学习(2968):实现路由跳转的两种方式
  6. This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its 错误解决办法
  7. one-hot encoding 并非分类变量编码的唯一选择
  8. 深入浅出 NXLog (一)
  9. Python超市商品管理系统
  10. (新)OpenCV配置visual studio2019详细教程
  11. linux 中eth,执行命令取出linux中eth0的IP地址
  12. 移植tas5707功放芯片驱动注意事项
  13. 酷派5890详细获取ROOT、以及刷机教程
  14. 述职答辩提问环节一般可以问些什么_述职被高频问到的15问
  15. 手机usb计算机无法连接,手机usb连不上电脑怎么办实际解决
  16. Anomalies,Factors,andMultiFactorModels
  17. macos 系统固件 路径_iTunes下载的固件在哪里?iTunes固件文件路径详解
  18. MySQL系列教程(四)
  19. 流程图设计(html+css+js)
  20. 黄河中下游地区精化似大地水准面研究与实施

热门文章

  1. ACL 通配符掩码 匹配的范围计算及理解
  2. 爬虫学习(16):selenium自动化测试:人为模拟滑块移动
  3. 项目管理工程师岗位职责
  4. PHP验证身份证格式
  5. Android Camera2 之 CameraDevice 详解
  6. 程序员练级攻略(2018) --左耳朵耗子
  7. tyjl一2型计算机联锁引言,TYJL-II型计算机联锁.ppt
  8. 输入一个整数x,判断其能否被3整除也被7整除。
  9. VC,CString,UTF8与GBK互转
  10. Day 2---vue2 从0开始 写一个前端框架