用途:
国际化配置时,需要将中文转换成对应的unicode编码;比如
1000=memberId不能为空,转换成 1000=memberId\u4e0d\u80fd\u4e3a\u7a7a;
代码:
import java.io.*;
import java.net.URISyntaxException;
import java.net.URL;
/**
* 国际化文件翻译处理
*
* @author wael@yunio.com
* @date 2021/7/12
*/
public class Util {
public static void main(String[] args) throws IOException, URISyntaxException {
String originFilePath = "../classes/i18n/message.properties";
encode(originFilePath );
String testFilePath = "../classes/i18n/message_zh_CN.properties";
decode(testFilePath );
}
/**
* 将汉字转为unicode
*
* @param filePath 中文文件路径
* @throws URISyntaxException uri异常
* @throws IOException io异常
*/
public static void encode(String filePath) throws URISyntaxException, IOException {
URL resource = Util.class.getResource(filePath);
File file = new File(resource.toURI());
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(file), "GBK"));
StringBuilder builder = new StringBuilder();
String line;
while ((line = bufferedReader.readLine()) != null) {
String[] split = line.split("=");
String utf8Encode = toUnicodeEncode(split[1]);
String newLine = split[0] + "=" + utf8Encode;
builder.append(newLine).append("\n");
}
System.out.println(builder.toString());
}
/**
* 将可读的字符串转为 unicode,仅对汉字处理,英文字母及标点符合不做处理
*
* @param readableWord 可读的字符串
* @return unicode码
*/
public static String toUnicodeEncode(String readableWord) {
StringBuilder builder = new StringBuilder();
for (int i = 0; i < readableWord.length(); i++) {
char c = readableWord.charAt(i);
// 判断该char 是不是英文或者 ( )
if (c <= 127) {
builder.append(c);
} else {
String s = Integer.toHexString(c);
builder.append("\\u").append(s);
}
}
return builder.toString();
}
/**
* 将unicode转化为汉字编码
*
* @param testFilePath unicode编码的文件
* @throws URISyntaxException uri异常
* @throws IOException 文件异常
*/
public static void decode(String testFilePath ) throws URISyntaxException, IOException {
URL resource = Util.class.getResource(testFilePath);
File file = new File(resource.toURI());
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
StringBuilder builder = new StringBuilder();
String line;
while ((line = bufferedReader.readLine()) != null) {
String[] split = line.split("=");
builder.append(split[0]).append("=");
toUnicodeDecode(split[1], builder);
builder.append("\n");
}
System.out.println(builder.toString());
}
/**
* 递归处理每一行中的unicode编码
*
* @param unicodeToken unicode编码后的字符串
* @param value 值
*/
private static void toUnicodeDecode(String unicodeToken, StringBuilder value) {
if (unicodeToken.equals("")) {
return;
}
if (unicodeToken.startsWith("\\u")) {
String unicodeEncodeStr = unicodeToken.substring(0, 6);
value.append(dealUnicode(unicodeEncodeStr));
unicodeToken = unicodeToken.substring(6);
} else {
// 获取第一个/ 所在的下标
int index = unicodeToken.indexOf("\\");
if (index == -1) {
value.append(unicodeToken);
return;
} else {
String ascStr = unicodeToken.substring(0, index);
value.append(ascStr);
unicodeToken = unicodeToken.substring(index);
}
}
toUnicodeDecode(unicodeToken, value);
}
/**
* 将单个unicode吗转为汉字,即将4个16进制的字符串转为char
*
* @param unicodeEncodeStr unicode码
* @return 汉字
*/
private static String dealUnicode(String unicodeEncodeStr) {
String subValue = unicodeEncodeStr.substring(2);
// 16进制parse整形字符串
char valueChar = (char) Integer.parseInt(subValue, 16);
return new Character(valueChar).toString();
}
}
说明:
随意指定你的输入文本 originFilePath ,写入你的配置文件,形如 1000=xxx不能为空,然后执行 encode();输出的结果就是按行转换好的 encode编码文本;若对转译不放心,可以进行反向测试 ;将上一步的结果copy到 testFilePath 对应的文本中,然后执行 decode();输出的结果应和 originFilePath的文本一致;
若有对应的io异常,请检查指定的文件路径是否存在;