ホームページ > バックエンド開発 > Python チュートリアル > Lao Qi から Python の不正な文字エンコーディングを学ぶ

Lao Qi から Python の不正な文字エンコーディングを学ぶ

WBOY
リリース: 2016-06-16 08:41:35
オリジナル
1145 人が閲覧しました

プログラミングにおける文字エンコーディングは、学習者をさらに憂鬱にするものです。たとえば、str がすべて英語であれば、説明がはるかに簡単になります。しかし、私たちが使わなければならないのは中国語ではありません。したがって、初心者でも文字コードの問題を理解し、解決できる必要があります。

>>> name = '老齐'
>>> name
'\xe8\x80\x81\xe9\xbd\x90'
ログイン後にコピー

プログラミング中に上記の状況に遭遇したことがありますか?一番下の行に何が印刷されているかわかりますか?人の英語を読んだほうがずっと良いです

>>> name = "qiwsir"
>>> name
'qiwsir'
ログイン後にコピー

これは中国語のせいですか?どうやら転生は本当に技術的な仕事のようです。はい、転生は技術的な仕事ですが、上記の問題は中国人のせいではありません。

エンコーディング

エンコードとは何ですか?これはかなり謎めいた質問です。共通の定義を与えるのも簡単ではありません。何かの教科書で定義を見たことがありますが、彼の定義が間違っているとはあえて言いません。少なくとも理解するのは簡単ではありません。

古代の戦争では、攻撃するには太鼓を叩き、撤退するには金を支払いました。兵士に伝えられる命令は、「攻撃せよ」という命令など、他の特定の形式に相当します。そのような情報が送信された後は、次のようになります。

酋長が攻撃命令を出し、使者がその命令をドラムの音にエンコードします (もっと複雑な場合、どのように攻撃するか、ドラムの音はいくつかありますか?)。

太鼓の音は、使者の喉が轟く音よりも空気中に広がり、遠くまで伝わります。一般に、太鼓の音をいびきの音だと考える兵士はいません。これが、「攻撃」コマンドをドラムビートにエンコードすることの利点です。
兵士たちは太鼓の鼓動を聞くとメッセージを受け取り、訓練を受けているか、誰かから言われていれば、私が攻撃するべきだと分かります。このプロセスはデコードです。したがって、2 セットのコーディング スキームが存在します。 1 つのセットはメッセージの送信側にあり、もう 1 つのセットはメッセージの受信側にあります。解読後、兵士たちは理解し、行動を起こしました。
上記のプロセスは比較的簡単です。実際、実際のエンコードおよびデコードのプロセスはさらに複雑です。ただし、原理は似ています。

遠いところにあるように見えますが、少し前まで実際に人々によって使用されていたものの例を挙げてください: 電信

コードをコピー コードは次のとおりです:
電信は通信サービスの一種で、19 世紀初頭に発明され、通信に電気を使用する最も初期の方法です。電信はニュースの流通を大幅に加速し、産業社会の重要な発明の 1 つでした。初期の電信は陸上でのみ通信できましたが、その後、海底ケーブルが大洋横断サービスを実行するために使用されました。 20 世紀初頭までに無線電信が使用され始め、基本的に地球上のほとんどの地域に電信サービスが届くようになりました。電信は主にテキスト メッセージの送信に使用され、電信技術を使用して画像を送信することをファックスと呼びます。

