Python 2.7 和 Sublime 2 + unicode 不能混用

Python 2.7 and Sublime 2 + unicode don't mix

首先,我看过这里:Sublime Text 3, Python 3 and UTF-8 don't like each other and read The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets 但我仍然 none 更了解以下内容:

运行 Python 来自在 Sublime 中创建(未编译)并在 XP 机器上通过命令提示符执行的文件

我有几个以重音命名的文本文件(主要是德语、西班牙语和法语)。我想删除重音字符(变音符号、尖音符号、坟墓、cidillas 等)并用它们的等效非重音符号替换它们。

如果重音是脚本中的字符串,我可以去除重音。但是访问同名的文本文件会导致 strippAcent 函数失败。我完全没有想法,因为我认为这是由于与 Sublime 和 Python.

的冲突造成的

这是我的脚本

# -*- coding: utf-8 -*-

import unicodedata
import os

def stripAccents(s):
  try:
    us = unicode(s,"utf-8")
    nice = unicodedata.normalize("NFD", us).encode("ascii", "ignore")
    print nice
    return nice
  except:
    print ("Fail! : %s" %(s))
    return None   


stripAccents("Découvrez tous les logiciels à télécharger")
# Decouvrez tous les logiciels a telecharger 
stripAccents("Östblocket")
# Ostblocket
stripAccents("Blühende Landschaften")
# Bluhende Landschaften

root = "D:\temp\test\"

for path, subdirs, files in os.walk(root):
  for name in files:
    x = name
    x = stripAccents(x)

备案:

C:\chcp

让我得到 437

这是代码为我生成的结果:

完整的错误是:

C:\WINDOWS\system32>D:\LearnPython\unicode_accents.py
Decouvrez tous les logiciels a telecharger
Ostblocket
Bluhende Landschaften
Traceback (most recent call last):
  File "D:\LearnPython\unicode_accents.py", line 37, in <module>
    x = stripAccents(x)
  File "D:\LearnPython\unicode_accents.py", line 8, in stripAccents
    us = unicode(s,"utf-8")
UnicodeDecodeError: 'utf8' codec can't decode byte 0xfc in position 2:   invalid start byte

C:\WINDOWS\system32>
root = "D:\temp\test\"
for path, subdirs, files in os.walk(root):

如果你想读取 Windows 的原始 Unicode 格式的文件名,你必须通过将 Unicode 字符串传递给文件系统函数来明确要求:

root = u"D:\temp\test\"

否则Python将默认使用标准的基于字节的文件系统接口。在 Windows 上,这些 return 文件名以系统特定于区域设置的旧编码(ANSI 代码页)编码。

在 stripAccents 中,您尝试使用 UTF-8 解码从此处获得的字节字符串,但 ANSI 代码页绝不是 UTF-8,并且您拥有的字节序列恰好不是有效的 UTF- 8 序列所以你得到一个错误。您可以使用伪编码 mbcs 从 ANSI 代码页解码,但最好坚持使用 Unicode 文件路径字符串,这样您就可以包含不适合 ANSI 的字符。

始终使用 Unicode 字符串表示 Python 中的文本。在顶部添加 from __future__ import unicode_literals 以便所有 "" 文字都将创建 Unicode 字符串。或者到处使用 u"" 文字。从 stripAccents() 中删除 unicode(s, 'utf-8'),始终传递 Unicode 字符串(尝试 unidecode 包,将 Unicode 音译为 ascii)。

使用 Unicode 透明地解决了几个问题:

  • 不会有 UnicodeDecodeError,因为 Windows 为文件名提供 Unicode API:如果您通过 Unicode 输入;你得到 Unicode 输出
  • 当包含使用 Windows 编码(例如 cp1252 编码的文本的字节串显示在使用 cp437 编码(例如 [=19=)的控制台中时,您不会得到 mojibake ] -> Blⁿhendeü 已损坏)
  • 您可能能够处理无法使用 cp1252cp437 编码表示的文本,例如 '❤' (U+2764 HEAVY BLACK HEART)

要将 Unicode 文本打印到 Windows 控制台,您可以使用 win-unicode-console 包。