2011-07-05 6 views
0

私は単純なファイルパーサーとライターを書いたが、その後ユニコードの重要性について話をした記事が出てきて、入力ファイルがASCIIコードであると仮定しているそれは私の状況ではまれではあるが、常にそうではないかもしれない。PythonでUTF-8に似たパーサーを書く

これらのまれなケースでは、私はUTF-8エンコードファイルを期待しています。

読み書き方法を変更するだけで、UTF-8ファイルを操作する方法はありますか?私がストリングを使って行うことは、それらを保管してから書き出すことなので、私はそれらを読んだり、保管したり、正しく書き込んだりすることができます。

さらに、asciiファイルとUTF-8ファイルを別々に扱い、それぞれ別々の関数を書く必要がありますか?私はまだASCIIファイル以外のものを扱っておらず、ユニコードの扱いについてしか読んでいません。

+2

ASCIIはUTF-8のサブセットであるため、2組のコードは必要ありません。 –

答えて

3

PythonはネイティブでUnicodeをサポートします。最初のファイルから2番目のファイルに直接読み書きすると、バイトをそのままコピーするので、データは失われません。ただし、文字列をデコードしてから再エンコードする場合は、正しいエンコードを使用する必要があります。

3

Python 2を使用している場合は、strオブジェクトをすべてunicodeオブジェクトに変更するだけで済みます。 Unicodeオブジェクトはすべて文字列と同じメソッドを持ちますが、ASCIIではなくUnicode形式でエンコードされます。 http://docs.python.org/library/functions.html#unicodeを参照してください。

Python 3を使用している場合、文字列はデフォルトでUTF-8でエンコードされます。

+3

'unicode'オブジェクトはユニコード文字のシーケンスです。 UTF-8やその他のエンコーディングではエンコードされません。 – geoffspear

+0

@Wooble:技術的には、Py_UNICODEエンコーディングでエンコードされています。これは、実装によっては、UCS-2またはUCS-4のいずれかになります。 – JAB

+0

申し訳ありませんが、私は精度のために投稿を編集します。しかし、それは答えの文脈で比較的小さい詳細です。 –

2

Python 2.6以降を使用している場合は、ioライブラリとそのio.openメソッドを使用して、必要なファイルを開くことができます。あなたのケースでは'utf-8'に設定する必要があるencoding引数があります。返されたファイルオブジェクトを読み書きすると、文字列は自動的にエンコード/デコードされます。

UTF-8はASCIIのスーパーセットなので、ASCII用に特別な処理を行う必要はありません。

0

ファイルを読み書きするだけで、他の種類のエンコードされた入力を期待しない限り、特別な操作は必要ありません。

% cat /tmp/u 
π is 3.14. 

% file /tmp/u 
/tmp/u: UTF-8 Unicode text 

% cat f.py 
f = open('/tmp/u', 'r') 
d = f.read() 
print d.split() 
f.close() 

% python f.py 
['\xcf\x80', 'is', '3.14.'] 

これは、UTF-8を使用して標準入力を宣言または受け入れると変更されます。 (上記SyntaxError例外によって参照)PEP 263当たり初めにPythonプログラムのための符号化を宣言、適切にこれを処理する

% cat g.py 
s = 'π is 3.14.' 
print s.split() 

% python g.py 
    File "g.py", line 1 
SyntaxError: Non-ASCII character '\xcf' in file g.py on line 1, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details 

% cat h.py 
# -*- coding: utf-8 -*- 
s = 'π is 3.14.' 
print s.split() 

% python h.py 
['\xcf\x80', 'is', '3.14.'] 
関連する問題