中国初の電信線は、1871 年にイギリス、ロシア、デンマークによって香港から上海を経由して日本の長崎まで敷設された海底ケーブルでした。清政府の反対により、ケーブルは上海に上陸することを禁止された。その後、デンマークの会社は政府の禁止を無視して上海公民館まで回線を導き、6月3日から電報の送受信を開始した。最初の独自敷設路線としては、福建省総督の丁立昌によって台湾に建設され、1877 年 10 月に台南と高雄を結ぶ路線が完成しました。 1879 年、北洋大臣の李鴻章は軍事通信のために天津、大沽、北塘の間に電信線を設置しました。 1880年、李鴻章は盛玄淮を総局とする総電信局の設立を承認した。 1881年12月、天津から上海までの電信が開通した。李鴻章氏は、「過去5年間、我が国は河川沿いの省や沿岸部に1万マイル以上の電線を敷設してきた。国家はあまり支出しておらず、巨額の資金は民間部門から来ている」と述べた。当時、法務官が挑発し、将軍が軍事状況を報告し、裁判所が指示を伝え、そのすべてが実行された。古代以来、中国はこれほど迅速に軍隊を使用したことはありません。何千マイルも離れた使節と大臣の交流は、同じ中庭に住んでいるようなもので、外敵の侵入を防ぐだけでなく、国防を強化し、ビジネスにも有利になります。ゲンジ。 1887年、台湾総督の劉明伝は福州から台湾まで中国初の海底ケーブルを敷設した。 1884年、北京電信局の建設が始まり、「通州から首都まで複線を設置し、一方の端を官信を配達するために局内に導き、もう一方の端を便宜のために場所を選択するために使用する」という方法が採用されました。同年8月5日、電信線の建設が始まり、すべての電柱が赤く塗られた。 8月22日、北京市崇文門外街西側のXique Hutongに市外商業電信局が開設された。同年8月30日、崇文門の宝子河の西に位置し、官電の送受信を専門とする魯公堂が開業した。
電信部門では漢字を伝えるために、4桁の数字またはローマ字3文字からなるコード、すなわち中国電信コードを用意し、送信前に漢字を電信コードに書き換えてから電信コードを書き換えるという方式をとっていました。電報を受け取った後、漢字に変換します。
読者の皆様、電信で使用される「中国語電信コード」が登場することに注意してください。これは、中国語の文字を電信で送信できるように、漢字をアラビア数字に対応させる一種のコードです。

1873年、中国駐在フランス人ウィキジェは、『康熙字典』の急進配列法に基づいて常用漢字6,800字以上を選定し、初の漢字コードブック『新電書』を編纂した。
電信の暗号はモールス信号と呼ばれ、英語ではモールス信号

となります。

モールス信号(英語: Morse Code )は、英語の異なる文字、数字、句読点を異なる配列で表現した、オンとオフの信号符号です。 1836年にアメリカ人のサミュエル・モースによって発明されました。
モールス信号はデジタル通信の初期の形式ですが、0 と 1 の 2 つの状態のみを使用する現代のバイナリ コードとは異なります。そのコードには、ドット (.)、ダッシュ (-)、および各文字間のスペースの 5 種類が含まれます。短いポーズ (点とダッシュの間のポーズ)、各単語の間の中程度のポーズ、文間の長いポーズ
電信オペレーターは技術的な仕事であり、休止の長さによって意味が異なるようです。ああ、ところで、「The Wave That Never Dies」という古い映画がありますが、それを見るまでは分からないでしょうが、電信がどのようにエンコードされるかについてさえ言及していません。

モールス信号は、1999 年まで海上通信の国際標準として使用されていました。 1997 年、フランス海軍がモールス信号の使用を中止したとき、最後に送られたメッセージは「皆さん、これが永遠の沈黙の前の最後の叫びです!」でした。

長いこと見つめていましたが、この2行は同じではないでしょうか?

気にしないでください。とにかく、これはコーディングです。

コンピュータの文字エンコーディング

まず、Wikipedia の文字エンコーディングの説明をコピーします:

