字符串中的生僻字在传输和存储的过程中存在着各种各样的问题,为了便于传输和存储,我们通常会把这些生僻字转换为16进制编码进行传输和存储。
class="java" name="code">package com.dc.util; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.nio.charset.Charset; import java.util.HashMap; import java.util.Map; /* ****************** 类说明 ********************* * class : RareWordUtil * @author : ncc * create time : 2017-12-20 上午09:49:54 * @version : 1.0 * description : 生僻字与16进制编码相互转化 * @see : * ************************************************/ public class RareWordUtil { private static Map<String, String> nameToValue; private static Map<String, String> valueToName; private String fileName = "gbk.txt"; private String fileEncoding = "GBK"; private final String preFix = "■△"; private static final RareWordUtil cr_instance = new RareWordUtil(); /** * 构造方法 */ private RareWordUtil() { try { init(); } catch (IOException e) { System.out.println(e.getMessage()); } } /* ******************************************** * method name : getInstance * description : 获取实例 * @return : RareWordUtil * @param : @return * modified : ncc , 2017-12-20 * @see : * ********************************************/ public static RareWordUtil getInstance() { return cr_instance; } /* ******************************************** * method name : init * description : 初始化 * @return : void * @param : @throws IOException * modified : ncc , 2017-12-20 * @see : * ********************************************/ @SuppressWarnings( { "static-access", "unchecked" }) private void init() throws IOException { if (nameToValue != null && valueToName != null) { return; } InputStream input = RareWordUtil.class.getResourceAsStream(fileName); InputStreamReader inputsr = new InputStreamReader(input, Charset.forName(fileEncoding)); BufferedReader br = new BufferedReader(inputsr); this.nameToValue = new HashMap(); this.valueToName = new HashMap(); String line = null; while ((line = br.readLine()) != null) { String ret = new String(line.getBytes(fileEncoding), fileEncoding); String key = ret.substring(0, 1); String value = ret.substring(line.length() - 4, line.length()); this.nameToValue.put(key, value); this.valueToName.put(value, key); } } /* ******************************************** * method name : getRareWord * description : 将含16进制编码的字符串转化成含生僻字的字符串 * @return : String * @param : @param value * @param : @return * modified : ncc , 2017-12-20 * @see : * ********************************************/ @SuppressWarnings("static-access") public String getRareWord(String value) { StringBuffer sb = new StringBuffer(); int pos = -1; while ((pos = value.indexOf(preFix)) != -1) { sb.append(value.substring(0, pos)); String code = value.substring(pos + preFix.length(), pos + preFix.length() + 4); String codeValue = this.valueToName.get(code); sb.append(codeValue); value = value.substring(pos + preFix.length() + 4, value.length()); } sb.append(value); return sb.toString(); } /* ******************************************** * method name : getHex * description : 将含生僻字的字符串转化成含16进制编码的字符串 * @return : String * @param : @param name * @param : @return * modified : ncc , 2017-12-20 * @see : * ********************************************/ @SuppressWarnings("static-access") public String getHex(String name) { StringBuffer sb = new StringBuffer(); for (int i = 0; i < name.length(); i++) { String value = this.nameToValue.get(name.substring(i, i + 1)); if (value == null) { sb.append(name.substring(i, i + 1)); } else { sb.append(preFix + value); } } return sb.toString(); } public static void main(String[] args) { RareWordUtil cu = RareWordUtil.getInstance(); String name = "王喆昊"; name = cu.getHex(name); System.out.println("Cent2Dollar(1) = " + name); name = cu.getRareWord(name); System.out.println("Cent2Dollar(1) = " + name); } }
?
?代码中用的的txt文件见附件。