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
(ü
已损坏)
- 您可能能够处理无法使用
cp1252
或 cp437
编码表示的文本,例如 '❤'
(U+2764 HEAVY BLACK HEART)。
要将 Unicode 文本打印到 Windows 控制台,您可以使用 win-unicode-console
包。
首先,我看过这里: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
(ü
已损坏) - 您可能能够处理无法使用
cp1252
或cp437
编码表示的文本,例如'❤'
(U+2764 HEAVY BLACK HEART)。
要将 Unicode 文本打印到 Windows 控制台,您可以使用 win-unicode-console
包。