鱼C论坛

 找回密码
 立即注册
查看: 1841|回复: 0

[技术交流] 关于open()写入Unicode特殊字符时报错

[复制链接]
发表于 2022-7-16 13:30:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
如果你是用open()函数,可能会出现一个问题:
example1.py
  1. char_id = 0
  2. max_id = 2 ** 31 - 1
  3. while True:
  4.     with open("file.txt", "w") as f:
  5.         f.write(chr(char_id))

  6.     char_id += 1

  7.     if char_id > max_id:
  8.         break
复制代码

运行example1.py,报错如下:
  1. Traceback (most recent call last):
  2.   File "D:/Python/Test/openFunction/example1.py", line 5, in <module>
  3.     f.write(chr(char_id))
  4. UnicodeEncodeError: 'gbk' codec can't encode character '\x80' in position 0: illegal multibyte sequence
复制代码

1.为什么
在Python3速查宝典中,open()的参数如下:
  1. open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
复制代码

注意:encoding的默认值为None。
此时,观察错误信息,可以发现Python将这个所谓的None解释成了GBK编码,而chr()是UFT-8编码,write()无法写入Unicode字符。
在Python Shell中输入以下代码(另见open()速查宝典注3):
  1. import locale
  2. locale.getpreferredencoding(False)
复制代码

返回
  1. 'cp936'
复制代码

而cp936对应的编码即为GB2312(GBK的一种)
2.解决办法
指定open()的encoding参数为
  1. 'utf-8'
复制代码
即可解决
example2.py
  1. char_id = 0
  2. max_id = 2 ** 31 - 1
  3. while True:
  4.     with open("file2.txt", "w", encoding="utf-8") as f:
  5.         f.write(chr(char_id))

  6.     char_id += 1

  7.     if char_id > max_id:
  8.         break
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-28 02:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表