web.xmlへのservlet定義

<servlet>
  <servlet-name>servletName</servlet-name>
  <servlet-class>packageName.ClassFileName</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>servletName</servlet-name>
  <url-pattern>/actionName</url-pattern>
</servlet-mapping>

呼び出し例

jsp

<form action="/contextPath/actionName" method="GET">
 <input type="submit" value="GO" /> 
</form>

Servlet

req.getServletContext().getRequestDispatcher(actionName).forward(req, res);

URLダイレクトアクセス

http://host:port/contextPath/actionName

文字列とバイト表現の話

ソースコード上に出現する(生成する/外部から受け取る)文字列については、ソースコードコンパイルしたOSのデフォルトエンコーディングに従ってバイト変換したものUnicodeに再変換している。

*eclipseを使って開発をしている場合は、eclipseの設定による。

 String str = "あいうえお";

という文字列を宣言したときに、

 byte[] bytes = str.getBytes();

として、文字列オブジェクトをbyte配列に変換し、中身を見る。

デフォルトエンコーディングの設定がUTF-8

bytesには次のように格納される。
[0xe3, 0x81, 0x82, 0xe3, 0x81, 0x84, 0xe3, 0x81, 0x86, 0xe3, 0x81, 0x88, 0xe3, 0x81, 0x8a]

0xe3, 0x82, 0xa0 で UTF-8の「あ」。
0xe3, 0x82, 0xa2 で UTF-8の「い」。
(日本語文字は3バイトで表現される)

デフォルトエンコーディングの設定がWindows-31J

[0x82, 0xa0, 0x82, 0xa2, 0x82, 0xa4, 0x82, 0xa6, 0x82, 0xa8]

0x82, 0xa0 で Windows-31Jの「あ」。
0x82, 0xa2 で Windows-31Jの「い」。
(日本語文字は2バイトで表現される)

char配列ではなくbyte配列で見なければいけないことに注意。

文字列を作ったらとりあえず文字コードは気にしない。

String str = "あいうえお";

この時点で「あいうえお」はUTF-16
Shift_JIS文字コードで表現された「あいうえお」だったり、
UTF-8文字コードで表現された「あいうえお」だったりするわけではない。

意識しなくてはいけないのは、文字列表現をバイト配列に変換する時。

byte[] bytes = str.getBytes("UTF-8");

この時点で、「あいうえお」がUTF-8文字コード
表現されたバイト配列に変換される。

そして、

String str = new String(bytes, "UTF-8");

この時点で、バイト配列をUTF-8文字コードで表現された文字だと
認識して、Stringの文字列オブジェクトを作成する。

つまり、以下の場合は文字化けする。

String str = "あいうえお";
byte[] bytes = str.getBytes("Windows-31J");
str = new String(bytes, "UTF-8");

理由は、Windows-31J文字コードで表現されたバイト配列を、UTF-8文字コードで表現されたバイト配列だと認識して、Stringの文字列オブジェクトを生成するため。

特にWebプログラミングをしている時に文字化けは起こりがち。
TomcatのデフォルトエンコーディングがISO-8859-1であるため、上手く文字列を変換させずに日本語文字列を出力したり、送信したりすると文字化けしてしまう等。)
InputSreamReader,FileInputStreamReaderなどで文字コードを明示的に指定し、デフォルトエンコーディングの利用をしないこと。
*FileReaderクラスはデフォルトエンコーディングしか利用できない。
(参考ソース)

import java.io.UnsupportedEncodingException;


public class TestMoji {
	public static void main(String args[]){
		String str = "あいうえお";
		print(str);
		print(str,"Windows-31J");
		print(str,"euc-jp");
		print(str,"ISO-8859-1");
	}
	
	private static void print(String str){
		print(str, System.getProperty("file.encoding"));
	}
	
	private static void print(String str, String encoding){
		try{
			byte[] bytes = str.getBytes(encoding);
			System.out.println("encoding:"+encoding);
			for(int i = 0; i < bytes.length; i++){
				System.out.printf("%x",bytes[i]);
				if(i != bytes.length-1){
					System.out.print(", ");
				}
			}
			System.out.println();						
		} catch(UnsupportedEncodingException e){
			e.printStackTrace();
		}
	}
}