package org.dayatang.configuration.impl; import org.dayatang.configuration.ConfigurationException; import java.io.UnsupportedEncodingException; import java.util.Hashtable; import java.util.Map.Entry; import java.util.Properties; /** * 解决Java Properties文件的编码问题,避免iso8859-1到utf8的相互转义 * * @author jzhai */ public class PropertiesFileUtils { public static final String ISO_8859_1 = "iso8859-1"; private String encoding = "UTF-8"; public PropertiesFileUtils(String encoding) { this.encoding = encoding; } /** * 将Properties文件,其中含有原生的UTF8等编码字符,转换为编码正确的Hashtable */ public Hashtable<String, String> rectifyProperties(Properties p) { if (p == null) { return null; } Hashtable<String, String> ret = new Hashtable<String, String>(); for (Entry<Object, Object> e : p.entrySet()) { String key = (String) e.getKey(); String value = (String) e.getValue(); ret.put(key, StringPropertyReplacer.replaceProperties(rectifyStr(value))); } return ret; } /** * 将编码正确的Hashtable, 转换为待写入Properties文件的对象 */ public Properties unRectifyProperties(Hashtable<String, String> h) { if (h == null) { return null; } Properties ret = new Properties(); for (Entry<String, String> e : h.entrySet()) { String key = e.getKey(); String value = e.getValue(); ret.put(key, unRectifyStr(value)); } return ret; } /** * 修正Properities中原生字符串为正确的编码 */ public String rectifyStr(String raw) { if (raw == null) { return raw; } String ret = raw; try { byte[] bytes = raw.getBytes(ISO_8859_1); ret = new String(bytes, encoding); } catch (UnsupportedEncodingException e) { throw new ConfigurationException("Unsupport Encoding:" + encoding, e); } return ret; } /** * 还原正确的字符串编码为ISO编码 */ public String unRectifyStr(String validStr) { if (validStr == null) { return validStr; } String ret = validStr; try { byte[] bytes = validStr.getBytes(encoding); ret = new String(bytes, ISO_8859_1); } catch (UnsupportedEncodingException e) { throw new ConfigurationException("Unsupport Encoding:" + encoding, e); } return ret; } }