【问题标题】:Decode unknow charset text save by php解码由php保存的未知字符集文本
【发布时间】:2013-11-27 03:35:34
【问题描述】:

我在 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

我不知道 PHP 是如何保存它的,但是从 Java MySQL 连接器中读取它会显示一些奇怪的字符。我可以通过

让它显示原始文本
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 中正确解码?

【问题讨论】:

  • 看到这个answer
  • 这里see this
  • @brettw @XtraCode:是的,我已经尝试过类似:new String(res.getBytes(),"UTF-8") 之类的方法,但没有成功。我找到的最相似的主题是 stackoverflow.com/questions/7861803/… ,但我仍然无法使其在 Python 和 Java 中工作。

标签: java php character-encoding


【解决方案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ận hành linh hoạt trong m�?i đk giao thông

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

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

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

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

【讨论】:

  • 是的,我已经附上了 Navicat-Mysql 的 hexdump,看起来 hex 是正确的。
  • PHP 代码是否也能正确读回数据?还是只插入数据从不读取?
  • 是的,PHP 读取正确(注意:我在 Notepad++ 上工作以获取原始文本的顺序 - 来自问题)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-28
  • 1970-01-01
  • 2015-05-01
  • 2013-03-03
  • 2013-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多