由于工作,需要使用SNMP协议取设备的数据,但是遇到中文时,尴尬出现了,一串字母数字夹带着冒号的数据,怀疑了一堆字符编码,搞了好久最后放弃了,只得强行不使用中文。一段时间后,这个问题重新出现。。。算了,估计大家不想看我唠叨,我们来解决它!
//问题原因:OctetString Class 中这两个方法 public boolean isPrintable() { for (int i = 0; i < value.length; i++) { char c = (char)value[i]; if (((Character.isISOControl(c)) || ((value[i] & 0xFF) >= 128)) && (!Character.isWhitespace(c))) { return false; } } return true; } public String toString() { if (isPrintable()) { return new String(value); } return toHexString(); }
怎么解决呢,作者找到一条路后翻出好几个解决办法,一一给大家介绍
方法一:
1 //修改snmp4j.jar toString方法 2 public String toString() 3 { 4 try 5 { 6 return new String(value, "iso8859_1"); 7 } 8 catch (Exception localException) 9 { 10 localException.printStackTrace(); 11 } 12 return ""; 13 }
方法二:
1 public static String getFormatStr(String octetString){ 2 try{ 3 if(!octetString.contains(":")) { 4 return octetString; 5 } 6 String[] temps = octetString.split(":"); 7 byte[] bs = new byte[temps.length]; 8 for(int i=0;i<temps.length;i++) 9 bs[i] = (byte)Integer.parseInt(temps[i],16); 10 return new String(bs); 11 }catch(Exception e){ 12 return null; 13 } 14 } 15 16 str = getFormatStr(str);
方法三:
1 str = new String(OctetString.fromHexString(stsr).getValue())
好了,暂时作者想到的解决办法就这么多,想深入了解的朋友可以根据下方给出的三种编码格式自行钻研。
涉及到的编码:ASCⅡ、ISO8859_1、GB2312