コードをコピー コードは次のとおりです。 文字コード(英語: Character encoding)と文字セットコードは、文字内の文字をエンコードします。テキストをコンピュータに保存し、通信ネットワーク経由で送信できるようにする、指定されたオブジェクトのコレクション (ビットのパターン、自然数のシーケンス、オクテットのグループ、電気パルスなど) に設定されます。一般的な例には、ラテン文字をモールス信号や ASCII にエンコードすることが含まれます。その中で、ASCII は文字、数字、その他の記号に番号を付け、この整数を表すために 7 ビットのバイナリを使用します。通常、1 バイトでの格納を容易にするために追加の拡張ビットが使用されます。
コンピューター技術の初期には、ASCII (1963 年) や EBCDIC (1964 年) などの文字セットが徐々に標準になってきました。しかし、これらの文字セットの限界はすぐに明らかになり、それを拡張するための多くの方法が開発されました。東アジアの CJK 文字ファミリーを含む書記体系をサポートするという要件では、より多くの文字をサポートできるため、これらの文字のエンコードに対してその場限りではなく体系的なアプローチが必要になります。
世の中には、さまざまな文字コードが存在します。ただし、彼らはそれを自分たちだけで行うわけではありません。むしろ、ASCII と呼ばれるエンコーディングに基づく特定の基盤が必要です。これには北朝鮮も含まれるはずです (彼らがどのような文字エンコーディングを使用しているかは知りませんが、真剣に考えないでください)。はこの教科書の立場を表すものではなく、単に盲目的な想像を表すものです。)
ASCII (発音: 英語発音: /ˈæski/ ASS-kee1、American Standard Code for Information Interchange、American Standard Code for Information Interchange) は、ラテン文字に基づくコンピューターコーディングシステムです。主に現代英語の表示に使用されますが、その拡張バージョン EASCII は他の西ヨーロッパ言語を部分的にサポートでき、国際標準 ISO/IEC 646 と同等です。 World Wide Web により ASCII が広く使用されるようになり、2007 年 12 月までに徐々に Unicode に置き換えられました。

上の引用文で述べたように、現在私たちが使用しているコーディング標準は ASCII ではありません。私が大学にいたとき、私の先生はまだ ASCII を教えていました (最も恥ずかしいのは、あなたの国の大学教育です。私は大学卒業生に何人かインタビューしました。)数日前、コンピュータ専攻の彼は、先生がコーディング標準だと教えてくれたと私に言いました。先生を葬らないで、教科書を読んでください、と彼は本当に私にテキストメッセージを送りました。教科書に載っていると私は言いました)、時代が変わり、Unicodeになったので、Unicodeエンコードとは何ですか? Wikipedia から説明をコピーしてみます (この講義は qiwsir ではなく Wikipedia が行っていることを説明する必要があります。私は単なる脇役です、笑)

Unicode (中国語: Universal Code、International Code、Unicode、Unicode) は、コンピューター サイエンスの分野における業界標準です。これは、世界中のほとんどの書記体系を体系化してコード化し、コンピュータがより簡単な方法でテキストを表示および処理できるようにします。

Unicode は、ユニバーサル文字セットの標準に基づいて開発され、本の形で出版されました。 Unicode は今日に至るまで継続的に改訂されており、バージョンが変わるたびにさらに新しい文字が追加されています。最新バージョンは 7.0.0 で、100,000 文字を超える文字が登録されています (100,000 文字は 2005 年に採用されました)。 Unicode でカバーされるデータには、視覚的なグリフ、エンコード方式、標準の文字エンコードに加えて、大文字と小文字などの文字特性も含まれます。

名前を聞いてください: Universal Code、中国語が含まれている必要があります。確かに。ただし、Unicode だけでは十分ではありません。なぜなら... (ここではいくつかの単語が省略されています。読者は上記の Wikipedia リンクにアクセスして確認できます)、他のエンコード実装方法もあり、Unicode 実装方法は Unicode Transformation Format と呼ばれます。 (略してUTF)ということで、よく見かけるutf-8があります。

utf-8 とは何ですか? ウィキペディアで何と書かれているか見てみましょう

コードをコピー コードは次のとおりです。
UTF-8 (8 ビット Unicode Transformation Format) は、可変長文字です。 Unicode エンコーディングもプレフィックス コードです。 Unicode 標準の任意の文字を表すために使用でき、そのエンコーディングの最初のバイトは ASCII と互換性があるため、ASCII 文字を処理する元のソフトウェアをそのまま、またはわずかな変更のみで引き続き使用できます。したがって、電子メール、Web ページ、およびテキストを保存または送信するその他のアプリケーションでは、このエンコーディングが徐々に推奨されるようになりました。
引用は不要です。もっと見たい場合は、原文にアクセスしてください。

