わかりません:
'ô TRAM'.upper() != 'Ô TRAM'
'ô TRAM'.upper() == 'ô TRAM'
すべてのテキスト エディタ (vim
およびを含むemacs
) は、大文字を要求すると、'ô TRAM'.upper() を 'Ô TRAM' に変換します。Python が [a-zA-Z] 文字のみを大文字にしているように見えるのはなぜですか? そして、回避策は何ですか?
デフォルトで Unicode を使用する Python 3 では、動作するはずです。
Python 2 では、強制する必要があります。これでうまくいきます。
u'ô TRAM'.upper()
u
テキストが ASCII に変換されないようにします。(ユニコードのまま)
@Thanakon が簡単に指摘したことは正しいです。Unicode Stringでこれを行うことができます。
ただし、Pythonが「狭い」文字列でこれを行わない理由を尋ねました。その理由は次のとおりです。Unicode は、メモリと処理の点で非常に大きなものです。それは決して些細なことではありません。Unicodeの定義またはICU ライブラリの実装を参照してください。
Python が考案された 90 年代初頭には、文字列の Unicode はまだ大きな問題ではありませんでした。Python コミュニティにとって、下位互換性は常に大きな懸念事項でした。したがって、一部の 2.x バージョンで「狭い文字列のユニコード大文字化」を行うことは非常に困難でした。
しかし、他の人々は 2000 年代にこの解決策に満足できなかったため、新しいデータ型を発明しましたunicode
。そこにデータを入れると、本格的な Unicode 機能が得られます。あなたの便宜のために他のモジュールもあります...
ああ、ちなみに、あなたが示した狭い文字列は、ユニコード風に大文字にする前に、コードページで解釈する必要があります。ここに表示される文字列は、多くのエンコーディング解釈の1 つです (ISO-8859-1 かな?)
しかし、今は良いことです: Python 3では、後方互換性を壊す価値があると判断しました。デフォルトの文字列はUnicode 文字列です。Python 3 で書く'hello'
と、 Python 2 と同じですu'hello'
。その上で、Unicode 機能を利用できます。
いずれにせよ、Python 2u'blah'
または Python 3 では'blah'
、python-file がUTF-8 (または同様のもの) で保存されていることを確認する必要があります。Python 3 では -files の標準エンコーディングです*.py
。Python 2 では、ファイル エンコーディングを含むヘッダー行を追加 # -*- coding: utf-8 -*-
するか、エディタでUTF-8 BOM マークを書き込む必要があります。
質問に としてタグを付けunicode
ましたが、文字列をユニコードにしたことはありません:
>>> print u'ô TRAM'.upper()
Ô TRAM
>>> print 'ô TRAM'.upper()
ô TRAM