字符的编码方式

ASCII 码

学过计算机的人都知道 ASCII 码,总共有 128 个,用一个字节的低 7 位表示,0~31 是控制字符如换行回车删除等;32~126 是打印字符,可以通过键盘输入并且能够显示出来。

ISO-8859-1

128 个字符显然是不够用的,于是 ISO 组织在 ASCII 码基础上又制定了一些列标准用来扩展 ASCII 编码,它们是 ISO-8859-1~ISO-8859-15,其中 ISO-8859-1 涵盖了大多数西欧语言字符,所有应用的最广泛。ISO-8859-1 仍然是单字节编码,它总共能表示 256 个字符。

GB2312

它的全称是《信息交换用汉字编码字符集 基本集》,它是双字节编码,总的编码范围是 A1-F7,其中从 A1-A9 是符号区,总共包含 682 个符号,从 B0-F7 是汉字区,包含 6763 个汉字。

GBK

全称叫《汉字内码扩展规范》,是国家技术监督局为 windows95 所制定的新的汉字内码规范,它的出现是为了扩展 GB2312,加入更多的汉字,它的编码范围是 8140~FEFE(去掉 XX7F)总共有 23940 个码位,它能表示 21003 个汉字,它的编码是和 GB2312 兼容的,也就是说用 GB2312 编码的汉字可以用 GBK 来解码,并且不会有乱码。

GB18030

全称是《信息交换用汉字编码字符集》,是我国的强制标准,它可能是单字节、双字节或者四字节编码,它的编码与 GB2312 编码兼容,这个虽然是国家标准,但是实际应用系统中使用的并不广泛。

UTF-16

说到 UTF 必须要提到 Unicode(Universal Code 统一码),ISO 试图想创建一个全新的超语言字典,世界上所有的语言都可以通过这本字典来相互翻译。可想而知这个字典是多么的复杂,关于 Unicode 的详细规范可以参考相应文档。Unicode 是 Java 和 XML 的基础,下面详细介绍 Unicode 在计算机中的存储形式。
UTF-16 具体定义了 Unicode 字符在计算机中存取方法。UTF-16 用两个字节来表示 Unicode 转化格式,这个是定长的表示方法,不论什么字符都可以用两个字节表示,两个字节是 16 个 bit,所以叫 UTF-16。UTF-16 表示字符非常方便,每两个字节表示一个字符,这个在字符串操作时就大大简化了操作,这也是 Java 以 UTF-16 作为内存的字符存储格式的一个很重要的原因。

UTF-8

UTF-16 统一采用两个字节表示一个字符,虽然在表示上非常简单方便,但是也有其缺点,有很大一部分字符用一个字节就可以表示的现在要两个字节表示,存储空间放大了一倍,在现在的网络带宽还非常有限的今天,这样会增大网络传输的流量,而且也没必要。而 UTF-8 采用了一种变长技术,每个编码区域有不同的字码长度。不同类型的字符可以是由 1~6 个字节组成。
UTF-8 有以下编码规则:
如果一个字节,最高位(第 8 位)为 0,表示这是一个 ASCII 字符(00 - 7F)。可见,所有 ASCII 编码已经是 UTF-8 了。
如果一个字节,以 11 开头,连续的 1 的个数暗示这个字符的字节数,例如:110xxxxx 代表它是双字节 UTF-8 字符的首字节。
如果一个字节,以 10 开始,表示它不是首字节,需要向前查找才能得到当前字符的首字节。

在这里插入图片描述

参考: 深入分析 Java 中的中文编码问题

### 回答1: 在不同的环境下,即使使用相同的哈希函数和字符编码方式,也有可能会计算出不同的哈希值。这可能是由于两个环境使用的是不同版本的 Python 解释器,这两个解释器可能会使用不同的哈希算法实现。此外,还有可能是因为系统的体系结构不同而导致了计算哈希值的细微差异。 ### 回答2: 在不同环境下的Python,对同一个字符串使用相同的哈希函数和字符编码方式,计算出不同的哈希值可能是因为以下几个原因: 1. 哈希函数的实现不同:不同的Python环境可能使用不同的哈希函数实现,这些实现可能采用不同的算法或参数,导致相同的输入得到不同的输出。 2. 字符编码的不一致:字符串在计算哈希值之前需要被编码成字节序列。不同的Python环境可能采用不同的字符编码方式,比如在Python 2中默认使用ASCII编码,而在Python 3中默认使用Unicode编码。不同的编码方式可能会将相同的字符映射成不同的字节序列,进而影响到哈希值的计算结果。 3. 环境依赖的因素:Python的哈希函数实现可能依赖于一些环境因素,比如操作系统、硬件架构等。不同的环境因素可能会影响到哈希函数的行为,造成计算相同字符串的哈希值时的不一致性。 因此,为了保证在不同环境下计算出相同的哈希值,可以采取以下措施: 1. 显式指定哈希函数:可以使用标准库中提供的特定哈希函数,如MD5或SHA-256等,以确保不同环境下的一致性。 2. 统一字符编码方式:在处理字符串之前,将其统一编码成同一种字符编码方式,如UTF-8。这样可以避免因编码方式不一致而导致的哈希值不同。 3. 确保环境一致性:在不同环境下进行字符串哈希计算时,尽量保持环境的一致性,比如操作系统、Python版本等。这样可以减小环境因素对哈希值计算的影响。 综上所述,不同环境下的Python计算相同字符串的哈希值可能会产生不同结果,这涉及到哈希函数实现、字符编码方式和环境因素等多个方面。为了确保一致性,可以采取相应措施来规避这些问题。 ### 回答3: 在不同的环境中,对同一个字符串使用相同的哈希函数和字符编码方式计算出不同的哈希值,可能由以下几个原因造成: 1. 字符编码方式不一致:不同的环境可能使用不同的字符编码方式。比如,在一个环境中使用UTF-8编码方式,而在另一个环境中使用ASCII编码方式,这样相同的字符串在不同环境中编码后的二进制表示就会不同,进而导致计算出的哈希值不同。 2. 哈希函数实现差异:尽管使用相同的哈希函数,但在不同的环境中也有可能有差异的实现。哈希函数的实现可以基于操作系统、编程语言版本等因素,各种差异都可能导致相同字符串计算出不同的哈希值。 3. 原始数据的差异:相同的字符串在不同环境中可能对应不同的原始数据。原始数据包括字符串的字节表示以及额外的元数据等信息。如果原始数据不同,即使使用相同的哈希函数和字符编码方式,在计算哈希值时也会得到不同的结果。 因此,对于同一个字符串在不同环境中计算出不同的哈希值,需要考虑字符编码方式的差异、哈希函数实现的差异以及原始数据的差异等因素。如果想要在不同环境中得到一致的哈希值,需要确保使用相同的字符编码方式,并且在不同环境中使用相同的哈希函数实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值