必ず文字化け問題に遭遇しました:それが生成され、そしてどのようにそれを解決する方法?

序文

私たちの日常の開発当たり前の中国ゴミ問題は、その後、ゴミ問題は、それを生成する方法ですか?そして、どのようにゴミ問題を解決するには?これは、私はあなたが収穫を持っていることを望みます、述べ展開]設定の基本的な概念と例を結合します。

文字化けの簡単な例

package whx;

import java.io.UnsupportedEncodingException;

public class TestEncodeAndDecode {
    public static void main(String[] args) throws UnsupportedEncodingException {

        String str = "测试中文乱码";
        byte[] b = str.getBytes("GBK");
        System.out.println(new String (b,"UTF-8"));
    }
}

GBKエンコーディングで、UTF-8でデコード、文字化け、結果は次の通りであります:

関連の基本的な概念

文字化けの根本原因を理解するために、我々は明確に理解する必要があり、文字セットは、ビット、バイト、文字の概念-関連しました。

ビット(ビット)

ビットは、記憶装置の最小単位である、またはそれが進数10010010 8ビットを表すように1は、0~1を表します。

バイト

バイトは、コンピュータの情報保存容量測定のための測定技術のユニット、ユニットとして取り扱う二進数字の列であり、小さな単位の構成情報です。

1 B = 8 bit (1字节等于8位)
1 KB = 1024 B = 1024 字节
1 MB = 1024 KB 
1 GB = 1024 MB
1 TB = 1024 GB

文字

文字がコンピュータで使用される文字、数字、記号であり、データ構造は、データアクセスの最小単位です。A、B、B、大きい、+、*、および%文字を表します。

在 ASCII 编码中,一个英文字母字符存储需要1个字节。
在 GB 2312 编码或 GBK编码中,一个汉字字符存储需要2个字节。
在UTF-8编码中,一个英文字母字符存储需要1个字节,一个汉字字符储存需要3到4个字节。
在UTF-16编码中,一个英文字母字符或一个汉字字符存储都需要2个字节
在UTF-32编码中,世界上任何字符的存储都需要4个字节

文字セット

文字セットは、複数の文字の集合体である、文字がより多くの種類とそれぞれの文字セットに含まれる文字の数を設定します。一般的なキャラクタ・セット名:

ASCII字符集
GB2312字符集
Unicode字符集

エンコード、デコード

コンピュータは2進数の1と0を認識し、人間がすべての双方が情報を交換することができるはず、独自の言語を持って、テキストから0.1および0.1へのテキスト変換にそこ変換しなければなりません。

コード:にテキスト文字を変換しているコンピュータは認識 0,1マシンコードを。

デコード:テキスト文字にコンピュータに保存されているパース進数を。

一般的な文字セットとエンコーディング

一般的な文字セットASCII、GBK、ユニコードなど

ASCII文字セット

ASCII文字セット:それは文字、数字、西洋印刷可能文字の記号が含まれており、キー、バックスペースや他の制御文字を入力します。

ASCIIコード:バイナリに英語の文字の文字コードを開発し、米国でのコーディング128個の文字を提供します。

GBXXXX文字セット

GBXXXXシリーズは、GB2312、GBK、GB18030文字の通信システムとの間の文字処理及び情報交換に適しました、。

GB2312

  • フルネームは、以上の6000個の中国語の文字をサポートするために、「中国の符号化文字集合との情報交換」です。
  • ASCIIと互換性のある国立簡体字中国語の文字セットは、中国本土とシンガポールは、このコードを採用しています。
  • 2バイトの各文字や記号を表現します。
  • A1〜F7、A1〜FEから下位バイトから上位バイト。低バイトと上位バイトは、それぞれ、コード0xA0をを添加することによって得ることができます。

GBK

  • GBKフルネーム「中国の内部コード仕様」、繁体字、以上2万漢字のサポートのためのサポートを追加し、GB2312を拡張します。
  • 各文字や記号を2バイトで表現されています。
  • 低バイト40〜FEから81〜FEから上位バイト、。

GB18030

  • GBKはGB2312をコードとの互換性がGB 18030、「IT中国の符号化文字集合」のフルネームは、,, 27484個の単語をサポートすることができます
  • マルチバイトの可変長符号化を用いて、各単語は1、2または4バイトで構成してもよいです。
  • 00〜7Fから1バイト、バイト81〜FE、低7Eのバイト40から80までFEへの2上位バイト、最初のバイト81〜FEから4 3バイト、第4バイトから39から30。

Unicode文字セット

