2012-02-21 18 views
-1

私は使用されているタイトルはわかりませんが、基本的には文字列から奇妙な文字を取り除きたいと思っています。ここでは、コードは次のようになります。Python文字エンコーディング?

#!/usr/bin/python 
# -*- coding: utf-8 -*- 
# source: http://snippets.dzone.com/posts/show/4569 

from htmlentitydefs import name2codepoint as n2cp 
import re 

def substitute_entity(match): 
    ent = match.group(3) 

    if match.group(1) == "#": 
     if match.group(2) == '': 
      return unichr(int(ent)) 
     elif match.group(2) == 'x': 
      return unichr(int('0x'+ent, 16)) 
    else: 
     cp = n2cp.get(ent) 

     if cp: 
      return unichr(cp) 
     else: 
      return match.group() 

def decode_htmlentities(string): 
    entity_re = re.compile(r'&(#?)(x?)(\d{1,5}|\w{1,8});') 
    return entity_re.subn(substitute_entity, string)[0] 



test = ['<b>Blogger</b> in the Classroom - <b>Google</b>', 'Of\xef\xac\x81cial <b>Google Blog</b>'] 
container = [] 

for i in test: 
    container.append(decode_htmlentities(i)) 
print container 

for i in test: 
    print decode_htmlentities(i) 

そして、ここではその結果です:

['<b>Blogger</b> in the Classroom - <b>Google</b>', 'Of\xef\xac\x81cial <b>Google Blog</b>'] 

<b>Blogger</b> in the Classroom - <b>Google</b> 
Official <b>Google Blog</b> 

質問:同じ機能を使用して

(decode_htmlentities())、追加するとき、私は別の結果を得る理由リストと 'ちょうど'の印刷に?ここで

が違いです:

Of\xef\xac\x81cial <b>Google Blog</b> # output from list 
Official <b>Google Blog</b> # output from print 
+0

あなたは、特殊文字に対してあなたの正規表現をテストしましたか? – PenguinCoder

+0

いいえ、私はそれをテストしていません。印刷とリストの追加の結果が異なるのはなぜですか? – kholidfu

+0

pythonでリスト項目を印刷すると、実際のリスト自体を印刷するのとは異なった解釈が行われます。ジョシュ・リーの答えを見てください。 – PenguinCoder

答えて

3

あなたがリストにUTF-8でエンコードされた文字列を追加する場合は、リストを印刷する\ Xエスケープを挿入します。文字列にreprを呼び出すと、同じ結果が得られます。すべてが正しく動作しているようです。

リストを印刷すると、でなく、の内容をエスケープする必要がある場合は、手動でリストをループする必要があります。しかし、文字列がリストにないときに正しい値が表示された場合は、それがどのように反応するかを除いてリストに追加するときに何も変わりません。str

おそらく、UTF-8バイトの代わりに適切なUnicode文字を使用したいとします。だから、これに代えて:

>>> s = '\xef\xac\x81' 
>>> print [s] 
['\xef\xac\x81'] 

あなたはこの見ることができます:

>>> u = s.decode('utf-8') 
>>> print [u] 
[u'\ufb01'] 
>>> len(u) 
1 
>>> print u 
fi 

今、あなたは私はあなたが実際に欲しいものであると思いアトミックユニットとしてキャラクターを操作できます。加えて、正しくエンコードされた文字を必要とするツールは、バイトではなく文字で表現したので、何をすべきかを知っています。

+0

私が欲しいのは、このようなリストは、次のとおりです。[「教室でブロガーからグーグル」「のFI Googleのブログ CIAL」、] – kholidfu

+0

はあなたのコードサンプルを使用して、私は 『実際に』で何をしたいです[ 'fi'] ... – kholidfu

+0

あなたが持っていることを言ったら私を信じてくれますか? –

2

"\ xef \ xac \ x81"は、"fi"の同義語ではなく、"fi"です。文字を近づけるのは手伝いです。だから、あなたは、単にそれらの文字を除外する場合:

unicode(someoddstring, errors='ignore').encode('ascii') 

、または任意のUnicode文字を置換文字列は「Fiの」とその配列の置換を行う以外/してみてくださいを。

EDIT: 文字エンコーディングが期待通りに働いていると「Fiあり」ASCII文字ではなく、常にエスケープ形式で表現されますので、文字列でそのように格納する必要があります。

あなたは、単に[文字列、文字列]の形式で一覧印刷をしたい場合:

print "[", 
for i in oddList: 
    print i + ",", 
print "]" 
+0

"\ xef \ xac \ x81"の代わりに私のリストに 'fi'を入れたい – kholidfu

+1

それを得ることはできません。それらの符号化は「fi」を表す。 「fi」自体はアスキー文字ではなく、したがってデータ「fi」がリスト内に正しく表されている。すべてが正しく機能しています。あなたが単にリストを印刷したい場合は、編集を参照してください。 – platinummonkey

+0

@sopier本当にそこにあります。それはちょうど別の方法で表されます。 – glglgl

関連する問題