面试题答案
一键面试Python代码实现
import codecs
def write_encoded_data_to_utf16(file_path, data_list, encoding_list):
with codecs.open(file_path, 'w', 'utf - 16') as f:
for data, encoding in zip(data_list, encoding_list):
try:
decoded_data = data.decode(encoding)
f.write(decoded_data)
except UnicodeDecodeError as e:
print(f"解码 {encoding} 格式数据时出错: {e}")
使用示例:
data1 = b'\xe4\xb8\xad' # UTF - 8编码的“中”
data2 = b'\xd6\xd0' # GBK编码的“中”
data_list = [data1, data2]
encoding_list = ['utf - 8', 'GBK']
write_encoded_data_to_utf16('output.txt', data_list, encoding_list)
原理解释
- 打开文件:
- 使用
codecs.open(file_path, 'w', 'utf - 16')
以UTF - 16编码打开文件。codecs
模块提供了方便处理不同编码的文件I/O操作。'w'
表示写入模式,如果文件不存在则创建,如果存在则覆盖。
- 使用
- 遍历数据和编码列表:
- 使用
zip(data_list, encoding_list)
将数据列表和对应的编码列表组合在一起,以便同时遍历。
- 使用
- 解码数据:
decoded_data = data.decode(encoding)
尝试将字节数据data
按照指定的encoding
进行解码。例如,如果数据是UTF - 8编码的,就使用'utf - 8'
编码进行解码;如果是GBK编码的,就使用'GBK'
编码进行解码。解码后的数据是Unicode字符串。
- 写入文件:
f.write(decoded_data)
将解码后的Unicode字符串写入到以UTF - 16编码打开的文件中。由于文件已经以UTF - 16编码打开,Python会自动将Unicode字符串编码为UTF - 16格式写入文件。
编码转换陷阱
- 解码错误:
- 如果使用错误的编码格式进行解码,会抛出
UnicodeDecodeError
。例如,用'utf - 8'
解码GBK编码的数据。在代码中,通过try - except
块捕获并打印错误信息。
- 如果使用错误的编码格式进行解码,会抛出
- 隐式编码转换:
- 在Python中,不同编码之间的转换应该显式进行。如果不小心在未解码的字节数据上进行操作,可能会导致数据损坏或编码错误。例如,直接将字节数据写入期望Unicode字符串的文件对象中。
- 字节序问题:
- UTF - 16有大端序(UTF - 16BE)和小端序(UTF - 16LE)。
codecs.open
默认使用系统相关的字节序。如果需要特定字节序,需要明确指定,例如'utf - 16be'
或'utf - 16le'
。
- UTF - 16有大端序(UTF - 16BE)和小端序(UTF - 16LE)。