針對PHP不是UTF-8編碼導致的問題
public String md5(String txt) {
try{
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(txt.getBytes("GBK")); //問題主要出在這里,Java的字符串是unicode編碼,不受源碼文件的編碼影響;而PHP的編碼是和源碼文件的編碼一致,受源碼編碼影響。
StringBuffer buf=new StringBuffer();
for(byte b:md.digest()){
buf.append(String.format("%02x", b&0xff));
}
return buf.toString();
}catch( Exception e ){
e.printStackTrace();
return null;
}
}
或者直接使用PHP加密出來提供給JAVA使用
1、搭建好php的環境(不作介紹),寫一個通過提取get參數,並對值進行md5加密的頁面,如下
<?php echo strtoupper(md5($_GET["md5str"])); ?>
strtoupper是字母大寫轉換的函數
md5是MD5加密的函數
$_GET["md5str"]就是通過url帶一個md5str的參數,把值獲取並打印出來
2、JAVA頁面的提交方法
/**
* 用於做PHP的提交處理
* @param url
*/
public static String phpRequest(String url){
try{
HttpClient client = new HttpClient();
PostMethod post = new PostMethod(url);//使用POST方式提交數據
post.setRequestHeader("Content-Type","text/html; charset=UTF-8");
client.executeMethod(post);
String response = new String(post.getResponseBodyAsString().getBytes("8859_1"), "UTF-8");//打印結果頁面
post.releaseConnection();
return response;
} catch(IOException e){
e.printStackTrace();
return null;
}
}
需要提示的是,url記得先對中文參數進行一次UTF-8的編碼再傳到這個方法里面,這個方法對響應的結果做了反編碼的處理,最后就能正確的返回php MD5加密后的值了!