首页 > 编程问答 >如何选择使用哪种字符编码?

如何选择使用哪种字符编码?

时间:2024-07-27 13:32:00浏览次数:13  
标签:python character-encoding

在Python中,使用 subprocess.Popen 我们经常需要将外部工具的输出从字节转换为字符串。 我一直没有考虑太多就使用UTF-8,到目前为止还没有遇到问题。 我遇到了一些代码,其中有人使用 ASCII,这让我思考我应该如何知道要使用哪种编码?这重要吗?

对于简单的字符串,它似乎没有什么区别,例如:

>>> subprocess.check_output(['git', 'rev-parse', '--short', 'HEAD'], encoding='ASCII')
'4091146\n'
>>> subprocess.check_output(['git', 'rev-parse', '--short', 'HEAD'], encoding='utf-8')
'4091146\n'

我知道 UTF-8 是一个更大的字符集,因此“特殊”字符不能编码为 ASCII:

>>> "Büster".encode('utf-8')
b'B\xc3\xbcster'
>>> "Büster".encode('ascii')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character '\xfc' in position 1: ordinal not in range(128)

我猜编码取决于外部程序,那么我怎么知道要使用哪一个呢? 始终假设 UTF-8 安全吗?


你问了一个关于字符编码和处理外部进程输出的极好的问题。 虽然简单的字符串在 ASCII 或 UTF-8 中可能看起来相同,但选择正确的编码至关重要,以避免处理包含非 ASCII 字符的数据时出现问题。

以下是选择正确编码的方法:

  1. 查看外部程序的文档: 确定程序输出的编码的最佳位置是其文档。 它应指定使用的默认编码或允许配置它。

  2. 检查程序的语言环境设置: 如果文档未明确说明,则程序可能会根据其语言环境设置使用默认编码。 可以通过查看 LC_ALL LC_CTYPE LANG 等环境变量来检查程序的语言环境。

  3. 从上下文推断: 如果无法从文档或语言环境设置中确定编码,则可能需要根据程序的用途或它处理的数据类型来推断它。 例如,如果程序处理来自多语言源的文本,则很可能使用 UTF-8。

  4. 始终假设 UTF-8 安全吗? 虽然 UTF-8 正在成为一种越来越普遍的默认编码,但假设它并不总是安全的。 某些程序可能仍在使用旧版编码,并且假设 UTF-8 可能会导致数据损坏或解释错误。

如果无法确定要使用的正确编码,该怎么办:

  • 尝试使用 chardet 库: Python 的 chardet 库可以分析字节流并估计最可能的编码。 这并不总是准确的,但可以作为一个有用的起点。 ```python import chardet

    output_bytes = subprocess.check_output(['some_command']) detected_encoding = chardet.detect(output_bytes)['encoding'] output_string = output_bytes.decode(detected_encoding, errors='replace') `` * **使用 errors='replace' 进行解码:** 将 errors 参数设置为 'replace'` 将导致解码器用特殊字符(例如 Unicode 替换字符 (�))替换无法解码的字符。 这可以帮助防止的程序因编码错误而崩溃,但可能会导致数据丢失。

你的示例:

在你的 git rev-parse 示例中,ASCII 和 UTF-8 都可以正常工作,因为输出(一个简短的提交哈希值)仅包含 ASCII 字符。 但是,如果 git 命令的输出包含非 ASCII 字符(例如,提交消息中的作者姓名),则使用 ASCII 将失败。

总之,不要想当然地认为编码。 咨询文档、检查语言环境设置或使用编码检测工具来避免将来出现问题。

标签:python,character-encoding
From: 63771125

相关文章

  • Python数据分析案例55——基于LSTM结构自编码器的多变量时间序列异常值监测
    案例背景时间序列的异常值检测是方兴未艾的话题。比如很多单变量的,一条风速,一条用电量这种做时间序列异常值检测,想查看一下哪个时间点的用电量异常。多变量时间序列由不同变量随时间变化的序列组成,这些时间序列在实际应用中通常来自不同的传感器或数据源。多变量时间序列异......
  • 我没有 python 但我有 python3
    我最近格式化了我的笔记本电脑并安装了Ubuntu操作系统。我没有明确安装Python。为了检查它是否已预安装,我在终端中运行python--version并得到了这个:$python--versionCommand'python'notfound,butcanbeinstalledwith:sudoaptinstallpython3......
  • 基于YOLOv9的停车场空闲车位检测【python源码+UI界面+数据集+模型+语音报警+安装说明
    往期精品导航基于YOLOv9的脑肿瘤区域检测智慧课堂基于YOLOv8的学生上课行为检测基于YOLOv9+pyside的安检仪x光危险物物品检测(有ui)基于YOLOv9的PCB板缺陷检测基于YOLOv9的线路绝缘子缺陷检测【python源码+UI界面+数据集+模型+语音报警+安装说明】基于YOLOv9的道路状况检测【......
  • 1-python的数据类型与变量
    一、交互模式与脚本模式交互模式:就相当于一种问答模式,关闭即消失无法保存重用比如python自带的编译器脚本模式:可以将代码长期保存以及重复使用如何创建脚本模式:idle——file——newfile[快捷方式:idle——ctrl+n]保存:ctrl+s运行:F5二、变量(Variable)变量:会变化......
  • 2-Python数据类型——序列
    Python数据类型——序列一、序列序列是一个可以存放多个值的容器。有序序列:在序列中每个值都有对应的下标下标:就相当于酒店的房间号,方便客人的查找与酒店的管理在编程中下标的起始值与日常生活中的计数有所不同:下标的计数从0开始计数,从左往右计数:下标从0开始往右递......
  • crontab 运行 .sh 文件调用 python 脚本
    我有一个pythonselenium脚本,可以打开chrome并为我运行一些自动化任务。在crontab中直接调用python可以使用下面的行。:10.0是我运行echo$DISPLAY时得到的值。我使用的是Ubuntu22.04.4LTS5823**2DISPLAY=:10.0/usr/bin/python3/home/user/Script......
  • Pythonanywhere - ping:套接字:不允许操作
    请帮忙。我有一个Telegram机器人,当我从Bash控制台启动他时,它每60秒ping一次静态IP-它工作正常,但每天停止工作一次。我尝试使用“始终开启任务”,但在日志文件中收到“ping:套接字:不允许操作”。我有5美元帐户,我能做什么?从Bash控制台运行时我看到的内容:---17......
  • python+flask计算机毕业设计社区疫情防控物资调配平台(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景近年来,全球公共卫生事件的频发,尤其是新冠疫情的爆发,对社区治理与应急响应能力提出了前所未有的挑战。社区作为疫情防控的第一线,其物资调配......
  • python+flask计算机毕业设计四川工商学院疫情防控系统的设计与实现(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在全球新冠疫情持续蔓延的背景下,高校作为人员密集、流动性大的特殊场所,其疫情防控工作显得尤为重要。四川工商学院作为一所集教学、科研、......
  • python+flask计算机毕业设计企业人事管理系统(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着企业规模的不断扩大与业务复杂度的提升,传统的人事管理方式已难以满足现代企业对高效、精准、自动化管理的需求。企业人事管理涉及员工......