OSDN Git Service

CVS最新版の全ファイルを追加
[spring-ext/ozacc-mail.git] / src / java / com / ozacc / mail / fetch / impl / sk_jp / io / UnicodeCorrector.java
1 /*\r
2  * @(#) $Id: UnicodeCorrector.java,v 1.1.2.1 2005/01/18 07:20:36 otsuka Exp $\r
3  * $Revision: 1.1.2.1 $\r
4  * Copyright (c) 2000 Shin Kinoshita All Rights Reserved.\r
5  */\r
6 package com.ozacc.mail.fetch.impl.sk_jp.io;\r
7 \r
8 import java.io.UnsupportedEncodingException;\r
9 import java.util.HashMap;\r
10 import java.util.Map;\r
11 \r
12 /**\r
13  * UnicodeCorrector.\r
14  * <p>\r
15  * CorrectOutputStreamWriterで用いられる文字列バッファ補正クラスです。<br>\r
16  * 出力エンコーディングによって補正すべき文字コードが異なるので、\r
17  * 実際の補正処理はサブクラスで行います。<br>\r
18  *\r
19  * 対応しているのは以下のコンバータ名です。\r
20  * </p>\r
21  * <UL>\r
22  * <LI>ISO2022JP\r
23  * <LI>ISO-2022-JP\r
24  * <LI>EUC-JP\r
25  * <LI>EUCJIS\r
26  * <LI>SJIS\r
27  * <LI>Shift_JIS\r
28  * <LI>MS932\r
29  * <LI>Windows-31J\r
30  * </UL>\r
31  * @author Shin\r
32  * @version $Revision: 1.1.2.1 $ $Date: 2005/01/18 07:20:36 $\r
33  */\r
34 public abstract class UnicodeCorrector {\r
35     private static final Map correctorMap = new HashMap();\r
36     static {\r
37         // x-sjis-cp932等でおかしく変換されたUnicodeを他のエンコーディングで\r
38         // 出力する場合です\r
39         correctorMap.put("iso2022jp", FromCP932Corrector.class);\r
40         correctorMap.put("iso-2022-jp", FromCP932Corrector.class);\r
41         correctorMap.put("euc-jp", FromCP932Corrector.class);\r
42         correctorMap.put("eucjis", FromCP932Corrector.class);\r
43         // 同じ"SJIS"でもSunとMS-VMでは異なります。\r
44         // Sun-JDK1.1はSJISはx-sjis-jdk-1.1.7で、MS-VMはx-sjis-cp932です。\r
45         // しかし、MS-JDK中のクラスライブラリだけはx-sjis-jdk-1.1.7相当になるので\r
46         // 困ったものです。(ファイル書き出し等のときのみおかしくなる)\r
47         // これはWindowsネイティブな変換表で生成されたUnicodeを\r
48         // x-sjis-jdk-1.1.7で出力するためのものです。\r
49         correctorMap.put("sjis", FromCP932Corrector.class);\r
50         correctorMap.put("shift_jis", FromCP932Corrector.class);\r
51         // MS-VMでファイル出力を行う場合に限り、こちらでなければなりません。\r
52         //      correctorMap.put("sjis", ToCP932Corrector.class);\r
53         // JDK1.2からはWindowsのデフォルトが"MS932"(x-sjis-cp932相当)となりました。\r
54         // これで、他のエンコーディングで変換された(正しい)Unicodeが"ms932"\r
55         // での出力時におかしくなってしまいます。\r
56         // これを補正します。\r
57         correctorMap.put("ms932", ToCP932Corrector.class);\r
58         correctorMap.put("windows-31j", ToCP932Corrector.class);\r
59     }\r
60 \r
61     /**\r
62      * Create an UnicodeCorrector that uses\r
63      * the named character encoding.\r
64      * @param  enc  Name of the encoding to be used\r
65      * @exception  UnsupportedEncodingException\r
66      *             If the named encoding is not supported\r
67      */\r
68     public static UnicodeCorrector getInstance(String enc)\r
69             throws UnsupportedEncodingException {\r
70         Class correctorClass = (Class)correctorMap.get(enc.toLowerCase());\r
71         if (correctorClass == null) {\r
72             throw new UnsupportedEncodingException(enc);\r
73         }\r
74         try {\r
75             return (UnicodeCorrector)correctorClass.newInstance();\r
76         } catch (Exception e) {\r
77             throw new UnsupportedEncodingException(\r
78                     correctorClass + " cannot get newInstance.\n" + e);\r
79         }\r
80     }\r
81 \r
82     /**\r
83      * Unicode文字配列の補正を行います。\r
84      * <p>\r
85      * 特定の文字を特定エンコーディングで出力しようとした際の\r
86      * sun.ioコンバータでは正常に変換できない部分を補正します。\r
87      * </p>\r
88      * @param  cbuf  Buffer of characters\r
89      * @param  off   Offset from which to start writing characters\r
90      * @param  len   Number of characters to write\r
91      * @return Result that corrected.\r
92      *         Note:Return array is different from <code>cbuf</code>\r
93      *              in case of different result size.\r
94      */\r
95     public char[] correct(char cbuf[], int off, int len) {\r
96         StringBuffer buf = new StringBuffer();\r
97         for (int i = off; i < len; i++) {\r
98             buf.append(correct(cbuf[i]));\r
99         }\r
100         return new String(buf).toCharArray();\r
101     }\r
102 \r
103     public String correct(String s) {\r
104         StringBuffer buf = new StringBuffer();\r
105         for (int i = 0; i < s.length(); i++) {\r
106             buf.append(correct(s.charAt(i)));\r
107         }\r
108         return new String(buf);\r
109     }\r
110 \r
111     // 性能的にこれをabstractにするのはためらったが・・・\r
112     public abstract char correct(char c);\r
113 \r
114     /**\r
115      * 新しいUnicodeCorrectorを追加します。\r
116      * <p>\r
117      * このソースコードを変えずに、動的に新たな出力エンコーディングに\r
118      * 対応したUnicodeCorrectorを登録したい場合に用います。\r
119      * </p>\r
120      * @param enc 対応するエンコーディング名\r
121      * @param correctorClass UnicodeCorrectorサブクラスのClassオブジェクト\r
122      */\r
123     public static void addCorrector(String enc, Class correctorClass) {\r
124         if (!correctorClass.isInstance(UnicodeCorrector.class)) {\r
125             throw new IllegalArgumentException(\r
126                     "Corrector is not UnicodeCorrector type.");\r
127         }\r
128         correctorMap.put(enc, correctorClass);\r
129     }\r
130 }