获取Java原始字符串,并在旧版应用程序中以未知格式编码

时间:2019-01-30 18:55:22

标签: java utf-8 character-encoding special-characters

我正在尝试获取以未知格式编码的原始字符串。我不知道它在旧版应用程序中使用什么编码。

例如,用户在旧版系统中输入Special[Home]^,它将“ Special¢Home!¬”保存到DB2数据库中。

它可以在传统系统中正常工作,在该系统中,它以正确的格式(Special[Home]^进行编码和解码)。

当我尝试从Java应用读取相同的数据Special[Home]^时,其读为Special¢Home!¬

我也尝试使用下面显示的代码找到正确的编码,但是不起作用。任何帮助将不胜感激。

@Test
public void charsetTest() {
  String encodedString = "Special¢Home!¬";
  String originalString = "Special[Home]^";
  Map<String, Charset> availableCharsets = Charset.availableCharsets();
  Set<String> keySet = availableCharsets.keySet();
  for (String key : keySet) {
    Charset charset = availableCharsets.get(key);
    try {
      String decodedString = new String(charset.encode(encodedString).array(), charset);
      System.out.println(decodedString + ":  " + charset);
      if (originalString.equals(decodedString)) {
        System.out.println("match found: -> " + originalString + ":  " + charset);
      }
    } catch (UnsupportedOperationException e) {
      /*  e.printStackTrace(); */
    }
  }
}

1 个答案:

答案 0 :(得分:1)

考虑到双重转换的可能性,请尝试以下代码:

public static void main(String[] arg) {
  String encodedString = "Special¢Home!¬";
  String originalString = "Special[Home]^";
  Map<String, Charset> availableCharsets = Charset.availableCharsets();
  Set<String> keySet = availableCharsets.keySet();
  for (String key : keySet) {
    for (String key2 : keySet) {
      Charset charset = availableCharsets.get(key);
      Charset charset2 = availableCharsets.get(key2);
      try {
        String decodedString = new String(charset.encode(encodedString).array(), charset2);
        if (originalString.equals(decodedString)) {
          System.out.println(originalString + ":  " + charset + " -> " + charset2);
        }
      } catch (UnsupportedOperationException e) {
        /*  e.printStackTrace(); */
      }
    }
  }
}

它会产生一些组合。

output:
Special[Home]^:  IBM-Thai -> x-IBM1166
Special[Home]^:  IBM-Thai -> x-IBM875
Special[Home]^:  IBM01140 -> IBM01148
Special[Home]^:  IBM01140 -> IBM500
Special[Home]^:  IBM01140 -> IBM870
...