2016-06-15 35 views
0

Python 2.7の文字列スライシングは、部分文字列を取得するのに非常に便利です。これは、ASCII文字のためにうまく動作例えばアクセント付き文字の文字列スライシングが無効

>>> s = "Antonio" 
>>> s[5:7] 
'io' 

が、アクセント付き文字の存在下では失敗し、例えば

>>> s = "António" 
>>> s[5:7] 
'ni' 

かかわらず、文字の正しい部分文字列を取得するための安全な方法は何であります元の文字列ですか?私の構成情報は以下の通りです

UPDATE:

Python 2.7.11 (v2.7.11:6d1b6a68f775, Dec 5 2015, 12:54:16) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin 

感謝のPython 2.7では

+0

を書いたデレクのDohlerへ

import codecs with codecs.open(ficheiro, encoding='utf-8') as fin: for line in fin: ... # then here line[5:7] will work correctly for "António" and "Antonio" 

ありがとう:私はちょうどこのようなテキストファイルを読み込む必要があります。 ''António "[5:7]' '' io "' –

+0

Python 2やPython 3?また、これを正しく実行して解決策を理解するには、「文字」が何であるかを正確に読み取る必要があります。 [Unicodeのよくある質問](http://unicode.org/faq/char_combmark.html)は、特に「[どのように文字がカウントされているか」](http://unicode.org/faq/ char_combmark.html#7)。 – user2357112

+0

@ user2357112いいリンク。しかし、文字を正しくカウントし、正しい部分文字列を取得するためのPython 2.7.11 APIは何ですか? 'open(file、mode = 'rU')で開いたファイルから行を読むことに注意してください。 – mljrg

答えて

2

は、文字列とUnicode文字列は異なるオブジェクトです。リテラルUnicode文字列を宣言するには、uを前に付け:私はようやく私の問題への答えを見つけた

Python 2.7.10 (default, Oct 23 2015, 19:19:21) 
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.59.5)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> s = "António" 
>>> len(s) 
8 
>>> s2 = u"António" 
>>> len(s2) 
7 
>>> s[5:7] 
'ni' 
>>> s2[5:7] 
u'io' 
+0

okですが、文字列がファイルから読み取られた行の場合はどうなりますか?私はあなたが示唆することはできません。その行をUnicodeに変換する方法はありますか? 'open(file、mode = 'rU')' – mljrg

+1

これは、文字を組み合わせても予期しない結果が生じることがあります。もし '' o ''が普通の '' o''と '' acute acent ''を組み合わせていれば '' len'とスライスの2つの文字として表示されます。 – user2357112

+0

まあ、Python 2.xのUnicodeには問題があります。ファイルデータを扱うときは、エンコーディングの内容を知り、そのエンコーディング(ディスク上)からUnicode(メモリ内)にデコードする必要があります。私が読んだ最も明白な説明はNed Batchelderの「Pragmatic Unicode」です - http://nedbatchelder.com/text/unipain.html – bgporter

関連する問題