2008-08-22 8 views
28

私はDjango tutorialにこの一節つまずい:UnicodeとPython/DjangoでのUTF-8の混乱?

Djangoのモデルは ユニコード()を呼び出し、UTF-8バイト文字列に変換し、結果をデフォルト STR()メソッドを持っています。これは、unicode(p)がUnicode文字列を返し、str(p)が文字列がUTF-8としてエンコードされた通常の文字列を返すことを意味します。

afaikユニコードは特別な表現ではないので、私は混乱しています。したがって、Pythonでは「Unicode文字列」とは何ですか?それはUCS-2を意味しますか? this "Python Unicode Tutorial"を上げグーグルで大胆にUnicodeは、世界の共通記述システムのすべてをカバーして2バイトのエンコーディングです

を述べています。

これは間違っているのですか?私は文字セットとエンコーディングの問題で何度も混乱してきましたが、ここで私が読んでいるドキュメントは混乱していると確信しています。誰かが私に「Unicode文字列」を与えるとき、Pythonで何が起こっているのかを知っていますか?

答えて

47

Pythonで「Unicode文字列」とは何ですか?それはUCS-2を意味しますか? Pythonで

Unicode文字列は、UCS-2(固定長16ビット表現、UTF-16とほぼ同じ)、またはUCS-4/UTF-32(固定長32ビットとして内部的のいずれかで保存されています表現)。これはコンパイル時のオプションです。 Windowsでは常にUTF-16ですが、多くのLinuxディストリビューションはPythonのバージョンでUTF-32(「ワイドモード」)を設定しています。

あなたは通常、あなたの文字列にUnicodeコードポイントが1つの要素として表示され、2バイトまたは4バイトとして格納されているかどうかはわかりません。あなたがUTF-16ビルドで、Basic Multilingual Planeの外にある文字を処理する必要があるなら、それは間違っているでしょうが、それはまだ非常にまれであり、本当に余分な文字を必要とするユーザはワイドビルドをコンパイルする必要があります。

間違っているのですか?

はい、間違っています。公平になるためには、チュートリアルはかなり古いと思います。 Unicode 3.1(Basic Multilingual Planeの外に文字を導入したバージョン)ではなく、ワイドなUnicode文字列よりも前の日付になる可能性があります。

NTが内部的に使用するUTF-16LEエンコーディングを意味するために、用語 "Unicode"を使用するWindowsの習慣に起因する混乱の原因があります。 Microsoftlandの人々は、このやや誤解を招く癖があることがよくあります。

+1

他の選択された「回答」が選択されていても、この回答を投票してください。 – tzot

+0

[肩こり]両方とも正しいです。それは実際にUnicode文字列*が何であるかを定義する 'len('ΤΖΩΤΖΙΟΥ ')== 8の意味です。 – bobince

+2

私は同意しません。私はその質問を読んで、「PythonでUnicode文字列とは何か」と言う。選択された答えはランダムな文章のメッシュのように見えますが、あなたの答えはもっと重要な点です。しかし、これは私が追求しない問題です。乾杯:) – tzot

0

PythonはUnicodeをUTF-16として保存します。 str()は、UTF-16文字列のUTF-8表現を返します。 Wikipedia on UTF-8から

+1

Pythonは、プラットフォームとコンパイルオプションに応じて、Unicode文字列をUTF-16またはUTF-32として保存します。 – tzot

+0

str(unicode_string)はどのプラットフォームでUTF-8を返しますか?それを試しましたか?例えばstr(u "\ u0369") – tzot

+2

両方のカウントで間違っています。 'str(unicode_val)'は 'sys.getdefaultencoding()'に従ってエンコードします。 – Tobu

-1

UTF-8(8ビットUCS /ユニコード変換フォーマット)は、Unicodeの 可変長文字エンコーディングです。 Unicode標準の任意の文字を表すことができますが、UTF-8のバイトコードと文字割り当ての初期エンコーディングはASCIIと下位互換性があります。これらの理由から、電子メール、Webページ[1]、および文字が格納またはストリーミングされる他の場所のための好ましいエンコードになりつつあります。

これは、Unicodeの領域内でどの文字を表現したいかによって、1〜4バイトの間です。コンピューティングで

From Wikipedia on Unicode:

、Unicodeは、コンピュータが一貫してテキストを表すし、操作できるようにする業界標準は、 で、世界の書記体系のほとんどを表現しています。

世界の書記体系のほとんど(ただしすべてではありません)を表すことができます。

私はこれが役に立てば幸い:)

-2

ので、何が Pythonで "Unicode文字列" とは?

Pythonは、あなたの文字列がUnicodeであることを知っています。したがって、正規表現を行うと、どちらが文字であるかなどは分かりません。本当に役に立ちます。 strlenを実行した場合、正しい結果も得られます。 Helloの文字列カウントをした場合の例として、(Unicodeの場合でも)5が得られます。しかし、あなたが外国語の文字列カウントをした場合、その文字列はUnicode文字列ではなく、はるかに大きな結果を持っています。 Pythongは、Unicode文字データベースの情報を使用して、Unicode文字列の各文字を識別します。希望が役立ちます。

8

一方、私は洗練された研究を行って、Pythonの内部表現が何であるか、そしてその限界が何であるかを検証しました。 "The Truth About Unicode In Python"は、Python開発者から直接引用された非常に良い記事です。コンパイル時のスイッチによっては、内部表現がUCS-2またはUCS-4のいずれかであることは明らかです。だからジョン、それはUTF-16ではありませんが、あなたの答えはとにかく右のトラックに私を置く、ありがとう。