解码由php保存的未知字符集文本

时间:2013-11-27 03:35:34

标签: java php character-encoding

我在MySQL中有一些记录,例如

Vận hành linh hoạt trong má»i Ä‘k giao thông  

以十六进制格式

  

56 c3 a1 c2 ba c2 ad 6e 20 68 c3 83 c2 a0 6e 68 20 6c 69 6e 68 20 68   6f c3 a1 c2 ba c2 a1 74 20 74 72 6f 6e 67 20 6d c3 a1 c2 bb c2 8d 69   20 c3 84 e2 80 98 6b 20 67 69 61 6f 20 74 68 c3 83 c2 b4 6e 67 20

hex dump

我不知道PHP如何保存它,但是从Java MySQL Connector读取它显示了一些奇怪的特性。我可以通过

来显示原文
copy the text above --> Notepad++ - Encoding in ASCII --> Paste text
--> Encoding in UTF-8

原文应为:

Vận hành linh hoạt trong mọi đk giao thông

我知道问题是PHP保存了不正确的文本格式,但有没有办法在Java中正确解码?

1 个答案:

答案 0 :(得分:1)

你确定十六进制是完全正确吗?这就是我做的......

String MESS = "56 c3 a1 c2 ba c2 ad 6e 20 68 c3 83 c2 a0 6e 68 20 6c 69 6e 68 20 68 6f c3 a1 c2 ba c2 a1 74 20 74 72 6f 6e 67 20 6d c3 a1 c2 bb c2 8d 69 20 c3 84 e2 80 98 6b 20 67 69 61 6f 20 74 68 c3 83 c2 b4 6e 67 20";
String[] hexchars = MESS.split(" ");
byte[] buf = new byte[hexchars.length];
for (int i = 0; i < hexchars.length; i++) {
    buf[i] = (byte) Integer.parseInt(hexchars[i], 16);
}

try {
    String s1 = new String(buf, "UTF-8");  // First encode UTF-8
    buf = s1.getBytes("cp1252");           // ...then translate to cp1252
    s1 = new String(buf, "UTF-8");         // ...then back to UTF-8
    System.out.println(s1);
} catch (UnsupportedEncodingException e) {
    e.printStackTrace();
}

打印结果是:

Vậnhànhlinhhouạttrongm ?iđkgiaothông

几乎正确。除了mọ​​i的解码之外它是不正确的,这使我怀疑你提供的十六进制可能不正确。如果您100%确定它是正确的,我可以尝试多一点来解码它。

更新: 以下是我的进一步想法:

  • 您需要找出MySQL本身(数据库)的编码设置。
  • 您需要找出PHP设置的编码方式
    • 可能在PHP.INI
    • 可能在填充表格的页面的HTML元数据中设置。
  • 您需要了解如果使用
  • 运行PHP MySQL驱动程序的任何编码

只有这样才有可能将MySQL Connector / J设置为正确的编码,然后可能在Java中应用第二次转换。