UTF-8からJIS,SJIS,EUCJPに文字コード変換すると文字化けするの巻き
UTF-8で「〜」や「‖」などが文字コード変換すると「?」に文字化けするのです。
かなり嵌ってしまいました・・・
いろいろ調べているとほかにも困っている人が多いようでした。
なので、sourceforgeで化けないように変換するソースが公開されていました。
http://sourceforge.jp/cvs/view/nagaraichat/iCC/ome/ome-core/OME_JavaProject/old-src/Cp932.java?revision=1.1.1.1&view=markup
リンク切れ防止にソースを貼り付けておく
toJisの引数の文字列(UTF-8)の文字化けするものを化けない文字に変換して返してくれる。
String jis = new String( Cp932.toJIS("〜").getBytes( "JIS" ));
package OME; /* * The Cp932 class contains a utility method for converting Microsoft's * Cp 932 into JIS. * * http://java-house.etl.go.jp/ml/archive/j-h-b/014452.html * * @author Kazuhiro Kazama * @version 1.0 01/06/97 */ import java.util.Locale; public class Cp932 { private static boolean isCp932 = false; static { String p = System.getProperty("iscp932"); String os = System.getProperty("os.name"); if (Locale.getDefault().getLanguage().equals("ja")) { isCp932 = true; /* if (p != null && Boolean.getBoolean(p)) isCp932 = true; else if (os != null && (os.equals("Windows 95") || os.equals("Windows NT"))) isCp932 = true; */} // Logging.writeMessage("Cp932 : p = "+p); // Logging.writeMessage("Cp932 : os = "+os); // Logging.writeMessage("Cp932 : isCp932 = "+isCp932); } /* * You can't use this constructor. */ private Cp932() {} /* * This method converts Cp932 to JIS. */ public static String toJIS(String s) { if (!isCp932) return s; StringBuffer sb = new StringBuffer(); char c; for (int i = 0; i < s.length(); i++) { c = s.charAt(i); switch (c) { case 0xff3c: // FULLWIDTH REVERSE SOLIDUS -> c = 0x005c; // REVERSE SOLIDUS break; case 0xff5e: // FULLWIDTH TILDE -> c = 0x301c; // WAVE DASH break; case 0x2225: // PARALLEL TO -> c = 0x2016; // DOUBLE VERTICAL LINE break; case 0xff0d: // FULLWIDTH HYPHEN-MINUS -> c = 0x2212; // MINUS SIGN break; case 0xffe0: // FULLWIDTH CENT SIGN -> c = 0x00a2; // CENT SIGN break; case 0xffe1: // FULLWIDTH POUND SIGN -> c = 0x00a3; // POUND SIGN break; case 0xffe2: // FULLWIDTH NOT SIGN -> c = 0x00ac; // NOT SIGN break; } sb.append(c); } return new String(sb); } /* * This method convert JIS to Cp932. */ public static String toCp932(String s) { if (!isCp932) return s; StringBuffer sb = new StringBuffer(); char c; for (int i = 0; i < s.length(); i++) { c = s.charAt(i); switch (c) { case 0x005c: // REVERSE SOLIDUS -> // c = 0xff3c; // FULLWIDTH REVERSE SOLIDUS c = 0x00a5; //Yen Mark ( by msyk ) break; /* 不要みたい、これ case 0x301c: // WAVE DASH -> c = 0xff5e; // FULLWIDTH TILDE break; */ case 0x2016: // DOUBLE VERTICAL LINE -> c = 0x2225; // PARALLEL TO break; /* これも不要みたい case 0x2212: // MINUS SIGN -> c = 0xff0d; // FULLWIDTH HYPHEN-MINUS break; */case 0x00a2: // CENT SIGN -> c = 0xffe0; // FULLWIDTH CENT SIGN break; case 0x00a3: // POUND SIGN -> c = 0xffe1; // FULLWIDTH POUND SIGN break; case 0x00ac: // NOT SIGN -> c = 0xffe2; // FULLWIDTH NOT SIGN break; } sb.append(c); } return new String(sb); } }