在我的网站上,人们可以发布新闻,不少编辑使用MS word和类似工具编写文本,然后复制并粘贴到我网站的编辑器中(简单的textarea,没有WYSIWYG等)。
这些文本通常包含“漂亮”引号而不是简单的ascii引号("
)。它们有时也会包含–
而不是-
的较长破折号。
现在我想用ascii对应物替换所有这些字符。但是,我不想删除变音符号和其他非ascii字符。我也非常喜欢使用一个不需要为所有这些字符创建映射字典的正确解决方案。
我的所有字符串都是unicode对象。
答案 0 :(得分:1)
您可以构建在unidecode包之上。
这很慢,因为我们首先将所有unicode规范化为组合形式,然后尝试查看unidecode将其转换为什么。如果我们匹配拉丁字母,那么我们实际上使用原始的NFC字符。如果没有,那么我们产生任何解码的unidecode建议。这会留下强调的字母,但会转换其他所有内容。
import unidecode
import unicodedata
import re
def char_filter(string):
latin = re.compile('[a-zA-Z]+')
for char in unicodedata.normalize('NFC', string):
decoded = unidecode.unidecode(char)
if latin.match(decoded):
yield char
else:
yield decoded
def clean_string(string):
return "".join(char_filter(string))
print(clean_string(u"vis-à-vis “Beyoncé”’s naïve papier–mâché résumé"))
# prints vis-à-vis "Beyoncé"'s naïve papier-mâché résumé
答案 1 :(得分:0)
您可以使用str.translate()方法(http://docs.python.org/library/stdtypes.html#str.translate)。但是,请阅读与Unicode相关的文档 - 转换表有另一种形式:unicode序数 - > unicode字符串(通常为char)或None。
嗯,但它需要字典。无论如何你必须捕获替换品。如果没有任何表或数组,你想怎么做?你可以使用str.replace()作为单个字符,但这样效率很低。
答案 2 :(得分:0)
这个怎么样? 它首先创建转换表,但老实说,如果没有它,我认为你不能这样做。
transl_table = dict( [ (ord(x), ord(y)) for x,y in zip( u"‘’´“”–-", u"'''\"\"--") ] )
with open( "a.txt", "w", encoding = "utf-8" ) as f_out :
a_str = u" ´funny single quotes´ long–-and–-short dashes ‘nice single quotes’ “nice double quotes” "
print( " a_str = " + a_str, file = f_out )
fixed_str = a_str.translate( transl_table )
print( " fixed_str = " + fixed_str, file = f_out )
我无法将此打印件运行到控制台(在Windows上),因此我必须写入txt文件 a.txt文件中的输出如下所示:
a_str ='funny单引号'长短划线'漂亮的单曲 引用'“漂亮的双引号”fixed_str ='有趣的单引号' 长而短的破折号'漂亮的单引号'“漂亮的双引号”
顺便说一下,上面的代码在Python 3中运行。如果你需要它用于Python 2,它可能需要一些修复,因为在两种语言版本中处理Unicode字符串的区别
答案 3 :(得分:0)
没有这样的“正确”解决方案,因为对于任何给定的Unicode字符,没有定义“ASCII对应”。
例如,将您可能想要映射的看似简单的字符映射到ASCII单引号和双引号和连字符。首先,让我们用他们的官方名称生成所有Unicode字符。其次,让我们根据名称找到所有的引号,连字符和破折号:
#!/usr/bin/env python3
import unicodedata
def unicode_character_name(char):
try:
return unicodedata.name(char)
except ValueError:
return None
# Generate all Unicode characters with their names
all_unicode_characters = []
for n in range(0, 0x10ffff): # Unicode planes 0-16
char = chr(n) # Python 3
#char = unichr(n) # Python 2
name = unicode_character_name(char)
if name:
all_unicode_characters.append((char, name))
# Find all Unicode quotation marks
print (' '.join([char for char, name in all_unicode_characters if 'QUOTATION MARK' in name]))
# " « » ‘ ’ ‚ ‛ “ ” „ ‟ ‹ › ❛ ❜ ❝ ❞ ❟ ❠ ❮ ❯ ⹂ 〝 〞 〟 "
# Find all Unicode hyphens
print (' '.join([char for char, name in all_unicode_characters if 'HYPHEN' in name]))
# - ֊ ᐀ ᠆ ‐ ‑ ‧ ⁃ ⸗ ⸚ ⹀ ゠ ﹣ -
# Find all Unicode dashes
print (' '.join([char for char, name in all_unicode_characters if 'DASH' in name and 'DASHED' not in name]))
# ‒ – — ⁓ ⊝ ⑈ ┄ ┅ ┆ ┇ ┈ ┉ ┊ ┋ ╌ ╍ ╎ ╏ ⤌ ⤍ ⤎ ⤏ ⤐ ⥪ ⥫ ⥬ ⥭ ⩜ ⩝ ⫘ ⫦ ⬷ ⸺ ⸻ ⹃ 〜 〰 ︱ ︲ ﹘
正如您所看到的,就像这个例子一样简单,存在许多问题。 Unicode中有许多引号看起来不像US-ASCII中的引号,并且Unicode中有许多连字符看起来不像US-ASCII中的连字符 - 减号。
还有很多问题。例如:
要建立“正确的”ASCII对应物,有人需要根据使用上下文回答这些问题。这就是为什么问题的所有解决方案都以某种方式基于映射字典的原因。所有这些解决方案都会提供不同的结果。
答案 4 :(得分:-2)
此工具会标记标记中的标点符号:http://johnmacfarlane.net/pandoc/README.html
-S, - smart生成印刷正确的输出,将直引号转换为曲线引号,---转换为em-dashes, - 转换为en-dashes, 和...到省略号。确定后插入不间断空格 缩写,例如“Mr.”(注意:此选项仅有意义 当输入格式为降价或纺织品时。它被选中了 当输入格式为textile或输出格式时自动输入 乳胶或背景。)
它是haskell,所以你必须找出界面。