どのように私はUnicodeはそれを印刷するために大文字に変換することができますか?

StackOverflow https://stackoverflow.com/questions/727507

質問

私はこれを持っています:

>>> print 'example'
example
>>> print 'exámple'
exámple
>>> print 'exámple'.upper()
EXáMPLE

私は、印刷するために必要なもの:

EXÁMPLE

(どこ '' が、大文字で、そのaccuteアクセントを取得します。)

私は、Python 2.6を使用しています。

役に立ちましたか?

解決

私はそれが最初のASCIIへの変換のありませんのと同じくらい簡単だと思います。

 >>> print u'exámple'.upper()
 EXÁMPLE

他のヒント

のPython 2.xでは、単に上位()を呼び出す前に、Unicode文字列に変換します。このWebページ上のUTF-8形式である、あなたのコードを、使用します:

>>> s = 'exámple'
>>> s
'ex\xc3\xa1mple'  # my terminal is not utf8. c3a1 is the UTF-8 hex for á
>>> s.decode('utf-8').upper()
u'EX\xc1MPLE'  # c1 is the utf-16 aka unicode for á

decodeへの呼び出しは、Unicodeへの現在の形式からそれを取ります。その後、エンコードを使用して、UTF-8のように、いくつかの他の形式に変換することができます。文字はで、たとえば、ISO-8859-2(この場合はチェコ、など、)だった場合は、代わりにs.decode('iso-8859-2').upper()を使用することになります。

お使いの端末は、Unicode / UTF-8に準拠していない場合、

は、私の場合のように、あなたが望むことができる最高は '(私のような)文字の16進数表現であるか、または非可逆になりs.decode('utf-8').upper().encode('ascii', 'replace')を使用して、それを変換しますEX?MPLE」。あなたのターミナルショーUnicodeを作ることができない場合は、UTF-8形式でファイルに出力を書き込み、お気に入りのエディタでそれを開きます。

最初のオフ、私はこれらの日のpython 3.1を使用します。その中央のメリットは、Unicodeオブジェクトからバイト文字列を明確化していることです。これはケースのように使用されるよりもはるかに安全テキスト操作の大半になります。 Pythonの2.xのエンコーディングの問題に関するユーザの質問の兆で計量、パイソン2.1のu'äbc規則はちょうど間違いでした。明示的なbytesbytearrayで、人生はそんなに簡単になります。

py3kがあなたの味でない場合は、

第二に、これは、Python 2.6と2.7にpy3kの行動を模倣するよう、from __future__ import unicode_literalsで行くことにしてみてください。この事はprint 'exámple'.upper()を言ったときにあなたがした(簡単にコミット)失態を避けているだろう。 print( 'exámple'.encode( 'utf-8' ).upper() ):基本的に、これはpy3kと同じです。 (py3kのため)これらのバージョンを比較します:

print( 'exámple'.encode( 'utf-8' ).upper() )
print( 'exámple'.encode( 'utf-8' ).upper().decode( 'utf-8' ) )
print( 'exámple'.upper() )

最初のものはPY2でので、あなたは(BDFLの宣告によると、実行時にデフォルトのエンコーディングを設定することは悪い考えです'exámple'ためにあなたのデフォルトのエンコーディングを設定して、裸の文字列utf-8を使用したとき、あなたが何をしたか、基本的に、ありますあなたはimport sys; reload( sys ); sys.setdefaultencoding( 'utf-8' )を言って、それをトリックする必要があります。私は、以下のpy3kのためのよりよい解決策を提示します)。あなたは、これらの3つのラインの出力を見たときます:

b'EX\xc3\xa1MPLE'
EXáMPLE
EXÁMPLE

あなたはupper()が最初のテキストに適用されてしまったとき、それがない文字で、バイトに作用することを見ることができます。 Pythonはバイトにupper()方法を可能にする、それが唯一のバイトのUS-ASCIIの解釈に定義されています。 UTF-8で使用するための値は、US-ASCIIの(128 US-ASCIIで使用されていない255まで)外の8ビットが、を、それらがされませんupper()の影響を受け、私たちは2行目に戻ってデコードするとき、我々は小文字のáことを取得します。最後に、3行目はそれが正しいん、はい、驚き、PythonはÁáに対応する大文字であることに注意しているようです。私は、大文字と小文字に変換しませんどのような文字のpython 3を参照する簡単なテストを実行します:

