Unicode

发布时间 2023-12-06 20:23:34作者: aster_ist

Unicode

好久没更新博客了,拿以前整理的笔记来水一下下(

  • 定义以及解释(直接看这里就好)Unicode是ASCII字符编码的一个扩展。只不过在Windows中,用两个字节对其进行编码,也称为宽字符集(Widechars)。(Unicode 是一种标准,用于给世界上几乎所有的字符分配一个唯一的数字码点。这包括了各种语言、符号、表情等。)Unicode是一种双字节编码机制的字符集,使用0~65535之间的双字节无符号整数对每个字符进行编码。在Unicode中,所有的字符都是16位(也就是16进制),包括所有的7位ASCII码都被扩充为16位(注意,高位扩充的是零)。如

    字符串“pediy”,它的ASCII码是:

    70h 65h 64h 69h 79h

    其Unicode码的十六进制是:

    0070h 0065h 0064h 0069h 0079h

    Intel处理器在内存中,一个字存入存储器要占有相继的两个字节,这个字存放时就按Little-Endian方式存入,即低位字节存入低地址,高位字节存入高地址,如图1.2所示

    Untitled.png

    Unicode 字符串的特点:

    1. 字符集: Unicode 字符串支持几乎所有的语言和符号。这样,一个字符串中可以包含来自不同语言的字符。

    2. 编码方式: Unicode 字符串有多种编码方式,常见的有 UTF-8、UTF-16、UTF-32 等。这些编码方式定义了如何将 Unicode 码点映射到字节序列。其中,UTF-8 是最为常见的一种。

    3. 表示方法: 在许多编程语言中,Unicode 字符串可以直接使用转义序列表示,例如 \\uXXXX,其中 XXXX 是 Unicode 码点的十六进制表示。在 Python 中,可以使用如下方式:

      unicode_char = '\u4e00'  # 这里的 '4e00' 是汉字 "一" 的 Unicode 码点
      print(unicode_char)
      

      在其他语言中,也有类似的语法,但可能略有不同。

    4. 可扩展性: Unicode 不断扩展,以支持新的字符和符号。新的版本会引入新的码点,这使得 Unicode 具有较强的可扩展性。

    5. 字符范围: Unicode 能够表示非常广泛的字符范围,包括各种文字、符号、表情符号等。

    在处理多语言文本或涉及到复杂字符集的应用中,使用 Unicode 字符串是非常常见的做法。 Unicode 的引入解决了 ASCII 编码无法涵盖全球字符的问题。

  • 应用

    ord() 函数用于获取字符的 Unicode 码点

    unicode_char = '\u4e00'  # 这里的 '4e00' 是汉字 "一" 的 Unicode 码点
    print(unicode_char)
    #输出是“一”
    unicode_char = '\x70'  
    print(unicode_char)
    #输出是‘p’
    

    \u和\U

    在 Python 中,\u 是 Unicode 转义序列的一部分,用于表示 16 位 Unicode 字符。\u 后面紧跟着四个十六进制数字,表示 Unicode 字符的码点。例如,\u4E00 表示汉字"一"的 Unicode 码点。

    这种表示方法通常用于表示 BMP(基本多文种平面)内的 Unicode 字符。如果要表示超出 BMP 范围的字符,可以使用 \U 转义序列,后面跟着八个十六进制数字。

    示例:

    print('\u4E00')  # 输出:一
    print('\u03A3')  # 输出:Σ
    print('\U0001F602')  # 输出:?
    
    

    在字符串中使用 \u\U 可以方便地表示 Unicode 字符,而不需要直接输入字符本身。

    \x

    在 Python 中,\x 是用于表示十六进制数字的转义序列的一部分。在字符串中,x 后面可以跟随一个或两个十六进制数字,用于表示一个字节的数值。这通常用于表示 ASCII 字符,其中每个字符都可以用一个字节表示。

    示例:

    print('\x41')  # 输出:A,表示 ASCII 码点为 0x41 的字符
    print('\x48\x65\x6C\x6C\x6F')  # 输出:Hello,表示字符串 "Hello"
    
    

    这里的 \x 转义序列允许你直接插入十六进制表示的字节值,方便在字符串中表示特定的字符或字节序列。


这里就是比较复杂的一些解释啦,如果只是想运用的话就不用往下看了,我在了解unicode到底是啥的时候就顺带了解深挖一下

  • 历史,以及acsii和unicode的关联

    在最初的时候,Internet 上只有一种字符集—— ANSI 的 ASCII 字符集,它使用 7 bits 来表示一个字符,总共表示 128 个字符,其中包括了 英文字母、数字、标点符号等常用字符。 之后,又进行扩展,使用 8 bits 表示一个字符,可以表示 256 个字符,主要在原来的 7 bits 字符集的基础上加入了一些特殊符号。 后来,由于各国语言的加入,ASCII 已经不能满足信息交流的需要,为了能够表示其它国家的文字,各国在 ASCII 的基础上制定了自己的字符集,这些从 ANSI 标准派生的字符集被习惯的统称为 ANSI 字符集,它们正式的名称应该是 MBCS(Multi-Byte Chactacter System,即多字节字符系统)。 这些派生字符集的特点是以 ASCII 127 bits 为基础,兼容 ASCII 127,他们使用大于 128 的编码作为一个 Leading Byte,紧跟在 Leading Byte 后的第二(甚至第三)个字符与 Leading Byte一起作为实际的编码。 这样的字符集有很多,我们常见的 GB-2312 就是其中之一。

    不同 ANSI 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段 ANSI 编码的文本中。一个很大的缺点是:同一个编码值,在不同的编码体系里代表着不同的字,这样就容易造成混乱,导致了 Unicode 码 的诞生。 为了统一所有文字的编码,Unicode 应运而生。Unicode 把所有语言都统一到一套编码里,这样就不会再有乱码问题了。

  • acsii和unicode的区别

    Unicode 和 ASCII 都是字符编码标准,但有一些关键区别:

    1. 编码范围:
      • ASCII(美国信息交换标准代码): 最早只定义了128个字符,用于表示基本的英文字符、数字和一些控制字符。
      • Unicode: 是一个更大的字符集,旨在包含世界上几乎所有的书写系统的字符,以及许多其他符号和特殊字符。Unicode 目前包含超过130,000个字符。
    2. 表示方式:
      • ASCII: 每个字符用一个字节(8位)表示。
      • Unicode: 最初采用了两个字节(16位)的表示方式,但随后由于字符数量的增加,也引入了更多占用空间更大的表示方式,如UTF-8(变长编码)和UTF-16。
    3. 应用范围:
      • ASCII: 主要用于英文字符,不支持其他语言的字符。
      • Unicode: 旨在支持全球范围的字符,适用于多语言文本。
    4. 兼容性:
      • ASCII: 是 Unicode 的一个子集,ASCII 字符的编码与 Unicode 编码相同。
      • Unicode: 包含了 ASCII 字符,并为其他字符提供了更多的编码空间。

    总体而言,Unicode 是一个更为全面和通用的字符编码标准,允许表示世界上所有语言的字符。ASCII 主要是用于英文,是 Unicode 的一个子集。Unicode 的引入解决了多语言环境中字符编码的问题。

  • unicode编码点

    Unicode 编码点分为 17 个平面(plane),每个平面包含 2^16(即65536)个码位(Code Point)。 17 个平面的码位可表示为从 U+xx0000 到 U+xxFFFF,其中 xx 表示十六进制值从 00 到 10 ,共计 17 个平面。

    17 * 65536 = 1114112,所以 Unicode 能表示 1114112 个不同的字符,每个字符都有对应的唯一数字。

    • 关于平面

      Unicode 编码点是 Unicode 字符集中每个字符的唯一标识。这些编码点通常表示为 U+ 后跟一个十六进制数,例如 U+0041 表示拉丁字母 "A"。

      Unicode 编码点按照其值的范围被分为不同的平面。每个平面包含 2^16(65536)个码位。一共有 17 个平面,从 U+0000 到 U+10FFFF。

      Unicode 平面分布如下:

      1. 基本多文种平面(BMP,Plane 0): U+0000 到 U+FFFF
      2. 辅助平面 1(SMP,Plane 1): U+10000 到 U+1FFFF
      3. 辅助平面 2(SIP,Plane 2): U+20000 到 U+2FFFF

      1. 辅助平面 9(SIP,Plane 9): U+90000 到 U+9FFFF
      2. 辅助平面 10(SIP,Plane 10): U+A0000 到 U+AFFFF
      3. 辅助平面 11(SIP,Plane 11): U+B0000 到 U+BFFFF

      1. 辅助平面 15(SIP,Plane 15): U+F0000 到 U+FFFFF
      2. 辅助平面 16(SIP,Plane 16): U+100000 到 U+10FFFF

      每个平面都有其独特的 Unicode 码位范围,而不同平面用于存储不同类型的字符,包括一些历史上不太常用的字符、用于特殊目的的字符等。基本多文种平面(BMP)是最常用的,包含大多数常用字符。

  • 编码单元

    编码规则中还有另外一个重要的概念,编码单元(Code Unit),指编码一个字符需要的最少字节数, 比如 UTF-8 需要最少一个字节,UTF-16 最少两个字节,UCS-2 两个字节,UCS-4 和 UTF-32 四个字节。 UTF-8 和 UTF-16 是变长编码,UCS-2、UCS-4 和 UTF-32 是定长编码。

    编码单元是计算机中用于表示字符的最小的存储单元。对于许多字符集和编码方案,一个编码单元通常是一个字节(8位),但也有一些编码方案使用多个字节来表示一个字符,这时一个编码单元可以由两个或更多字节组成。

    在 Unicode 中,常用的编码单元是 16 位,即两个字节,被称为代码单元。这是因为 Unicode 的基本多文种平面(BMP)中的字符范围是 U+0000 到 U+FFFF,可以用一个 16 位编码单元表示。然而,Unicode 还定义了一些辅助平面,这些字符的编码需要由两个 16 位编码单元组成,这被称为代理对。

    总之,编码单元是用于表示字符的最小存储单元,具体的位数取决于字符集和编码方案。 Unicode 中的常见编码单元是 16 位。

    详解如下

    https://www.cnblogs.com/B307-NCAI/p/15796169.html

  • 再多的细节就不深究了,见下面的网站吧

    https://www.toolhelper.cn/Encoding/Unicode

  • unicode和UTF的区别

    Unicode(统一码)和 UTF(Unicode Transformation Format)是两个不同的概念:

    1. Unicode:
      • Unicode 是一个字符集,它定义了每个字符的唯一编号,称为码点(code point)。这个编号是用十六进制表示的,例如 U+0041 表示字符 'A'。
      • Unicode 提供了一个标准,让不同的系统和应用程序使用相同的编号来表示相同的字符,从而实现字符的统一。
    2. UTF:
      • UTF 是一种字符编码方案,它定义了如何将 Unicode 中的码点编码为字节序列以及如何从字节序列解码回码点。
      • UTF-8、UTF-16、和 UTF-32 是最常见的 UTF 编码方案。
      • UTF-8:使用 1 到 4 个字节来表示一个字符,是一种变长编码。
      • UTF-16:使用 2 或 4 个字节来表示一个字符,同样是一种变长编码。
      • UTF-32:使用 4 个字节来表示一个字符,是一种定长编码。

    所以,Unicode 是一个字符集,而 UTF 是一种编码方式,用于在计算机系统中存储和传输 Unicode 字符。 UTF 编码方案将 Unicode 码点转换成实际的字节序列,以便在计算机中进行处理。 Unicode 提供了字符的标准,而 UTF 提供了一种在计算机中处理这些字符的方法。

  • Unicode 误区

    • Unicode 只不过是 16 比特编码。一些人误认为 Unicode 只不过是 16 比特编码,每个字符占用 16 比特,因此一共有 65,536 个可能的字符。实际上这是不正确的。这样是关于 Unicode 的最大误解,所以也难怪一些人会这么想。
    • 任何未分配的代码点都可以用于内部用途?错。最终,那些未分配的地方都会被某个字符使用。你应该使用私有用途代码点,或非字符代码点。
    • 每个 Unicode 代码点都表示一个字符?错。有许多非字符代码点(FFFE,FFFF,1FFFE,……),还有许多代理代码点、私有代码点和未分配的代码点,还有控制和格式字符(RLM,ZWNJ,……)
    • 字符映射是一对一的?错。映射关系也可能是:
      • 一对多:(ß → SS )
      • 上下文相关:(…Σ ↔ …ς 和 …ΣΤ… ↔ …στ… )
      • 语言相关:( I ↔ ı 和 İ ↔ i )