Bytes 与 String 的区别

本文详细介绍了Python3中对文本和二进制数据处理的重要改进,特别是如何明确地区分str类型(文本)和bytes类型(二进制数据),以及如何在两者之间进行编码和解码。

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

python3中最重要的新特性可能就是将文本(text)和二进制数据做了更清晰的区分。文本总是用unicode进行编码,以str类型表示;而二进制数据以bytes类型表示。

在python3中,不能以任何隐式方式将str和bytes类型二者混合使用。不可以将str和bytes类型进行拼接,不能在str中搜索bytes数据(反之亦然),也不能将str作为参数传入需要bytes类型参数的函数(反之亦然)。

 

字符串和字节符之间划分界线是必然的。下面这个图解要牢记于心:

strings可以被编码(encode)成字bytes,bytes也可以解码(decode)成strings:

1

2

3

4

>>> '€20'.encode('utf-8')

b'\xe2\x82\xac20'

>>> b'\xe2\x82\xac20'.decode('utf-8')

'€20'

可以这样理解:

string是文本(text)的抽象表示。字符串(string)由字符组成,字符也是抽象的实体且与任何二进制表示无关。
当操纵字符串的时候,很多细节是不用了解的。我们可以分割、切片和拼接字符串,在字符串内部进行搜索。但并不在乎内部是如何表示的,也不用在意底层一个字符要花费多少byte。
只有在需要将string编码(encode)成byte的时候,比如:通过网络传输数据;或者需要将byte解码(decode)成string的时候,我们才会关注string和byte的区别。

传入encode和decode的参数是编码方式。编码是一种用二进制数据表示抽象字符的方式。目前有很多种编码。上面给出的UTF-8是其中一种,下面是另一种:

1

2

3

4

>>> '€20'.encode('iso-8859-15')

b'\xa420'

>>> b'\xa420'.decode('iso-8859-15')

'€20'

编码是这个转换过程中至关重要的一部分。若不编码,bytes对象b'\xa420'只是一堆比特位而已。编码赋予其含义。采用不同的编码,这堆比特位的含义就会大不同:

1

2

>>> b'\xa420'.decode('windows-1255')

'₪20'

### 将 Bytes 转换为 String 的方法 在 Delphi 中,可以使用多种方式将字节数组 (Bytes) 转换为字符串 (String),具体取决于编码格式。以下是几种常见的方式: #### 使用 TEncoding 类 TEncoding 是处理不同字符集编码的强大工具之一。 ```delphi function BytesToString(Bytes: TArray<Byte>; EncodingType: TEncoding): string; var EncodedStream: TStringStream; begin EncodedStream := TStringStream.Create(''); try EncodedStream.WriteBuffer(Pointer(Bytes)^, Length(Bytes)); Result := EncodingType.GetString(Bytes); finally EncodedStream.Free; end; end; // 示例调用 procedure TForm1.ButtonClick(Sender: TObject); var ByteData: TArray<Byte>; StrResult: string; begin ByteData := [72, 101, 108, 108, 111]; // "Hello" StrResult := BytesToString(ByteData, TEncoding.UTF8); ShowMessage(StrResult); // 显示 Hello end; ``` 此函数通过指定 `TEncoding` 实例来解析给定的字节数据并返回相应的字符串表示形式[^1]。 #### 使用 AnsiStrings 单元中的函数 对于特定于 ANSI 编码的操作,可以直接利用 `AnsiStrings` 库内的辅助功能。 ```delphi uses System.SysUtils, System.AnsiStrings; function BytesToAnsiString(Bytes: PByteArray; Size: Integer): Ansistring; begin SetLength(Result, Size); Move(Bytes^, Pointer(Result)^, Size * SizeOf(Ansichar)); end; // 示例调用 procedure TForm1.ButtonClick(Sender: TObject); var ByteData: array[0..4] of byte = ($48, $65, $6C, $6C, $6F); // ASCII for 'Hello' StrResult: Ansistring; begin StrResult := BytesToAnsiString(@ByteData, High(ByteData)+1); ShowMessage(String(StrResult)); // 显示 Hello end; ``` 这种方法适用于已知源数据采用标准单字节字符集的情况[^2]。 #### 处理 UTF-8 字符串 当涉及到多字节字符集如UTF-8时,则需特别注意正确解码过程以避免乱码现象发生。 ```delphi function Utf8BytesToString(Utf8Bytes: TArray<Byte>): string; begin Result := TEncoding.UTF8.GetString(Utf8Bytes); end; // 示例调用 procedure TForm1.ButtonClick(Sender: TObject); var Utf8EncodedText: TArray<byte>; DecodedText: string; const HelloWorldUtf8 = [$48,$65,$6C,$6C,$6F]; begin Utf8EncodedText := HelloWorldUtf8; DecodedText := Utf8BytesToString(Utf8EncodedText); ShowMessage(DecodedText); // 显示 Hello end; ``` 上述代码片段展示了如何基于不同的需求场景实现由字节数组到字符串的安全转换操作[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值