31

私は Python で作業しており、ユーザー入力 (コマンド ラインから) を Unicode 形式で読み取りたいと考えていますraw_input

また、ユニコード文字列が等しいかどうかをテストしたいのですが、標準==が機能していないようです。

4

4 に答える 4

54

raw_input()OS または UI 機能によってエンコードされた文字列を返します。難しいのは、どれがそのデコードかを知ることです。次のことを試みることができます。

import sys, locale
text= raw_input().decode(sys.stdin.encoding or locale.getpreferredencoding(True))

ほとんどの場合、これは正しく機能するはずです。

あなたを助けるために、Unicode比較が機能しないことについてのより多くのデータが必要です. ただし、それは正規化の問題かもしれません。次の点を考慮してください。

>>> a1= u'\xeatre'
>>> a2= u'e\u0302tre'

a1a2は同等ですが、等しくありません。

>>> print a1, a2
être être
>>> print a1 == a2
False

unicodedata.normalize()したがって、次の方法を使用することをお勧めします。

>>> import unicodedata as ud
>>> ud.normalize('NFC', a1)
u'\xeatre'
>>> ud.normalize('NFC', a2)
u'\xeatre'
>>> ud.normalize('NFC', a1) == ud.normalize('NFC', a2)
True

より多くの情報を提供していただければ、さらにお役に立てるかもしれません。

于 2009-01-25T10:25:54.470 に答える
16

それはうまくいくはずです。raw_inputオブジェクトを取得するには、正しいエンコーディングを使用してデコードする必要があるバイト文字列を返しunicodeます。たとえば、Python 2.5 / Terminal.app / OSX では次のように動作します。

>>> bytes = raw_input()
日本語 Ελληνικά
>>> bytes
'\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e \xce\x95\xce\xbb\xce\xbb\xce\xb7\xce\xbd\xce\xb9\xce\xba\xce\xac'

>>> uni = bytes.decode('utf-8') # substitute the encoding of your terminal if it's not utf-8
>>> uni
u'\u65e5\u672c\u8a9e \u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac'

>>> print uni
日本語 Ελληνικά

ユニコード文字列の比較について: 比較が機能しない例を投稿できますか?

于 2009-01-25T02:38:34.070 に答える
4

「Unicode形式」とはどの形式を意味するのかよくわかりませんが、いくつかあります。UTF-8? UTF-16? いずれにせよ、通常の文字列を読み取り、stringsメソッドraw_inputを使用してデコードできるはずです。decode

raw = raw_input("Please input some funny characters: ")
decoded = raw.decode("utf-8")

入力エンコーディングが異なる場合は、「utf-8」の代わりに「utf-16」などを使用してください。さまざまな種類のエンコーディングについては、コーデック モジュールのドキュメントも参照してください。

比較すると、 で問題なく動作するはず==です。特殊文字を含む文字列リテラルがある場合は、先頭に「u」を付けて、Unicode としてマークする必要があります。

if decoded == u"äöü":
  print "Do you speak German?"

これらの文字列を再度出力したい場合は、おそらく目的のエンコーディングで再度エンコードする必要があります。

print decoded.encode("utf-8")
于 2009-01-25T02:42:49.723 に答える
1

通常、Unicode 文字列を比較することはおそらく不可能です。問題は、同じ文字を構成する方法がいくつかあることです。簡単な例は、アクセント付きのローマ字です。基本的に、一般的に使用されるすべてのアクセント付き文字のコードポイントがありますが、アクセントなしの基本文字と間隔のないアクセントからそれらを構成することも正しいです。この問題は、ローマ字以外の多くのアルファベットでより重要です。

于 2009-01-25T03:20:14.640 に答える