概要
この記事には主にコーディング、Java、システムソフトウェア、URL、ツールソフトウェアなどの基礎知識が含まれています。
以下の説明では、単語「中国語」を例として取り上げます。テーブルを調べると、GB2312 エンコードは「d6d0 cec4」、Unicode エンコードは「4e2d 6587」、UTF であることがわかります。エンコードは「e4b8ad e69687」です。これら 2 つの文字には iso8859-1 エンコードがありませんが、iso8859-1 エンコードで「表現」できることに注意してください。
2. エンコーディングの基礎知識
最も古いエンコーディングは iso8859-1 で、ASCII エンコーディングに似ています。しかし、さまざまな言語の表現を容易にするために、多くの標準エンコーディングが徐々に登場してきました。重要なものは次のとおりです。
2.1. iso8859-1
はシングルバイトエンコーディングであり、表現できる最大文字範囲は 0 ~ 255 であり、英語シリーズに適用されます。たとえば、文字「a」のエンコードは 0x61=97 です。
iso8859-1 エンコードで表現される文字範囲は非常に狭く、漢字を表現できないことは明らかです。ただし、iso8859-1 エンコードはシングルバイトエンコードであり、コンピュータの最も基本的な表現単位と一致しているため、多くの場合で今でも使用されています。また、多くのプロトコルでは、このエンコーディングがデフォルトで使用されます。たとえば、「中国語」という単語は iso8859-1 エンコードには存在しませんが、gb2312 エンコードを例にとると、iso8859-1 エンコードを使用すると、「d6d0 cec4」の 2 文字になるはずです。表します: "d6 d0 ce c4" (実際には、格納するときもバイト単位で処理されます)。また、UTFエンコードの場合は「e4 b8 ad e6 96 87」の6バイトになります。明らかに、この表現は別のエンコーディングに基づく必要があります。
2.2. GB2312/GBK
これは漢字を表すために特別に使用される漢字の国家標準コードであり、英語の文字は iso8859-1 と互換性があります。 1エンコーディング)。このうち、gbk エンコードは繁体字と簡体字を同時に表現できますが、gb2312 は簡体字のみを表現できます。
2.3. unicode
これは、すべての言語の文字を表すために使用できる最も統一されたエンコーディングであり、英語の文字を含む固定長の 2 バイト (4 バイトも) エンコーディングです。そのため、iso8859-1 エンコーディングと互換性がなく、どのエンコーディングとも互換性がないと言えます。ただし、iso8859-1 エンコードと比較すると、uniocode エンコードでは先頭に 0 バイトが追加されるだけです。たとえば、文字「a」は「00 61」になります。
固定長エンコーディングはコンピューターで処理しやすいことに注意してください (GB2312/GBK は固定長エンコーディングではないことに注意してください)。Unicode はすべての文字を表すために使用できるため、多くの言語で内部的に Unicode エンコーディングが使用されています。 Javaなどのソフトウェア。
2.4. UTF
Unicode エンコードは iso8859-1 エンコードと互換性がなく、より多くのスペースを占有しやすいことを考慮すると、英語の文字の場合、Unicode は表現するのに 2 バイトも必要となるためです。したがって、Unicode は送信や保存には不便です。したがって、UTF エンコードは ISO8859-1 エンコードと互換性があり、すべての言語の文字を表すために使用できます。ただし、UTF エンコードは可変長エンコードであり、各文字の長さの範囲は 1 ~ 6 です。バイト。また、UTFエンコードには簡易検証機能が付いています。一般に、英語の文字は 1 バイトで表現されますが、中国語の文字は 3 バイトで表現されます。
UTF は使用するスペースを減らすために使用されますが、それは Unicode エンコードと比較されているだけであることに注意してください。それが中国語の文字であることがすでにわかっている場合は、間違いなく GB2312/GBK を使用するのが最も経済的です。しかしその一方で、UTF エンコードでは中国語の Web ページであっても 3 バイトを使用しますが、Web ページには英語の文字が多く含まれているため、UTF エンコードの方が Unicode エンコードよりも節約できることにも注意してください。
3. Java による文字の処理
Java アプリケーション ソフトウェアでは、文字セットのエンコードに関わる箇所が多く、正しい設定が必要な箇所もあれば、ある程度の処理が必要な箇所もあります。
3.1. getBytes(charset)
これは、文字列で表される文字を charset に従ってエンコードし、バイト単位で表すことのできる標準関数です。文字列は常に Unicode エンコードで Java メモリに格納されることに注意してください。たとえば、「中国語」は、通常の状況 (つまり、エラーがない場合) では「4e2d 6587」として格納されます。文字セットが「gbk」の場合、「d6d0 cec4」としてエンコードされ、次にバイト「d6」がエンコードされます。 d0 ce c4」が返されます。文字セットが「utf8」の場合、末尾は「e4 b8 ad e6 96 87」となります。 「iso8859-1」の場合はエンコードできないため、最終的には「3f 3f」(疑問符2つ)が返されます。
3.2. 新しい文字列(文字セット)
これは、Java 文字列処理のもう 1 つの標準関数であり、前述の関数とは逆で、文字セット エンコーディングに従ってバイト配列を結合して識別し、最終的に格納するために Unicode に変換します。上記の getBytes の例を参照すると、「gbk」と「utf8」は両方とも正しい結果「4e2d 6587」を取得できますが、iso8859-1 は最終的に「003f 003f」(疑問符 2 つ)になります。
utf8 はすべての文字の表現/エンコードに使用できるため、 new String(str.getBytes("utf8"), "utf8") === str となり、完全に元に戻すことができます。
3.3. setCharacterEncoding()
この関数は、http リクエストまたは対応するエンコーディングを設定するために使用されます。
リクエストの場合、送信されたコンテンツのエンコーディングを参照します。指定しない場合は、デフォルトで iso8859-1 エンコーディングが使用されます。これには追加の処理が必要です。下記の「フォーム入力」を参照してください。 setCharacterEncoding() が実行される前に getParameter() を実行することはできないことに注意してください。 Java ドキュメントには次のように記載されています。このメソッドは、リクエスト パラメータを読み取る前、または getReader() を使用して入力を読み取る前に呼び出す必要があります。また、この指定は POST メソッドに対してのみ有効であり、GET メソッドに対しては有効ではありません。理由を分析すると、最初の getParameter() を実行するときに、Java は送信されたすべてのコンテンツをエンコーディングに従って分析し、その後の getParameter() は分析されなくなるため、setCharacterEncoding() が無効になるためです。フォームを送信する GET メソッドの場合、送信内容は URL 内にあり、送信内容はすべて最初からエンコーディングに従って解析されているため、当然 setCharacterEncoding() は無効になります。
応答の場合、出力コンテンツのエンコーディングを指定します。同時に、この設定はブラウザーに渡され、コンテンツの出力に使用されるエンコーディングをブラウザーに伝えます。
3.4. 処理プロセス
以下では、Java がコーディング関連の問題をどのように処理するかを説明するために、2 つの代表的な例を分析します。
3.4.1. フォーム入力
ユーザー入力 *(gbk:d6d0 cec4) ブラウザ *(gbk:d6d0 cec4) Web サーバー iso8859-1(00d6 00d 000ce 00c4) クラス、クラス: getbytes で処理する必要があります(" iso8859-1") は d6 d0 ce c4、new String("gbk") は d6d0 cec4、メモリ内の Unicode エンコーディングは 4e2d 6587 です。
l ユーザーが入力したエンコーディング方法は、ページで指定されたエンコーディングに関連しており、またユーザーのオペレーティング システムにも関連しているため、不確実です。上記の例では、例として gbk を使用しています。
ブラウザーから Web サーバーまで、フォームでコンテンツを送信するときに使用する文字セットを指定できます。それ以外の場合は、ページで指定されたエンコードが使用されます。また、? を使用してパラメータを URL に直接入力する場合、現時点ではページとは関係がないため、エンコードはオペレーティング システム自体のエンコードであることがよくあります。上記では、例として gbk エンコーディングを使用しています。
Web サーバーが受信するものは、デフォルト (getParameter) では、iso8859-1 エンコーディングで処理されます。結果は正しくないため、処理する必要があります。ただし、エンコーディングが事前に設定されている場合 (request.setCharacterEncoding() を通じて)、正しい結果を直接取得できます。
ページでエンコードを指定することは良い習慣です。そうしないと、制御を失い、正しいエンコードを指定できなくなる可能性があります。
上記は、JAVA 文字セットの基本的な説明です。その他の関連記事については、PHP 中国語 Web サイト (m.sbmmt.com) に注目してください。