目次
JAVA WEB コード化けの問題分析
コード化けの原因
エンコードとデコード
コード化け解析と解決策
ホームページ Java &#&チュートリアル JAVA WEB 注意事項 - 中国語文字化け

JAVA WEB 注意事項 - 中国語文字化け

Jun 26, 2017 am 11:11 AM
web 中国語 文字化け ノート

JAVA WEB コード化けの問題分析

コード化けの原因

Java Web 開発の過程で、コード化けの問題によく遭遇します。コード化けの原因は、文字エンコーディングとデコード方法の不一致に要約できます。 。

文字化けの原因は文字エンコードとデコード方法が合っていないことなので、なぜエンコードしなければならないのでしょうか?これは、コンピューターにデータを保存する基本単位が 1 バイト、つまり 8 ビットであるため、表現できる最大文字数は 28=256 であり、私たちの現実社会に存在する文字 (中国語)文字、英語、その他の文字など)はこの数をはるかに超えているため、文字とバイトの間の競合を解決するには、文字をコンピュータに保存する前にエンコードする必要があります。

エンコードとデコード

コンピュータにおける一般的なエンコード方式には、ASCII、ISO-8859-1、GB2312、UTF-16、UTF-8などがあります。

ASCIIコードはバイトの下位7ビットで表現されるので、表現できる最大文字数は27=128です。 ISO-8859-1 は、ASCII コードに基づく ISO 組織の拡張であり、ASCII コードと互換性があり、ほとんどの西ヨーロッパ文字をカバーします。 ISO8859-1 は 1 バイトで表現するため、最大 256 文字を表現できます。 GB2312 は 2 バイト エンコードを使用します。エンコード範囲は A1 ~ F7 です。A1 ~ A9 は記号領域、B0 ~ F7 は 6763 個の漢字を含む漢字領域です。 GBK は、GB2312 エンコーディングを拡張し、さらに多くの漢字を追加したものです。表現できる漢字は 21,003 文字です。 UTF-16 は、どの文字でも 2 バイトで表される固定長エンコーディング方式を使用します。これは、JAVA メモリ内の文字の格納形式でもあります。 UTF-16 とは対照的に、UTF-8 は可変長エンコード方式を使用し、さまざまな種類の文字を 1 ~ 6 バイトで構成できます。

以下に示すように、文字列「日向ヒナタ」を使用して、コンピューターでのさまざまなエンコード方法のエンコードを見てみましょう。

コード化け解析と解決策

JAVA WEBのコード化け問題について、リクエストによるコード化けとレスポンスによるコード化けに分けて、それぞれのコード化けについて説明します。コード、つまり文字化けの原因を分析する必要があります。エンコード方式とデコード方式は何ですか。

リクエストによるコード化けについては、HTTPリクエストを解析し、そのエンコード方法を確認する必要があります。HTTPリクエストはGetリクエストとPostリクエストに分けて説明します。

Getリクエストの場合、ブラウザのデフォルトのリクエストメソッドであり、送信時にフォームを「Get」に設定した場合の送信メソッドです。 Firefox ブラウザを通じて次のように特定のコンテンツを確認します。

アドレス バーは次のとおりです。

リクエストのコンテンツは次のとおりです。

文字列はリクエスト ラインに保存され、WEB サーバーに送信されます。 「日向ヒナタ」のエンコードにより、ブラウザで文字列に使用されているエンコード方式が「UTF-8」であることがわかります。

サーバーのコードを見ると、文字化けが見られます (以下に示すように)。これは、サーバーがデフォルトで ISO-8859-1 を使用して文字列エンコードを受信した後にデータをデコードするため、エンコードとデコードが発生します。アプローチは一律ではありません。解決策の概略図は次のとおりです。

Java Web開発のプロセスでは、ハイパーリンクでパラメータを渡しますが、しばしば中国語の状況に遭遇します。この場合、中国語をエンコードする必要があります。UTF-8 に設定できます。デコード スキームは上記と同じです。

<a href="${pageContext.request.contextPath}/Test?user=<%=URLEncoder.encode("日向雏田", "UTF-8")%>">点击</a>
ログイン後にコピー

Postリクエストの場合、フォーム送信を「投稿」に設定した場合の送信方法です。次のように、Firefoxブラウザを介して特定のコンテンツを確認します。上の図では、post リクエストでは、リクエストの内容がリクエストボディに直接配置されて Web サーバーに送信され、エンコード方式が「utf-8」であることがわかります。

このレスポンスサーブレットでは、doPostメソッド本体は以下の通りです:

public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String user=request.getParameter("user");
		System.out.println(user);//输出为日向雏田
	}
ログイン後にコピー

ここでコードが文字化けする理由は、やはりコード getParameter ("user") を実行したときです。 Web サーバーはデフォルトのデコード スキーム「ISO-8859-1」を使用し、デコードされるため、エンコード スキームとデコード スキームの間に不一致が生じます。解決策としては、get リクエストの文字化け解決策を使用することもできますが、直接行うより簡単な解決策もあります。 /Decoding スキームが「utf-8」であることを指定します。計画は以下の通りです。以上でリクエストによるコード化けの解析は完了です。

影響によるコード化けでは、Web サーバーはステータス行を介さずに応答内容を応答本文に書き込み、クライアントに返します。例えばブラウザに「HelloWorld」を出力した場合、レスポンスは下図のようになります。

レスポンスによって引き起こされるコード化けには、次の 4 つのメソッドを含める必要があります。

エンコードタイプの設定用応答本文の (response.setHeader("Content-Type", "text/html;cahrset=utf-8") および response.setCharacterEncoding("utf-8"); これら 2 つのメソッドによって設定されるエンコード方式レスポンスボディのエンコード方式を設定する場合、デフォルトは ISO-8859-1 であり、後でレスポンスボディの文字のエンコード方式を設定すると、以前の設定のエンコード方式が繰り返されます。どちらのメソッドもgetWriterメソッドより前に有効となり、getWriterメソッドでのエンコーディングの設定メソッドは無効となります。

しかし、これら 2 つのメソッドは少し異なります。つまり、setHeader("Content-Type", "text/html;cahrset=utf-8") のメソッドでは、ブラウザは自動的に次のエンコーディング メソッドを使用します。デコードする応答本文。すべてのブラウザがこのメソッドのエンコーディング メソッドを使用して setCharacterEncoding() メソッドをデコードするわけではありません。以下で 2 つのメソッドをテストし、結果は次のとおりです。 りー

  

  从上面可以看到第一个方法对于浏览器来说,支持的较好,提倡采用第一种方法设置响应体的字符编码方式。

  对于获取响应字符输出流的方法,如果在此之前没有设置响应体的编码方式,那么默认为null,即ISO-8859-1方式进行编码。而且后面设置的编码方式会覆盖前面设置的编码方式。在getWriter()方法之后设置的编码无效。

  对于获取响应输出字节流,我们在输出字符串时,我们需要设置字符串的编码方式如果没有那么默认ISO-8859-1。

  对于前面2个输出流,由于只有一个输出缓存,所以这两个方法互斥。

  以上,为了保证响应无乱码,需要保证字符编码和解码方法的统一,方案如下:

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
//	方案1
//		response.setHeader("Content-Type", "text/html;charset=utf-8");
//		response.getWriter().write("日向雏田");
//	方案2
//		response.getOutputStream().write("日向雏田".getBytes("UTF-8"));
//	方案1,2互斥
	}
ログイン後にコピー

  

  此外在Java web开发过程中,我们还会遇到当进行文件下载时,中文文件名导致的问题,如下图所示:

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String realPath=this.getServletContext().getRealPath("/src/日向雏田.jpg");
		String fileName=realPath.substring(realPath.lastIndexOf(&#39;\\&#39;)+1);
		response.setHeader("content-disposition", "attachment;filename="+fileName);
		InputStream is=new FileInputStream(new File(realPath));
		OutputStream os=response.getOutputStream();
		byte[] buff=new byte[1024];
		int len=0;
		while((len=is.read(buff))>0){
			os.write(buff, 0, len);
		}
		os.close();
		is.close();
	}
ログイン後にコピー

  采用火狐浏览器进行测试,查看页面效果,及其响应结果如下:

  

  经过查看响应头分析,下载文件名存放在响应头中,且对于中文文字没有采用UTF-8、UTF-16、GBK等等能识别中文的编码,那么对于中文文件名导致采用哪种编码方式呢?查看REF 7578得知,在此处采用ASCII编码,但是REF规定,如果不可避免的要使用非ASCII码的字符,程序员应该均匀的使用UTF-8,来最小化交互操作的问题。

  所以,解决方案就是把文件名编码成UTF-8,传递给响应头,浏览器(部分)默认对该文件名进行UTF-8解码处理。

public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String realPath=this.getServletContext().getRealPath("/src/日向雏田.jpg");
		String fileName=realPath.substring(realPath.lastIndexOf(&#39;\\&#39;)+1);
		String utf_8Name=URLEncoder.encode(fileName,"utf-8");//解决方案
		response.setHeader("content-disposition", "attachment;filename="+utf_8Name);
		InputStream is=new FileInputStream(new File(realPath));
		OutputStream os=response.getOutputStream();
		byte[] buff=new byte[1024];
		int len=0;
		while((len=is.read(buff))>0){
			os.write(buff, 0, len);
		}
		os.close();
		is.close();
	}
ログイン後にコピー

  效果如下:其中火狐浏览器并没有对其解码

 

以上がJAVA WEB 注意事項 - 中国語文字化けの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

小紅書メモを削除する方法 小紅書メモを削除する方法 Mar 21, 2024 pm 08:12 PM

小紅書メモを削除するにはどうすればよいですか? メモは小紅書アプリで編集できます。ほとんどのユーザーは小紅書メモの削除方法を知りません。次に、エディターがユーザーに小紅書メモの削除方法に関する写真とテキストを提供します。チュートリアル、興味のあるユーザーが来て、それを受講してください見てください!小紅書使い方チュートリアル 小紅書メモの削除方法 1. まず小紅書アプリを開いてメインページに入り、右下隅の[自分]を選択して特別エリアに入ります; 2. 次に、マイエリアで、表示されているメモページをクリックします下の図で、削除したいメモを選択します; 3. メモページに入り、右上隅の [3 つの点] をクリックします; 4. 最後に、下部に機能バーが展開され、[削除] をクリックして完了します。

Call of Duty: Warzone モバイル ゲームで中国語を設定する方法 Call of Duty: Warzone モバイル ゲームで中国語を設定する方法 Mar 22, 2024 am 08:41 AM

Call of Duty Warzone は新しくリリースされたモバイル ゲームです。多くのプレイヤーは、このゲームの言語を中国語に設定する方法に非常に興味があります。実際、それは非常に簡単です。プレイヤーは中国語の言語パックをダウンロードするだけで、その後、次のことができます詳しい内容はこちらの中国語設定方法紹介で解説していますので、一緒に見ていきましょう。モバイル ゲーム Call of Duty: Warzone に中国語を設定する方法 1. まずゲームに入り、インターフェースの右上隅にある設定アイコンをクリックします。 2. 表示されるメニューバーで、[ダウンロード]オプションを見つけてクリックします。 3. このページの[SIMPLIFIEDCHINESE](簡体字中国語)を選択して、簡体字中国語のインストールパッケージをダウンロードします。 4. 設定に戻ります

VSCode を使用した中国語のセットアップ: 完全ガイド VSCode を使用した中国語のセットアップ: 完全ガイド Mar 25, 2024 am 11:18 AM

中国語での VSCode セットアップ: 完全ガイド ソフトウェア開発では、Visual Studio Code (略して VSCode) が一般的に使用される統合開発環境です。中国語を使用する開発者は、VSCode を中国語インターフェイスに設定すると、作業効率が向上します。この記事では、VSCode を中国語インターフェイスに設定する方法を詳しく説明し、具体的なコード例を示す完全なガイドを提供します。ステップ 1: 言語パックをダウンロードしてインストールします。VSCode を開いた後、左側の

Excelのテーブルに中国語を表示するように設定するにはどうすればよいですか? Excel切り替え中国語操作チュートリアル Excelのテーブルに中国語を表示するように設定するにはどうすればよいですか? Excel切り替え中国語操作チュートリアル Mar 14, 2024 pm 03:28 PM

Excelスプレッドシートは現在多くの人が使っているオフィスソフトの一つですが、パソコンがWin11なので英語のインターフェースが表示されていて、中国語のインターフェースに切り替えたいけど操作方法が分からないという方もいらっしゃいます。この問題を解決するには、この問題エディターがすべてのユーザーの質問に答えるためにここにあります。今日のソフトウェア チュートリアルで共有されるコンテンツを見てみましょう。 Excel を中国語に切り替えるためのチュートリアル: 1. ソフトウェアを起動し、ページ上部のツールバーの左側にある [ファイル] オプションをクリックします。 2. 以下の選択肢から「オプション」を選択します。 3. 新しいインターフェースに入ったら、左側の「言語」オプションをクリックします。

小紅書に投稿したメモが見つからない場合はどうすればよいですか?送信したばかりのメモが見つからない理由は何ですか? 小紅書に投稿したメモが見つからない場合はどうすればよいですか?送信したばかりのメモが見つからない理由は何ですか? Mar 21, 2024 pm 09:30 PM

小紅書のユーザーとして、私たちは皆、公開されたノートが突然消えてしまう状況に遭遇したことがありますが、間違いなく混乱し、心配しています。この場合、どうすればよいでしょうか?この記事では、「小紅書が公開したメモが見つからない場合の対処方法」というテーマに焦点を当て、詳細な回答を提供します。 1. 小紅書が発行したメモが紛失した場合はどうすればよいですか?まず、パニックにならないでください。メモがなくなっていることに気づいた場合は、パニックに陥らず、落ち着いて行動することが重要です。これは、プラットフォームのシステム障害または操作エラーが原因である可能性があります。リリース記録の確認も簡単です。小紅書アプリを開き、「自分」→「公開」→「すべての出版物」をクリックするだけで、自分の出版記録を表示できます。ここでは、以前に公開されたノートを簡単に見つけることができます。 3.再投稿。見つかったら

小紅書でノートに商品リンクを追加する方法 小紅書でノートに商品リンクを追加するチュートリアル 小紅書でノートに商品リンクを追加する方法 小紅書でノートに商品リンクを追加するチュートリアル Mar 12, 2024 am 10:40 AM

小紅書でメモに商品リンクを追加するにはどうすればよいですか?小紅書アプリでは、ユーザーはさまざまなコンテンツを閲覧できるだけでなく、ショッピングもできるため、このアプリにはショッピングのおすすめや良い商品の共有に関するコンテンツがたくさんあります。このアプリでは、ショッピング体験を共有したり、協力してくれる販売者を見つけたり、メモにリンクを追加したりすることもできます。便利なだけでなく、専門家がいくつかの機能を備えているため、多くの人がこのアプリをショッピングに使用したいと考えています。興味深いコンテンツを閲覧して、自分に合った衣料品があるかどうかを確認できます。ノートに商品リンクを追加する方法を見てみましょう! 小紅書ノートに商品リンクを追加する方法 携帯電話のデスクトップでアプリを開きます。アプリのホームページをクリックします

wwe2k24には中国語が登場しますか? wwe2k24には中国語が登場しますか? Mar 13, 2024 pm 04:40 PM

『WWE2K24』はVisual Conceptsが制作し、2024年3月9日に正式リリースされたレーシングスポーツゲームです。このゲームは非常に高く評価されており、多くのプレイヤーが中国語版がリリースされるかどうかに熱心に興味を持っています。残念ながら、今のところ「WWE2K24」は中国語版をまだローンチしていない。 wwe2k24 は中国語になりますか? 回答: 中国語は現在サポートされていません。 Steam中国地域におけるWWE2K24の標準版の価格は199元、デラックス版は329元、記念版は395元です。ゲームには比較的高い構成要件があり、プロセッサ、グラフィックス カード、または実行メモリに関して特定の基準があります。公式推奨構成と最小構成の紹介:

PHPでtxtファイルを書く際の中国語の文字化けを解決するためのヒント PHPでtxtファイルを書く際の中国語の文字化けを解決するためのヒント Mar 27, 2024 pm 01:18 PM

PHP で書かれた txt ファイルの中国語文字化けを解決するヒント. インターネットの急速な発展に伴い、PHP は広く使用されているプログラミング言語として、ますます多くの開発者に使用されています。 PHP 開発では、中国語のコンテンツを記述する txt ファイルなどのテキスト ファイルの読み取りと書き込みが必要になることがよくあります。ただし、エンコード形式の問題により、書かれた中国語が文字化けして表示されることがあります。この記事では、PHPでtxtファイルに書き込まれた中国語の文字化けを解決するテクニックと、具体的なコード例を紹介します。 PHP、テキストの問題分析

See all articles