Python Unicode 文字列フォーマットの落とし穴
今日、同僚の不可解な UnicodeDecodeError の調査を手伝っていたときに、Python の文字列フォーマットに小さなトラップがあることを発見しました。ここに記録します。元のコードは複雑すぎて、問題に関係のないものが多すぎたので、ipython での簡単なテストを通じて問題を再現しました。プロセスは次のとおりです:
In [4]: a = '你好世界' In [5]: print 'Say this: %s' % a Say this: 你好世界 In [6]: print 'Say this: %s and say that: %s' % (a, 'hello world') Say this: 你好世界 and say that: hello world In [7]: print 'Say this: %s and say that: %s' % (a, u'hello world') --------------------------------------------------------------------------- UnicodeDecodeError Traceback (most recent call last) /home/jerry/ in () UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 10: ordinal not in range(128) In [8]: a Out[8]: '\xe4\xbd\xa0\xe5\xa5\xbd\xe4\xb8\x96\xe7\x95\x8c'
In [7] の後に奇妙な UnicodeDecodeError が表示されたことがありますか?前の文との唯一の違いは、「hello world」が str オブジェクトではなく unicode オブジェクトになることです。しかし問題は、「hello world」は ASCII 以外の文字を含まない単純な英語の文字列であるということです。これをデコードできないのはなぜでしょうか。例外に添付されたメッセージをよく見てください。これは明らかに「hello world」ではないので、[8] で出力された中国語の文を疑うしかありません。それはともかく、最初のものは 0xe4 です。
Python は文字列をフォーマットするときに を Unicode オブジェクトにデコードしようとし、デコードするときに実際の UTF-8 エンコードではなくデフォルトの ASCII エンコードが使用されるようです。どうしたの? ?実験を続けましょう:
In [9]: 'Say this: %s' % 'hello' Out[9]: 'Say this: hello' In [10]: 'Say this: %s' % u'hello' Out[10]: u'Say this: hello'
よく見てください、In [9] の 'hello' は通常の文字列であり、結果も文字列 (str オブジェクト) ですが、In [10] の 'hello' は unicode オブジェクトになります。フォーマットされた結果も Unicode になります (結果の先頭にある u に注意してください)。
真実は次のとおりです: Python には文字列をフォーマットするときにいくつかの隠されたトリックがあります。%s に対応するパラメーターに Unicode がある場合、最終結果も Unicode になります。この場合、%s パラメータ内のテンプレート文字列とすべての str は Unicode にデコードされますが、このデコードは暗黙的であり、Python が使用できる文字セットはデフォルトの ASCII のみを使用できます。その中に非 ASCII エンコード文字列が含まれている場合は、それで終わりです...
Python ドキュメントの内容を見てください:
If format is a Unicode object, or if any of the objects being converted using the %s conversion are Unicode objects, the result will also be a Unicode object.
コード内に str と unicode が混在している場合、この種の問題が簡単に発生する可能性があります。私の同僚のコードでは、中国語の文字列はユーザーによって入力され、正しくエンコードされています。これは UTF-8 でエンコードされた str オブジェクトですが、その内容はすべて ASCII コードですが、そのソースは次のとおりです。 sqlite3 データベース クエリと sqlite API によって返される文字列はすべて Unicode オブジェクトであるため、このような奇妙な結果が生じます。
Python 2 の str と unicode は本当に不正行為であり、私はそれらによって何度か被害を受けました。 Python 3 はこの点で大幅な改善を行っており、完全に普及することを期待しています。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











PHPは主に手順プログラミングですが、オブジェクト指向プログラミング(OOP)もサポートしています。 Pythonは、OOP、機能、手続き上のプログラミングなど、さまざまなパラダイムをサポートしています。 PHPはWeb開発に適しており、Pythonはデータ分析や機械学習などのさまざまなアプリケーションに適しています。

PHPはWeb開発と迅速なプロトタイピングに適しており、Pythonはデータサイエンスと機械学習に適しています。 1.PHPは、単純な構文と迅速な開発に適した動的なWeb開発に使用されます。 2。Pythonには簡潔な構文があり、複数のフィールドに適しており、強力なライブラリエコシステムがあります。

PHPは1994年に発信され、Rasmuslerdorfによって開発されました。もともとはウェブサイトの訪問者を追跡するために使用され、サーバー側のスクリプト言語に徐々に進化し、Web開発で広く使用されていました。 Pythonは、1980年代後半にGuidovan Rossumによって開発され、1991年に最初にリリースされました。コードの読みやすさとシンプルさを強調し、科学的コンピューティング、データ分析、その他の分野に適しています。

Pythonは、スムーズな学習曲線と簡潔な構文を備えた初心者により適しています。 JavaScriptは、急な学習曲線と柔軟な構文を備えたフロントエンド開発に適しています。 1。Python構文は直感的で、データサイエンスやバックエンド開発に適しています。 2。JavaScriptは柔軟で、フロントエンドおよびサーバー側のプログラミングで広く使用されています。

PythonコードをSublimeテキストで実行するには、最初にPythonプラグインをインストールし、次に.pyファイルを作成してコードを書き込み、Ctrl Bを押してコードを実行する必要があります。コードを実行すると、出力がコンソールに表示されます。

Visual Studioコード(VSCODE)でコードを作成するのはシンプルで使いやすいです。 VSCODEをインストールし、プロジェクトの作成、言語の選択、ファイルの作成、コードの書き込み、保存して実行します。 VSCODEの利点には、クロスプラットフォーム、フリーおよびオープンソース、強力な機能、リッチエクステンション、軽量で高速が含まれます。

VSコードはPythonの書き込みに使用でき、Pythonアプリケーションを開発するための理想的なツールになる多くの機能を提供できます。ユーザーは以下を可能にします。Python拡張機能をインストールして、コードの完了、構文の強調表示、デバッグなどの関数を取得できます。デバッガーを使用して、コードを段階的に追跡し、エラーを見つけて修正します。バージョンコントロールのためにGitを統合します。コードフォーマットツールを使用して、コードの一貫性を維持します。糸くずツールを使用して、事前に潜在的な問題を発見します。

メモ帳でPythonコードを実行するには、Python実行可能ファイルとNPPEXECプラグインをインストールする必要があります。 Pythonをインストールしてパスを追加した後、nppexecプラグインでコマンド「python」とパラメーター "{current_directory} {file_name}"を構成して、メモ帳のショートカットキー「F6」を介してPythonコードを実行します。
