プログラミングにおける文字エンコーディングは、学習者をさらに憂鬱にするものです。たとえば、str がすべて英語であれば、説明がはるかに簡単になります。しかし、私たちが使わなければならないのは中国語ではありません。したがって、初心者でも文字コードの問題を理解し、解決できる必要があります。
>>> name = '老齐' >>> name '\xe8\x80\x81\xe9\xbd\x90'
プログラミング中に上記の状況に遭遇したことがありますか?一番下の行に何が印刷されているかわかりますか?人の英語を読んだほうがずっと良いです
>>> name = "qiwsir" >>> name 'qiwsir'
これは中国語のせいですか?どうやら転生は本当に技術的な仕事のようです。はい、転生は技術的な仕事ですが、上記の問題は中国人のせいではありません。
エンコーディング
エンコードとは何ですか?これはかなり謎めいた質問です。共通の定義を与えるのも簡単ではありません。何かの教科書で定義を見たことがありますが、彼の定義が間違っているとはあえて言いません。少なくとも理解するのは簡単ではありません。
古代の戦争では、攻撃するには太鼓を叩き、撤退するには金を支払いました。兵士に伝えられる命令は、「攻撃せよ」という命令など、他の特定の形式に相当します。そのような情報が送信された後は、次のようになります。
酋長が攻撃命令を出し、使者がその命令をドラムの音にエンコードします (もっと複雑な場合、どのように攻撃するか、ドラムの音はいくつかありますか?)。
太鼓の音は、使者の喉が轟く音よりも空気中に広がり、遠くまで伝わります。一般に、太鼓の音をいびきの音だと考える兵士はいません。これが、「攻撃」コマンドをドラムビートにエンコードすることの利点です。
兵士たちは太鼓の鼓動を聞くとメッセージを受け取り、訓練を受けているか、誰かから言われていれば、私が攻撃するべきだと分かります。このプロセスはデコードです。したがって、2 セットのコーディング スキームが存在します。 1 つのセットはメッセージの送信側にあり、もう 1 つのセットはメッセージの受信側にあります。解読後、兵士たちは理解し、行動を起こしました。
上記のプロセスは比較的簡単です。実際、実際のエンコードおよびデコードのプロセスはさらに複雑です。ただし、原理は似ています。
中国初の電信線は、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 の文字エンコーディングの説明をコピーします:
上の引用文で述べたように、現在私たちが使用しているコーディング標準は ASCII ではありません。私が大学にいたとき、私の先生はまだ ASCII を教えていました (最も恥ずかしいのは、あなたの国の大学教育です。私は大学卒業生に何人かインタビューしました。)数日前、コンピュータ専攻の彼は、先生がコーディング標準だと教えてくれたと私に言いました。先生を葬らないで、教科書を読んでください、と彼は本当に私にテキストメッセージを送りました。教科書に載っていると私は言いました)、時代が変わり、Unicodeになったので、Unicodeエンコードとは何ですか? Wikipedia から説明をコピーしてみます (この講義は qiwsir ではなく Wikipedia が行っていることを説明する必要があります。私は単なる脇役です、笑)
Unicode は、ユニバーサル文字セットの標準に基づいて開発され、本の形で出版されました。 Unicode は今日に至るまで継続的に改訂されており、バージョンが変わるたびにさらに新しい文字が追加されています。最新バージョンは 7.0.0 で、100,000 文字を超える文字が登録されています (100,000 文字は 2005 年に採用されました)。 Unicode でカバーされるデータには、視覚的なグリフ、エンコード方式、標準の文字エンコードに加えて、大文字と小文字などの文字特性も含まれます。
名前を聞いてください: Universal Code、中国語が含まれている必要があります。確かに。ただし、Unicode だけでは十分ではありません。なぜなら... (ここではいくつかの単語が省略されています。読者は上記の Wikipedia リンクにアクセスして確認できます)、他のエンコード実装方法もあり、Unicode 実装方法は Unicode Transformation Format と呼ばれます。 (略してUTF)ということで、よく見かけるutf-8があります。
utf-8 とは何ですか? ウィキペディアで何と書かれているか見てみましょう
先ほどプログラムを書いていたときに、coding: utf-8 という言葉が出てきました。これは、使用したい文字エンコーディングを Python に伝えます。
エンコードとデコード
歴史の部分は終わったので、次は何でしょうか?それはもっと面倒です。だって、どう言っても一言で明確に説明できないからです。 2 つの組み込み関数 encode() と decode() から始めましょう。
codecs.encode(obj[,encoding[,errors]]):エンコード用に登録されたコーデックを使用して、obj をエンコードします。
codecs.decode(obj[,coding[,errors]]):エンコード用に登録されたコーデックを使用して、obj をデコードします。
python2 のデフォルトのエンコーディングは ascii です。オブジェクトのエンコーディングは、encode によって指定されたエンコーディング形式に変換できます。デコードは、このプロセスの逆のプロセスです。
理解するために実験を行ってください:
>>> b = a.decode()
>>>
u'u4e2d'
>>> タイプ(b)
<「unicode」と入力>
>>>レン(b)
1
次に、decode 関数を使用してバイト文字列を文字列に変換し、この文字列は Unicode に従ってエンコードされます。 Unicode エンコードでは、1 つの漢字が 1 つの文字に対応し、その長さは 1 です。
逆に、Unicode でエンコードされた文字列をバイト文字列に変換することもできます。
Python で漢字が文字化けしないようにする方法
この質問は高度に操作性の高い質問です。参考までに、経験の概要をここに共有します:まず、utf-8 エンコーディング スキームはプラットフォーム間で優れているため、使用することをお勧めします。
経験 1: 冒頭のステートメント:
# -*- コーディング: utf-8 -*-
友人が私に、-*- の機能は何なのかと尋ねました。プログラマーはもちろん、誰もが見た目を良くするためのものです。もちろん、次のように書くこともできます:
経験 2: 文字 (セクション) 文字列を見つけたら、str() を使用せず、直接 unicode() を使用してください
print unicode_str.encode('utf-8')
経験 3: ファイルを操作する場合、open の代わりに codecs.open を使用するのが最善です (これについては後で説明しますが、最初にここに置きます)
コーデックをインポート
codecs.open('ファイル名', エンコーディング='utf8')
インターネット上の記事も集めました。これも読者におすすめします: Python2.x の中国語表示方法
最後に、Python3 を使用している場合は、不正なコーディングの問題を心配する必要はありません。