サーブレットの基礎知識 |
|
Javaでは、外部から入力された文字列を扱う際には、常にプラットフォームごとに設定されているデフォルトのエンコーディングを使って、Unicodeへの変換を行います。例えば、Windows
では SJIS ですし、LinuxやSolaris では EUCと見なして、変換を行うようになっています。サーブレットの場合も同様で、特に指定しなければ、サーブレットに与えられたパラメータの内容も、デフォルトのエンコーディングと見なして変換しようとします。
ところが、ブラウザから送信される文字列(フォームに入力されたパラメータなど)が、どのエンコーディングで送信されるかは、ブラウザ側の設定や状態によって異なります(1回の起動中に変わることもある)から、常に同じエンコーディングで変換しようとしても、うまく変換されない場合が生じてきます。
そのため、サーブレットでブラウザからの送信文字列を受信する際には、そのエンコーディングを自動判別して、Unicodeへの変換を行う必要があります。そのために、以下のような方法で変換を行います。
|
まず、2行目の noencode.getBytes("8859_1") によって、入力された文字列を加工したり変換したりすることなく、そのままバイト配列に置き換えています。つまりパラメータがSJISコードで送信されてきた場合はSJISコードのまま、EUCコードで送信されてきた場合はEUCコードのままでバイト配列に置き換えるわけです。
さらに、2行目ではStringクラスのコンストラクタ String(byte[],String)によって、そこに指定されるエンコーディングを用いてバイト配列をUnicodeに変換しています。このとき、エンコーディングに「JISAutoDetect」を指定することによって、エンコーディングを自動判別することができます。ですから、ブラウザの設定や状態によってパラメータ文字列のエンコーディングが変わっても、正しくUnicodeへの変換を行うことができます。
(注:本記事では、 Servletのバージョンは、2.2を仮定しています)
[参考URL]
http://java.sun.com/products/servlet/2.2/javadoc/index.html
「Java Solution FAQ」 |
- 実運用の障害対応時間比較に見る、ログ管理基盤の効果 (2017/5/9)
ログ基盤の構築方法や利用方法、実際の案件で使ったときの事例などを紹介する連載。今回は、実案件を事例とし、ログ管理基盤の有用性を、障害対応時間比較も交えて紹介 - Chatwork、LINE、Netflixが進めるリアクティブシステムとは何か (2017/4/27)
「リアクティブ」に関連する幾つかの用語について解説し、リアクティブシステムを実現するためのライブラリを紹介します - Fluentd+Elasticsearch+Kibanaで作るログ基盤の概要と構築方法 (2017/4/6)
ログ基盤を実現するFluentd+Elasticsearch+Kibanaについて、構築方法や利用方法、実際の案件で使ったときの事例などを紹介する連載。初回は、ログ基盤の構築、利用方法について - プログラミングとビルド、Androidアプリ開発、Javaの基礎知識 (2017/4/3)
初心者が、Java言語を使ったAndroidのスマホアプリ開発を通じてプログラミングとは何かを学ぶ連載。初回は、プログラミングとビルド、Androidアプリ開発、Javaに関する基礎知識を解説する。
|
|