質問

でこの一節につまずいた ジャンゴのチュートリアル:

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

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

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

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

役に立ちましたか?

解決

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 ビルドを使用していて、基本多言語プレーン外の文字を処理する必要がある場合は、間違った操作を行うことになりますが、それでも非常にまれであり、本当に追加の文字が必要なユーザーはワイド ビルドをコンパイルする必要があります。

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

はい、それは全くの間違いです。公平を期すために言うと、このチュートリアルはかなり古いものだと思います。Unicode 3.1 (基本多言語面の外に文字を導入したバージョン) ではないにしても、おそらくワイド Unicode 文字列よりも古いものと考えられます。

Windows では、特に NT が内部で使用する UTF-16LE エンコーディングを意味する用語として「Unicode」を使用する習慣に起因する、さらなる混乱の原因があります。Microsoftland の人々は、このやや誤解を招きやすい習慣をよく真似するかもしれません。

他のヒント

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

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

から UTF-8 のウィキペディア:

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

つまり、Unicode の領域内でどの文字を表現したいかに応じて、1 ~ 4 バイトの間の値になります。

Unicode に関するウィキペディアより:

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

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

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top