2010-06-01 38 views
0

我正在用Python写一个论坛。我想剥离含有从右到左的标记和类似的东西。建议?可能是一个正则表达式?从Python输入中删除从右到左的标记和其他Unicode字符

+0

你为什么要剥离[BOM(http://unicode.org/faq/utf_bom.html#BOM)或任何非Unicode字符?你恨世界其他地方这么多? :) – badp 2010-06-26 09:05:10

+1

@badp有点晚,但是......当你使用任何web元素时,使用RTL unicode标记有时会导致外观剧烈破裂,并且由于浏览器没有以最好的方式处理它,它可以继续打破页面内的其他元素。我看到它在Steam上被滥用 - 它甚至会在用户的名字中使用页面内部的正常元素时造成绝对混乱。 – damianb 2013-03-14 17:27:40

回答

0

如果你只是想字符限制于那些特定的字符集,您可以将字符串编码在该字符集,只是忽略编码错误:

>>> uc = u'aäöüb' 
>>> uc.encode('ascii', 'ignore') 
'ab' 
+0

27 comment = comment.encode('ascii','ignore') comment ='\ xc3 \ xa4 \ xc3 \ xb6 \ xc3 \ xbc',评论。encoding = <0x11db40处str对象的内置方法编码> UnicodeDecodeError:'ascii'编解码器无法解码0位的字节0xc3:序号不在范围内(128) args =('ascii','\ xc3 \ xa4 \ xc3 \ xb6 \ xc3 \ xbc',0,1,'ordinal not in range(128)') encoding ='ascii' end = 1 object ='\ xc3 \ xa4 \ xc3 \ xb6 \ xc3 \ xbc' reason ='序号不在范围内(128)' start = 0 – rhombidodecahedron 2010-06-01 00:52:21

+0

您的'comment'似乎不是一个unicode对象,而是一个字符串。它似乎是UTF-8编码,所以你首先需要解码它。使用'comment = comment.decode('utf-8')'将其转换为相应的unicode对象。 – sth 2010-06-01 01:12:45

+0

对于任何对最终产品感兴趣的人: 如果uc.decode('utf-8')!= uc.decode('utf-8')。encode('ascii','ignore'):return – rhombidodecahedron 2010-06-29 05:24:55

1

的OP,在难另一个答案 - 读取评论,有似乎开始喜欢一个例子...:

comment = comment.encode('ascii', 'ignore') 
comment = '\xc3\xa4\xc3\xb6\xc3\xbc' 

那当然,按次序用两种说法,将是一个不同的错误(第一个尝试访问comment但只有第二个绑定该名称),但让我们假设两条线互换,具体如下:

comment = '\xc3\xa4\xc3\xb6\xc3\xbc' 
comment = comment.encode('ascii', 'ignore') 

这,这的确会导致OP似乎有在难以阅读评论的错误,是出于不同的原因一个问题:comment是字节字符串(开头引号前没有前导的u),但.encode适用于unicode字符串 - 所以Python首先尝试使用默认编解码器ascii创建一个临时unicode,该字符串当然失败因为该字符串充满了非ASCII字符。

插入在字面领先u将工作:

comment = u'\xc3\xa4\xc3\xb6\xc3\xbc' 
comment = comment.encode('ascii', 'ignore') 

(这当然是叶comment空,因为所有它的字符被忽略)。或者 - 例如,如果原始字节字符串来自其他来源,没有文字:

comment = '\xc3\xa4\xc3\xb6\xc3\xbc' 
comment = comment.decode('latin-1') 
comment = comment.encode('ascii', 'ignore') 

这里,第二条语句明确构建统一码,似乎适用于本例中的编解码器(只是猜测,当然,你不能确定哪一个编解码器应该从仅仅看到一个空字节串开始! - ),然后第三个删除所有非ascii字符(并且再次将空的comment留下)。

+0

对不起难以阅读的评论。因为用户将评论的内容传递给我的脚本,我该如何添加领先的u?我在做:“comment = form.getvalue(key)”,然后尝试从那里将其改为ascii。 – rhombidodecahedron 2010-06-01 01:24:30

+0

@Earl,如果用户传递给你一个带有某种编码的字节串,则需要使用我在答案中给出的最后一个片段:将其明确解码为unicode,然后将该unicode编码回ascii,同时跳过非ascii字符。但是你必须知道(或者,最坏的情况下,猜测!)用户使用什么编码(猜测不需要,因为该信息应该是HTTP请求中的“文档类型”头部分的一部分)重新处理! - )。 – 2010-06-01 01:51:01

0

很难猜出要从Unicode字符串中移除的字符集。难道他们都是“Other, Format”字符?如果是的话,你可以这样做:

import unicodedata 

your_unicode_string= filter(
    lambda c: unicodedata.category(c) != 'Cf', 
    your_unicode_string)