for cid in range( 3000 ):
  my_chr = chr( cid )
  if my_chr == my_chr.upper() and my_chr == my_chr.lower():
    say( my_chr )

リストを熟読することは、ラテン語キリル文字、またはギリシャ文字の非常に少数の発生率を明らかにする。出力のほとんどは非ヨーロッパ文字と句読点です。私はそれのpythonを見つけることができる唯一の文字が間違っていましたԤ/ԥ(\ u0524 \ u0525「キリル{キャピタル|小さな}ディセンダーを持つ文字のPE」)ので、限り、あなたは外ラテン拡張Xブロックの(滞在として)彼らは驚きをもたらす可能性がある、それらをチェックアウトし、あなたが実際にそのメソッドを使用する場合があります。もちろん、私はマッピングの正確さをチェックしませんでした。

最後に、ここで私は私のpy3kアプリケーションのブートセクションに入れものです:フォールバックなどの数値文字参照(のNCR)で、見ているエンコーディングsys.stdoutを再定義する方法。これは、標準出力に印刷がUnicodeエンコーディングエラーが発生することはありません効果があります。私はUbuntuの上で作業するとき、_sys.stdout.encodingutf-8です。同プログラムは、Windows上で動作している場合、それはcp850のような古風なものかもしれません。出力かもしれないがstarngeに見えますが、アプリケーションは、これらの薄暗い-witted端末上で例外を発生させることなく実行されます。

#===========================================================================================================
# MAKE STDOUT BEHAVE IN A FAILSAFE MANNER
#-----------------------------------------------------------------------------------------------------------
def _harden_stdout():
  """Ensure that unprintable output to STDOUT does not cause encoding errors; use XML character references
  so any kind of output gets a chance to render in a decipherable way."""
  global _sys_TRM
  _sys.stdout       = _sys_TRM = _sys_io.TextIOWrapper(
    _sys.stdout.buffer,
    encoding        = _sys.stdout.encoding,
    errors          = 'xmlcharrefreplace',
    line_buffering  = true )
#...........................................................................................................
_harden_stdout()

アドバイスのもう一つの作品:テストするとき、常にprint repr( x )またはxの身元を明らかに類似したものにしてください。あなただけPY2にprint xxはオクテット文字列またはUnicodeオブジェクトのいずれかである場合には誤解のすべての種類は、最大切り抜くことができます。ヘッドスクラッチの多くを引き起こすことが非常に不可解となりやすいです。私が言ったように、少なくとも将来のインポートユニコードリテラルの呪文からそれとpy26して移動しようとします。

と引用引用し、近隣には:「グリフレフコウィッツ特使は、エンコーディングの彼の記事で最高のことを言いますが:

  

私は信じてこの文脈で   議論は、用語「文字列」であり、   無意味。そこにテキストがあり、   bがありますYTE指向のデータ(非常によいです   ほかのテキストを表すが、まだないです   )それに変換します。 Pythonのタイプで、   テキストはUnicodeです。データがSTRです。アイデア   「非Unicodeテキスト」だけです   起こるのを待って、プログラミング・エラー。」

更新:ちょうどのpython 3が正しく大文字化時にSにLATIN SMALL LETTER LONG Sをよ変換しました。きちんとした!

私たちはここに欠けている背景のビットがあると思います:

>>> type('hello')
<type 'str'>

>>> type(u'hello')
<type 'unicode'>

限り、あなたは代わりに「ネイティブ」の文字列の「ユニコード」の文字列を使用しているように、上部のような演算子は()心の中でユニコードで動作します。 FWIW、パイソン3は違いが大きく無関係行う、デフォルトでUnicodeを使用します。

バックunicodeに続いstrとするunicodeから文字列を取ることは、多くの点で最適ではない、とあなたがそれをしたい場合は、多くのライブラリは、Unicodeの出力を生成します。その時はいつでもすることができます内部で文字列に対してのみunicodeオブジェクトを使用してみてください。

それを試してみます:

s = 'exámple'
print unicode(s).upper()
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top