先ほどプログラムを書いていたときに、coding: utf-8 という言葉が出てきました。これは、使用したい文字エンコーディングを Python に伝えます。

エンコードとデコード

歴史の部分は終わったので、次は何でしょうか?それはもっと面倒です。だって、どう言っても一言で明確に説明できないからです。 2 つの組み込み関数 encode() と decode() から始めましょう。

codecs.encode(obj[,encoding[,errors]]):エンコード用に登録されたコーデックを使用して、obj をエンコードします。
codecs.decode(obj[,coding[,errors]]):エンコード用に登録されたコーデックを使用して、obj をデコードします。
python2 のデフォルトのエンコーディングは ascii です。オブジェクトのエンコーディングは、encode によって指定されたエンコーディング形式に変換できます。デコードは、このプロセスの逆のプロセスです。

理解するために実験を行ってください:

コードをコピーします コードは次のとおりです:
>>> a = "中"
>>> タイプ(a)
<「str」と入力>
>>>
'xe4xb8xad'
>>>レン(a)
3

>>> b = a.decode()
>>> u'u4e2d'
>>> タイプ(b)
<「unicode」と入力>
>>>レン(b)
1

この実験が行われる前は、裁判官はそれほど混乱していなかったかもしれませんが(彼は知らなかったし、知れば知るほど混乱したため)、実験が行われた後は彼自身も混乱しました。焦らずに、時間をかけてコーディングの問題を理解してください。現時点で理解できない場合は、要件に従って実行することに注意してください。突然悟りを開くだろう。
上記の実験では、変数 a は文字列を参照します。いわゆる文字列 (str) は厳密にはバイト文字列であり、エンコードされたバイトのシーケンスです。つまり、上記の実験で表示されるのは、コンピューター内でエンコードされた後の単語「中」のバイト表現です。 (バイトについては、読者はグーグルで調べてください)。 len(a) を使用して、3 バイトからなるその長さを測定します。

次に、decode 関数を使用してバイト文字列を文字列に変換し、この文字列は Unicode に従ってエンコードされます。 Unicode エンコードでは、1 つの漢字が 1 つの文字に対応し、その長さは 1 です。

逆に、Unicode でエンコードされた文字列をバイト文字列に変換することもできます。

コードをコピー コードは次のとおりです。>>> c = b.encode('utf-8')
>>>c
'xe4xb8xad'
>>> タイプ(c)
<「str」と入力>
>>> c == a
本当
コーディングの問題については、まずここでやめましょう。言い続けると問題が起きるからです。読者はその理由がまだ分からず不満を抱いているに違いない。関係ないのでググってみたら解決しますよ。

Python で漢字が文字化けしないようにする方法

この質問は高度に操作性の高い質問です。参考までに、経験の概要をここに共有します:

まず、utf-8 エンコーディング スキームはプラットフォーム間で優れているため、使用することをお勧めします。

経験 1: 冒頭のステートメント:

# -*- コーディング: utf-8 -*-

友人が私に、-*- の機能は何なのかと尋ねました。プログラマーはもちろん、誰もが見た目を良くするためのものです。もちろん、次のように書くこともできます:

#コーディング:utf-8

経験 2: 文字 (セクション) 文字列を見つけたら、str() を使用せず、直接 unicode() を使用してください

unicode_str = unicode('中国語', エンコーディング='utf-8')

print unicode_str.encode('utf-8')
経験 3: ファイルを操作する場合、open の代わりに codecs.open を使用するのが最善です (これについては後で説明しますが、最初にここに置きます)

コーデックをインポート
codecs.open('ファイル名', エンコーディング='utf8')
インターネット上の記事も集めました。これも読者におすすめします: Python2.x の中国語表示方法

最後に、Python3 を使用している場合は、不正なコーディングの問題を心配する必要はありません。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート