JSPページの中のpagenenccodingとcontentTypeの2つの属性

2108 ワード

JSPページにおけるPageEncocdingとcontentTypeの2つの属性の違いについて:
PageEnccodingはjspファイル自体のコードです。
contentTypeのcharsetとは、サーバがクライアントに送信する時のコンテンツコードです。
JSPは2回の「コード」を経て、第1段階はPageEnccoding、第2段階はutf-8からutf-8、第3段階はTomcatから出てくるページで、contentTypeを使います。
第一段階はjspがjavaにコンパイルされました。
それはPageEncocdingの設定によってjspを読みます。結果は指定された符号化方式から統一されたUTF-8 JAVAソースに翻訳されます。もしpageEnccodingの設定が間違っていたら、あるいは設定されていません。出てくるのは中国語の文字化です。
第二段階はJAVAのソースコードからjava byteCodeのコンパイルまでです。
JSPの編纂時に使うのがどんなコードの方案であろうと、この段階の結果を経てすべてUTF-8のencodingのjavaソースです。
JAVACはUTF-8のencodingでjavaのソースコードを読み取り、UTF-8 encodingのバイナリコード(つまり.class)にコンパイルしました。これはJVMの定数文字列がバイナリコード(java encoding)で表現される規範です。
第三段階はTomcat(またはそのappication container)のロードと実行段階の二番目のJAVAバイナリコードである。
出力の結果、つまりクライアントが見たときに、ステージ1とステージ2に隠れたパラメータcontentTypeが効果を発揮します。
contentType
pagenenccodingとcontentTypeのデザインは全部ISO 8859-1です。その中の一つを勝手に設定しました。もう一つは同じです。しかしこれは絶対ではありません。それぞれのJSPCの処理方式によって違います。pagenencodingはcontentTypeに等しくないです。アジア地域の文字CJKV系JSPの開発と展示に有利です。(例pagenCoding=GB 2312はcontentType=utf-8に等しくない)。
jspファイルは似ていません。javaはコンパイラに読み込まれた時、デフォルトではオペレーティングシステムに設定されているlocaleに対応するコードを採用しています。例えば、中国大陸はGBKです。台湾はBIG 5またはMS 950です。普通、私達はメモ帳でもueでもコードを書いています。もし特別なトランスコードがないなら、書いたのはすべてローカルのコードフォーマットの内容です。だから、コンパイラが採用した方法は仮想マシンに正確な資料を得ることができます。
しかし、jspファイルはそうではありません。このデフォルトのトランスコードプロセスはありません。しかし、PageEnccodingを指定すれば正確なトランスコードが可能です。
例を挙げます

  
  
  
  
  1. <%@ page contentType="text/html;charset=utf-8" %>  
文字化けが印刷されることが多いです。入力された「こんにちは」はgbkですが、サーバーが正しく「こんにちは」を捕まえるかどうかは分かりません。
ただし、変更したら

  
  
  
  
  1. <%@ page contentType="text/html;charset=utf-8" pageEncoding="GBK"%>  
これでサーバーは間違いなく「こんにちは」を正確につかむことができます。