34

私はDjangoチュートリアルでこの一節に出くわしました:

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

さて、afaik Unicodeは特定の表現ではないので混乱しています。では、Pythonの「Unicode文字列」とは何ですか?それはUCS-2を意味しますか?グーグルは大胆に述べているこの「PythonUnicodeチュートリアル」を見つけました

Unicodeは、世界の一般的な書記体系すべてをカバーする2バイトのエンコーディングです。

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

4

5 に答える 5

52

Pythonの「Unicode文字列」とは何ですか? UCS-2ということですか?

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

通常は気にする必要はありません。Unicode コードポイントは文字列内の単一の要素として表示され、それらが 2 バイトまたは 4 バイトとして格納されているかどうかはわかりません。UTF-16 ビルドを使用していて、Basic Multilingual Plane の外で文字を処理する必要がある場合、Doing It Wrong になりますが、それでも非常にまれであり、余分な文字が本当に必要なユーザーは、ワイド ビルドをコンパイルする必要があります。

明らかに間違っていますか?

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

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

于 2009-02-07T00:54:09.373 に答える
9

その間、私はPythonの内部表現とは何か、またその限界は何かを検証するために洗練された調査を行いました。「The Truth About Unicode In Python」は、Python 開発者から直接引用した非常に優れた記事です。どうやら、コンパイル時のスイッチに応じて、内部表現は UCS-2 または UCS-4 のいずれかになります。ジョン、それはUTF-16ではありませんが、あなたの答えはとにかく私を正しい軌道に乗せました、ありがとう。

于 2008-08-22T12:32:59.170 に答える
0

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

于 2008-08-22T12:03:47.807 に答える
-1

UTF-8に関するウィキペディアから:

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

したがって、Unicodeの領域内で表現する文字に応じて、1バイトから4バイトの間のどこかになります。

Unicodeに関するウィキペディアから:

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

したがって、世界のほとんど(すべてではない)の書記体系を表すことができます。

これがお役に立てば幸いです:)

于 2008-08-22T12:10:14.077 に答える
-2

Pythonの「Unicode文字列」とは何ですか?

Python は、文字列が Unicode であることを「認識」しています。したがって、正規表現を実行すると、どれが文字でどれがそうでないかがわかるため、非常に役立ちます。strlen を実行した場合も、正しい結果が得られます。例として、Hello で文字列カウントを行った場合、5 を取得します (Unicode であっても)。しかし、外国語の文字列カウントを行い、その文字列が Unicode 文字列ではなかった場合、はるかに大きな結果が得られます。Pythong は、Unicode 文字データベースからの情報を使用して、Unicode 文字列内の各文字を識別します。それが役立つことを願っています。

于 2008-08-22T12:32:04.383 に答える