Unicodeは、文字コード体系は、国際機関による精緻化、世界のすべての兆候や記号を収容することができます。それぞれ、様々なエンコーディングを設定するUnicode文字、UTF-8、UTF-16およびUTF-32。

UTF-8

  • 可変長文字エンコーディングに向けられているUnicodeがあります。
  • Unicode標準に任意の文字を表すために使用することができ、そしてその最初のバイトでのコーディングは変化の小さな部分なしまたはASCII文字のみで、元の契約後にソフトウェアを作る、まだASCIIと互換性があり、あなたが使用し続けることができます。
  • 他のUTF-8は、それぞれの文字エンコーディングの1〜4バイトである(ASCIlのみ1バイトエンコードされた文字は、ラテン語、ギリシャ語や他のエンコードが2つのバイトを必要とし、3つのバイトが使用されているCJKコーディング、非常に少ないです4バイトのコード番号を使用して言語の文字)

UTF-16

  • 抽象コードは、Unicode文字セットは、16ビット長の整数(すなわち、シンボル)のデータストレージまたは転送のシーケンスにマッピングされるビット。
  • UTF-8よりもUTF-16文字のバイト(2バイト)は、固定長さを格納することの利点のほとんどが、ASCIIのUTF-16との互換性がないことができます。

UTF-32

  • 各コードに使用されるプロトコルをコードA Unicode文字は、他の可変長符号化が使用されているコードだけ32元ユニコード、ユニコードビット。
  • 高速4バイトの符号化処理が、空間の浪費、伝送速度。

符号化の例および復号理解面ロザン

私たちは、ほとんどの接触は「ハロー・ワード」で、コードのプログラマをノックしました。コンピュータは0と1のみ知られている、それはそれのハロー単語を表示する方法ですか?

前のセクションでは、我々はすでにその知識エンコードされた文字セットを知っています。私たちは、0,1コンピュータの知識に変換「ハロー単語を」ASCIIコードを使用することができます。興味のある友人は、ルックアップするために行くことができ
ASCIIテーブルを

こんにちは、世界がコンピュータのバイナリコード0に格納され、最初の文字に対応するバイナリコードにデコードした後、画面に描画、私たちは見ているハローワールド

それを生成する方法文字化け?

文字化けの主な理由は2つのですテキストエンコーディングプロセスの文字とデコードプロセスが異なるエンコーディングを使用して、第二は、原因と文字化け不足しているフォントライブラリー文字セットのいくつかの種類を使用します

異なる符号化をコードし、使用をデコード

例は、UTF-8でエンコードされた、GBK復号結果を用いて文字化け。UTF-8、3バイトコード文字で、およびGBKに、各文字が2バイトで表されるので、歪みが発生します。

フォントの文字セットライブラリの欠如を使用します

私たちは、そのフォントの文字セットエンコーディングライブラリの欠如を使用し、それは中国の伝統的なGB2312によってサポートされていません知っている、文字化けが生成されます。

文字化けしてそれを解決する方法

使用フォントの文字セットを表示するためのサポートエンコーディングとコーデックの使用同じ符号化方式を、あなたはゴミ問題を解決することができます。

古典的なシーンやソリューションを文字化けものを次にリスト

IntelliJのアイデアゴミ問題

中国の文字化けIDEプロジェクト?ファイル - >設定 - > Editorの>ファイルエンコーディング、UTF-8をコードについての設定

IDEコンソール中国人が文字化け?、IDEのインストールディレクトリを開き、この方法を試して見つけ

たテキストの末尾の-Dfile.encoding = UTF-8を追加

データベースのゴミ問題

データベース・コードを表示します。

show variables like 'character_set%'


设置session、global范围的编码方式

//session 范围
set character_set_server=utf8;
set character_set_database=utf8;
//global 范围
set global character_set_database=utf8;
set global character_set_server=utf8;

session、global范围编码,重启mysql可能编码又变回去了,可以尝试另外一种方式。在mysql(windows环境)的my.ini配置文件中修改或添加下列内容

[mysql]
default-character-set=utf8 
[mysqld]
default-character-set=utf8 
[client]
default-character-set=utf8

编码角度的乱码问题

写代码的时候出现中文乱码?追踪定位到编码解码的地方,设置用同一种编码方式。

参考与感谢

个人公众号

  • 如果你是个爱学习的好孩子,可以关注我公众号,一起学习讨论。
  • 如果你觉得本文有哪些不正确的地方,可以评论,也可以关注我公众号,私聊我,大家一起学习进步哈。

おすすめ

転載: www.cnblogs.com/jay-huaxiao/p/12148622.html