Python中如何解决常见的编码问题?

xshell 登录 linux 执行执行下面命令:
python3 test.py ‘你好’
这一句目前是直接手动执行的,以后计划 php 内通过 exec()来执行

tesp.py 里面:
str = sys.argv[1]
print(str) //打印出来是“你好”

if str == “你好”:
print(‘ok’) //这一句没有输出,说明二者并不相同

下面这两句
print(‘你好’.encode(‘utf-8’))

print(str.encode(‘utf-8’))

第一句正常输出: // b’\xe4\xbd\xa0\xe5\xa5\xbd’
第二句报错: UnicodeEncodeError: ‘utf-8’ codec can’t encode character ‘\udce4’

我想知道传递过来的参数,究竟发生了什么变化,明明都是“你好”,怎么会不一样

因为后面有一步关键操作需要 str.encode(‘utf-8’) ,怎么样才能让它不报错?
Python中如何解决常见的编码问题?


17 回复

第二句不是已经提示是 utf-8 了吗


处理Python编码问题,核心是理解“编码/解码”过程。常见问题及解决方案如下:

1. 读取文件时出现UnicodeDecodeError

# 明确指定文件编码(常见编码:utf-8, gbk, latin-1)
with open('file.txt', 'r', encoding='utf-8') as f:
    content = f.read()

# 或使用errors参数处理无法解码的字符
with open('file.txt', 'r', encoding='utf-8', errors='ignore') as f:
    content = f.read()  # 忽略错误字符
# errors可选:'replace'(用�替换), 'backslashreplace'(用\xhh替换)

2. 写入文件时编码问题

# 写入时指定编码
with open('output.txt', 'w', encoding='utf-8') as f:
    f.write("需要写入的文本")

3. 字符串与字节串转换

# 字符串转字节串(编码)
text = "你好世界"
bytes_data = text.encode('utf-8')  # b'\xe4\xbd\xa0\xe5\xa5\xbd\xe4\xb8\x96\xe7\x95\x8c'

# 字节串转字符串(解码)
original_text = bytes_data.decode('utf-8')  # "你好世界"

4. 处理来源不明的文本

import chardet

def detect_encoding(data):
    result = chardet.detect(data)
    return result['encoding']

# 示例:检测文件编码
with open('unknown.txt', 'rb') as f:
    raw_data = f.read()
    encoding = detect_encoding(raw_data)
    text = raw_data.decode(encoding)

5. 网络请求编码处理

import requests

response = requests.get('http://example.com')
# 自动检测编码
response.encoding = response.apparent_encoding
text = response.text

通用建议:

  • 在Python文件开头添加# -*- coding: utf-8 -*-(Python 3默认UTF-8,可省略)
  • 内部处理统一使用Unicode字符串
  • 仅在I/O操作时进行编码/解码转换
  • 数据库连接、API调用等外部交互时明确指定编码

一句话总结:统一使用UTF-8,在I/O边界明确指定编码。

sys.argv 传入的是 Unicode ,不需要 encode 吧?

会不会 str 已经是 unicode 了 所以不用 encode 了

写错了 str 已经不是 unicode 了 不用 encode 了

额。。。貌似说错了,应该说是 sys.argv 传入的是 UTF-8 ,不需要 encode ,然后 Python 内部声明的都是 Unicode 所以要 encode 成其他的。。。

不写 encode , python 2 3 下都正常。写 encode , python 2 失败, 3 正常。
mac 下 iterm 运行的。不知楼主怎么回事。直接打印看看?

✗ python --version
Python 3.6.0

✗ cat test.py
import sys

str = sys.argv[1]
print(str)
print(type(str))
if str == “你好”:
print(“ok”)
print(‘你好’.encode(‘utf-8’))
print(str.encode(‘utf-8’))

✗ python test.py ‘你好’
你好
<class ‘str’>
ok
b’\xe4\xbd\xa0\xe5\xa5\xbd’
b’\xe4\xbd\xa0\xe5\xa5\xbd’


可能我用了假 python ……

即是说通过参数传递进来的 str 本身就是 utf-8 编码的字符串?
因为我后面要用某个库里的一个函数需要对 str 执行 encode(‘utf-8’),里面的代码不方便改动,
那么在此之前,我需要的把 str 变成普通的字符串,然后确保 str.encode(‘utf-8’)能顺利执行,请问这需要怎么做

升级一下 python 版本?

unicode 才要 encode
byte string 才要 decode

他已经是 python 3 了

decode 试试 我也是新手

代码( python2.7 ):

# -- coding: utf8 --
import sys

str = sys.argv[1]
print str #打印出来是“你好”

if str == “你好”:
print ‘ok’ #打印 ok

print ‘你好’.encode(‘utf-8’) # 这行报错
print str.encode(‘utf-8’)

打印信息如下:
你好
ok
Traceback (most recent call last):
File “test.py”, line 10, in <module>
print ‘你好’.encode(‘utf-8’)
UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe4 in position 0: ordinal not in range(128)

python2 的话,如果文件编码和终端编码相同,应该会打印出 ok 的。
python3 的话,我这边是没问题的,都是正常的,和#7 一致。









谢谢各位,问题暂时解决了,
str.encode(‘utf-8’,‘surrogateescape’)
这样就没问题了

不过编码解码这一块,我确实得花点功夫研究一下,
不然每次遇到问题都要折腾好久,太痛苦了

长见识了,赶紧学习了一波 surrogateescape

回到顶部