38

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

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

印刷するために私がする必要があること:

EXÁMPLE

(「a」はアキュートアクセントを取得しますが、大文字です。)

Python2.6を使用しています。

4

5 に答える 5

60

最初にASCIIに変換しないのと同じくらい簡単だと思います。

 >>> print u'exámple'.upper()
 EXÁMPLE
于 2009-04-07T20:45:53.403 に答える
10

まず、最近は python 3.1 しか使用していません。その主な利点は、Unicode オブジェクトからバイト文字列を明確にすることです。これにより、大部分のテキスト操作が以前よりもはるかに安全になります。Python 2.x のエンコーディングの問題に関する何兆ものユーザーの質問を検討した結果u'äbc、Python 2.1 の慣例は単なる間違いでした。明示的なand を使用するbytesbytearray、人生がずっと楽になります。

次に、py3k が好みでない場合は、 を使用してみてください。from __future__ import unicode_literalsこれは、python 2.6 および 2.7 での py3k の動作を模倣するためです。このことは、あなたが言ったときに行った(簡単にコミットされる)失敗を回避したでしょうprint 'exámple'.upper()。基本的に、これは py3k: と同じですprint( 'exámple'.encode( 'utf-8' ).upper() )。これらのバージョンを比較してください (py3k の場合):

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

最初のものは、基本的に、'exámple'デフォルトのエンコーディングを に設定した場合に、裸の string を使用したときに行ったことですutf-8(BDFL の宣言によると、実行時にデフォルトのエンコーディングを設定することは悪い考えであるため、py2 ではと言って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 は8 ビットの値を使用しますが、US-ASCII (US-ASCII では使用されない 128 から 255 まで) の範囲外upper()の値を使用するため、それらは の影響を受けません。その小文字を取得しáます。最後に、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') だけなので、Latin Extended-X ブロック (それらを調べてみてください。驚くべき結果が得られる可能性があります)、実際にその方法を使用する場合があります。もちろん、マッピングの正確性はチェックしていません。

最後に、py3k アプリケーションのブート セクションに入れたものを次に示しますsys.stdout。フォールバックとして数値文字参照 (NCR) を使用して、エンコーディングを再定義するメソッドです。これにより、標準出力への出力で Unicode エンコーディング エラーが発生しなくなります。私がubuntuで作業しているとき_sys.stdout.encodingutf-8; 同じプログラムを Windows で実行すると、 のような風変わりなものになる可能性がありますcp850。出力は奇妙に見えるかもしれませんが、アプリケーションはそれらの薄暗い端末で例外を発生させることなく実行されます。

#===========================================================================================================
# 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()

もう 1 つアドバイスがあります。テストするときprint repr( x )は、 の正体を明らかにするために、または同様のことを常に試みてくださいxprint xpy2だけでx、オクテット文字列またはUnicodeオブジェクトのいずれかである場合、あらゆる種類の誤解が生じる可能性があります。それは非常に不可解であり、頭を悩ませる傾向があります。私が言ったように、将来のインポートユニコードリテラルの呪文から、少なくともpy26に移行してみてください。

最後に、引用を引用して締めくくります: " Glyph Lefkowitz は、彼の記事Encodingで最もよく言っています。

この議論の文脈では、「文字列」という用語は無意味だと思います。テキストがあり、バイト指向のデータがあります (テキストをよく表しているかもしれませんが、まだ変換されていません)。Python 型では、Text は unicode です。データは str です。「非 Unicode テキスト」という考えは、発生するのを待っている単なるプログラミング エラーです。」

更新: Python 3 が見つかりました。大文字の場合、ſ LATIN SMALL LETTER LONG S が S に正しく変換されます。きちんとした!

于 2010-09-11T16:52:59.607 に答える
5

ここで欠けている背景が少しあると思います。

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

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

「ネイティブ」文字列の代わりに「unicode」文字列を使用している限り、upper()のような演算子はUnicodeを念頭に置いて動作します。FWIW、Python 3はデフォルトでユニコードを使用するため、区別はほとんど関係ありません。

文字列をtoからunicodetoにstr、そしてtoに戻すことunicodeは、多くの点で最適ではありません。多くのライブラリは、必要に応じてUnicode出力を生成します。unicodeしたがって、可能な限り、内部的に文字列のオブジェクトのみを使用するようにしてください。

于 2009-04-07T23:09:10.127 に答える