Windows下Python2.7输入Unicode字符时变音符号被隐式移除如何解决
问题原因
带变音Unicode字符被自动移除变音符号的核心原因有两点:
- 当前cmd窗口默认使用的
cp437(IBM OEM 西文代码页)字符集覆盖范围极小,不包含À这类大写带重音的拉丁扩展字符,Windows控制台在读取输入时会自动做「近似字符匹配」,直接把不支持的带变音字符折叠成形态最接近的基础ASCII字符(比如À映射为A)。 - 此前尝试的修改
sys.stdin/sys.stdout编码、设置PYTHONIOENCODING环境变量两种方案,生效时机晚于控制台输入的字符映射阶段——等Python代码拿到输入内容时,变音符号已经被移除了,后续改编码完全无法还原丢失的字符信息,自然不会生效。
可行解决方法
按操作成本从低到高排序:
- 临时修改当前cmd窗口代码页:启动Python前,在当前cmd窗口执行命令
chcp 65001,将当前窗口的控制台代码页切换为UTF-8,再启动Python 2.7即可正常识别输入的带变音Unicode字符。注意切换后不要在Python代码里重复手动覆盖sys.stdin/sys.stdout的编码配置,避免编码不匹配出现乱码。如果仅需要支持西欧拉丁字符,也可以执行chcp 1252切换到Windows西欧ANSI代码页,兼容性比65001在Python2.7下更稳定。 - 绕开控制台输入环节:如果只是需要在代码里使用这类特殊字符,直接用Unicode转义序列书写即可,比如把
u'À'写成u'\u00c0',这种写法完全不依赖控制台输入编码,不会出现字符丢失问题。 - 替换默认终端:把原生cmd换成Windows Terminal、ConEmu这类对Unicode支持完善的终端,这类终端不会默认做字符折叠映射,只要终端编码配置为UTF-8,就能正常输入输出各类带变音的Unicode字符。
- 全局修改系统代码页(谨慎操作):Win10及以上版本可以在系统「区域-管理-更改系统区域设置」中勾选「Beta版:使用Unicode UTF-8提供全球语言支持」,重启后全局所有控制台窗口默认使用UTF-8代码页,不过该功能可能导致部分仅支持GBK/ANSI编码的老旧软件出现乱码,非必要不推荐开启。
注意:Python 2.7早已停止官方维护,对Windows新的Unicode控制台特性支持存在很多原生缺陷,长期使用建议迁移到Python 3版本,Python 3的Windows控制台Unicode适配已经非常完善,不会出现这类字符自动折叠的问题。
内容的提问来源于stack exchange,提问作者AJ Tan
相关产品推荐
相关产品推荐

