分享
 
 
 

Properties类不直接支持多语言属性文件的解决方法

王朝other·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

Properties类不直接支持多语言属性文件的解决方法

我们在开发的时候经常需要使用Properties存储需要的一些属性,我们往往将需要的属性存储在一个文件里面,然后使用Properties.load()方法加载那些属性,对于中国的用户,这些文件一般都是需要包含中文的,但是Properties类的load方法不支持中文或者其他的双字节的编码,我们往往需要使用Java的另外一个工具native2ascii将那个文件转换为unicode的转义序列的形式,但是这样一来文件的内容又不可读了,需要我们重复进行转换的工作,有时候很麻烦,笔者也经常碰到这个问题,后来查看了一下Properties的源代码,发现其实这个问题很好修正,因为Properties的load方法的第一行代码规定了文件的编码,我们简单的去掉那个编码即可。

JDK的源代码的第一行语句为:

BufferedReader in = new BufferedReader(new InputStreamReader(inStream, "8859_1"));

我们只去掉后面规定的那个编码就可以实现平台相关的编码方式,为了避免直接修改源代码,我们重新定义一个类,例如:

package org.jr.util;import java.util.*;import java.io.*;public class Properties extends java.util.Properties { private static final String keyValueSeparators = "=:

f"; private static final String strictKeyValueSeparators = "=:"; private static final String specialSaveChars = "=:

f#!"; private static final String whiteSpaceChars = "

f"; public synchronized void load(InputStream inStream) throws IOException { BufferedReader in = new BufferedReader(new InputStreamReader(inStream)); while (true) { // Get next line String line = in.readLine(); if (line == null) { return; } if (line.length() > 0) { // Continue lines that end in slashes if they are not comments char firstChar = line.charAt(0); if ( (firstChar != ´#´) && (firstChar != ´!´)) { while (continueLine(line)) { String nextLine = in.readLine(); if (nextLine == null) { nextLine = ""; } String loppedLine = line.substring(0, line.length() - 1); // Advance beyond whitespace on new line int startIndex = 0; for (startIndex = 0; startIndex < nextLine.length(); startIndex++) { if (whiteSpaceChars.indexOf(nextLine.charAt(startIndex)) == -1) { break; } } nextLine = nextLine.substring(startIndex, nextLine.length()); line = new String(loppedLine + nextLine); } // Find start of key int len = line.length(); int keyStart; for (keyStart = 0; keyStart < len; keyStart++) { if (whiteSpaceChars.indexOf(line.charAt(keyStart)) == -1) { break; } } // Blank lines are ignored if (keyStart == len) { continue; } // Find separation between key and value int separatorIndex; for (separatorIndex = keyStart; separatorIndex < len; separatorIndex++) { char currentChar = line.charAt(separatorIndex); if (currentChar == ´\´) { separatorIndex++; } else if (keyValueSeparators.indexOf(currentChar) != -1) { break; } } // Skip over whitespace after key if any int valueIndex; for (valueIndex = separatorIndex; valueIndex < len; valueIndex++) { if (whiteSpaceChars.indexOf(line.charAt(valueIndex)) == -1) { break; } } // Skip over one non whitespace key value separators if any if (valueIndex < len) { if (strictKeyValueSeparators.indexOf(line.charAt(valueIndex)) != -1) { valueIndex++; // Skip over white space after other separators if any } } while (valueIndex < len) { if (whiteSpaceChars.indexOf(line.charAt(valueIndex)) == -1) { break; } valueIndex++; } String key = line.substring(keyStart, separatorIndex); String value = (separatorIndex < len) ? line.substring(valueIndex, len) : ""; // Convert then store key and value key = loadConvert(key); value = loadConvert(value); put(key, value); } } } } /* * Returns true if the given line is a line that must * be appended to the next line */ private boolean continueLine (String line) { int slashCount = 0; int index = line.length() - 1; while((index >= 0) && (line.charAt(index--) == ´\´)) slashCount++; return (slashCount % 2 == 1); } /* * Converts encoded \uxxxx to unicode chars * and changes special saved chars to their original forms */ private String loadConvert (String theString) { char aChar; int len = theString.length(); StringBuffer outBuffer = new StringBuffer(len); for(int x=0; x<len; ) { aChar = theString.charAt(x++); if (aChar == ´\´) { aChar = theString.charAt(x++); if(aChar == ´u´) { // Read the xxxx int value=0; for (int i=0; i<4; i++) { aChar = theString.charAt(x++); switch (aChar) { case ´0´: case ´1´: case ´2´: case ´3´: case ´4´: case ´5´: case ´6´: case ´7´: case ´8´: case ´9´: value = (value << 4) + aChar - ´0´; break; case ´a´: case ´b´: case ´c´: case ´d´: case ´e´: case ´f´: value = (value << 4) + 10 + aChar - ´a´; break; case ´A´: case ´B´: case ´C´: case ´D´: case ´E´: case ´F´: value = (value << 4) + 10 + aChar - ´A´; break; default: throw new IllegalArgumentException( "Malformed \uxxxx encoding."); } } outBuffer.append((char)value); } else { if (aChar == ´t´) aChar = ´´; else if (aChar == ´r´) aChar = ´

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有