001 /* 002 * Copyright (c) 2009 The openGion Project. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 013 * either express or implied. See the License for the specific language 014 * governing permissions and limitations under the License. 015 */ 016 package org.opengion.fukurou.mail; 017 018 // import java.io.InputStream; 019 // import java.io.OutputStream; 020 import java.io.ByteArrayOutputStream; 021 // import java.io.ByteArrayInputStream; 022 import java.io.UnsupportedEncodingException; 023 // import java.io.IOException; 024 025 // import javax.activation.DataHandler; 026 // import javax.activation.DataSource; 027 // import javax.mail.internet.InternetAddress; 028 // import javax.mail.internet.MimeMessage; 029 // import javax.mail.internet.MimeUtility; 030 // import javax.mail.MessagingException; 031 // import com.sun.mail.util.BASE64EncoderStream; 032 033 // import java.nio.charset.Charset; // 5.5.2.6 (2012/05/25) 034 035 /** 036 * æ–?—関係ã?コンãƒã?ã‚¿ã§ã™ã? 037 * ä¸?ƒ¨ã‚³ãƒ¼ãƒ‰ã?オリジナル㯠<a href="http://www-cms.phys.s.u-tokyo.ac.jp/~naoki/CIPINTRO/CCGI/kanjicod.html">Japanese Kanji Code</a>ã«ã¦å…¬é–‹ã•れã¦ã?‚‹ã‚‚ã?ã§ã™ã? 038 * ã¾ãŸã?http://www.sk-jp.com/cgi-bin/treebbs.cgi?kako=1&all=644&s=681 039 * ã«ã¦ YOSI ã•ã‚“ãŒå?é–‹ã•れãŸã‚³ãƒ¼ãƒ‰ã‚‚å‚è?ã«ã—ã¦ã?¾ã?ã¨ã?†ã‹å®Ÿè³ªåŒã˜ã§ã?ã€? 040 * 041 * @version 4.0 042 * @author Kazuhiko Hasegawa 043 * @since JDK5.0, 044 */ 045 class CharCodeConverter { 046 private static final byte[] SJIS_KANA; // 5.1.9.0 (2010/09/01) public â‡?private ã¸å¤‰æ›´ 047 048 /** 049 * インスタンスã®ç”Ÿæ?を抑æ¢ã—ã¾ã™ã? 050 */ 051 private CharCodeConverter() { 052 // 何もã‚りã¾ã›ã‚“ã€?PMD エラー回é¿) 053 } 054 055 static { 056 try { 057 // 全角ã¸ã®å¤‰æ›ãƒ??ブル 058 SJIS_KANA = "。ã?ã€ã?・ヲァィゥェォャュョãƒ??アイウエオカã‚クケコサシスセソタãƒãƒ„ãƒ?ƒˆãƒŠãƒ‹ãƒŒãƒãƒŽãƒãƒ’フヘã?マミãƒ?ƒ¡ãƒ¢ãƒ¤ãƒ¦ãƒ¨ãƒ©ãƒªãƒ«ãƒ¬ãƒãƒ¯ãƒ³ã‚›ã?".getBytes("Shift_JIS"); 059 } catch( UnsupportedEncodingException ex ) { 060 throw new RuntimeException( "CANT HAPPEN",ex ); 061 } 062 } 063 064 /** 065 * Shift_JIS エンコーãƒ?‚£ãƒ³ã‚°ã‚¹ã‚ーãƒ?«åŸºã¥ããƒã‚¤ãƒˆå?ã‚? 066 * ISO-2022-JP エンコーãƒ?‚£ãƒ³ã‚°ã‚¹ã‚ーãƒ?«å¤‰æ›ã—ã¾ã™ã? 067 * 「åŠè§’カナã?ã¯å¯¾å¿œã™ã‚‹å?è§’æ–‡å—ã«å¤‰æ›ã—ã¾ã™ã? 068 * 069 * @param sjisBytes byte[] エンコードã™ã‚‹Shift_JISãƒã‚¤ãƒˆé?åˆ? 070 * 071 * @return byte[] 変æ›å¾Œã?ISO-2022-JP(JIS)ãƒã‚¤ãƒˆé?åˆ?not null) 072 */ 073 public static byte[] sjisToJis( final byte[] sjisBytes ) { 074 ByteArrayOutputStream out = new ByteArrayOutputStream(); 075 boolean nonAscii = false; 076 int len = sjisBytes.length; 077 for(int i = 0; i < len; i++ ) { 078 if(sjisBytes[i] >= 0) { 079 if(nonAscii) { 080 nonAscii = false; 081 out.write(0x1b); 082 out.write('('); 083 out.write('B'); 084 } 085 out.write(sjisBytes[i]); 086 } else { 087 if(!nonAscii) { 088 nonAscii = true; 089 out.write(0x1b); 090 out.write('$'); 091 out.write('B'); 092 } 093 int bt = sjisBytes[i] & 0xff; 094 if(bt >= 0xa1 && bt <= 0xdf) { 095 // åŠè§’カナã?全角ã«å¤‰æ› 096 int kanaIndex = (bt - 0xA1) * 2; 097 sjisToJis(out, SJIS_KANA[kanaIndex], SJIS_KANA[kanaIndex + 1]); 098 } else { 099 i++; 100 if(i == len) { break; } 101 sjisToJis(out, sjisBytes[i - 1], sjisBytes[i]); 102 } 103 } 104 } 105 if(nonAscii) { 106 out.write(0x1b); 107 out.write('('); 108 out.write('B'); 109 } 110 return out.toByteArray(); 111 } 112 113 /** 114 * ?‘æ–‡å—ã??’ãƒã‚¤ãƒ?Shift_JIS コードを JIS コードã«å¤‰æ›ã—ã¦æ›¸ãå?ã—ã¾ã™ã? 115 */ 116 private static void sjisToJis( 117 final ByteArrayOutputStream out, final byte bhi, final byte blo) { 118 int hi = (bhi << 1) & 0xFF; 119 int lo = blo & 0xFF; 120 if(lo < 0x9F) { 121 if(hi < 0x3F) { hi += 0x1F; } else { hi -= 0x61; } 122 if(lo > 0x7E) { lo -= 0x20; } else { lo -= 0x1F; } 123 } else { 124 if(hi < 0x3F) { hi += 0x20; } else { hi -= 0x60; } 125 lo -= 0x7E; 126 } 127 out.write(hi); 128 out.write(lo); 129 } 130 }