VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > Python基础教程 >
  • Python3标准库:codecs字符串编码和解码(2)

(0, len(hex_version), chars_per_item)
  • )
  •  
  • encodings = ['utf-8','utf-16','utf-32']
  • for encoding in encodings:
  • filename = encoding + '.txt'
  •  
  • print('Writing to', filename)
  • with codecs.open(filename, mode='w', encoding=encoding) as f:
  • f.write('français')
  •  
  • # Determine the byte grouping to use for to_hex()
  • nbytes = {
  • 'utf-8': 1,
  • 'utf-16': 2,
  • 'utf-32': 4,
  • }.get(encoding, 1)
  •  
  • # Show the raw bytes in the file
  • print('File contents:')
  • with open(filename, mode='rb') as f:
  • print(to_hex(f.read(), nbytes))
  • 这个例子首先处理一个包含ç的unicode串,使用指定的编码将这个文本保存到一个文件。

    用open()读数据很简单,但有一点要注意:必须提前知道编码才能正确的建立解码器。尽管有些数据格式(如XML)会在文件中指定编码,但是通常都要由应用来管理。codecs只是取一个编码参数,并假设这个编码是正确的。

    
    	
    1. import binascii
    2. import codecs
    3.  
    4. def to_hex(t, nbytes):
    5. """Format text t as a sequence of nbyte long values
    6. separated by spaces.
    7. """
    8. chars_per_item = nbytes * 2
    9. hex_version = binascii.hexlify(t)
    10. return b' '.join(
    11. hex_version[start:start + chars_per_item]
    12. for start in range(0, len(hex_version), chars_per_item)
    13. )
    14.  
    15. encodings = ['utf-8','utf-16','utf-32']
    16. for encoding in encodings:
    17. filename = encoding + '.txt'
    18.  
    19. print('Reading from', filename)
    20. with codecs.open(filename, mode='r', encoding=encoding) as f:
    21. print(repr(f.read()))

    这个例子读取上一个程序创建的文件,并把得到的unicode对象的表示打印到控制台。

    1.3 字节序

    在不同的计算机系统之间传输数据时(可能直接复制一个文件,或者使用网络通信来完成传输),多字节编码(如UTF-16和UTF-32)会带来一个问题。不同系统中使用的高字节和低字节的顺序不同。数据的这个特性被称为字节序(endianness),这取决于硬件体系结构等因素,还取决于操作系统和应用开发人员做出的选择。通常没有办法提前知道给定的一组数据要使用哪一个字节序,所以多字节编码还包含一个字节序标志(Byte-Order Marker,BOM),这个标志出现在编码输出的前几个字节。例如,UTF-16定义0xFFFE和0xFEFF不是合法字符,可以用于指示字节序。codecs定义了UTF-16和UTF-32所用的字节序标志的相应常量。

    
    	
    1. import codecs
    2. import binascii
    3.  
    4. def to_hex(t, nbytes):
    5. """Format text t as a sequence of nbyte long values
    6. separated by spaces.
    7. """
    8. chars_per_item = nbytes * 2
    9. hex_version = binascii.hexlify(t)
    10. return b' '.join(
    11. hex_version[start:start + chars_per_item]
    12. for start in range(0, len(hex_version), chars_per_item)
    13. )
    14.  
    15. BOM_TYPES = [
    16. 'BOM', 'BOM_BE', 'BOM_LE',
    17. 'BOM_UTF8',
    18. 'BOM_UTF16', 'BOM_UTF16_BE', 'BOM_UTF16_LE',
    19. 'BOM_UTF32', 'BOM_UTF32_BE', 'BOM_UTF32_LE',
    20. ]
    21.  
    22. for name in BOM_TYPES:
    23. print('{:12} : {}'.format(
    24. name, to_hex(getattr(codecs, name), 2)))

    取决于当前系统的原生字节序,BOM、BOM_UTF16和BOM_UTF32会自动设置为适当的大端(big-endian)或小端(little-endian)值。

    可以由codecs中的解码器自动检测和处理字节序,也可以在编码时显式的指定字节序。 

    
    	
    1. import codecs
    2. import binascii
    3.  
    
    相关教程