在做建行支付对接时,传的参数中的汉字,需要用escape()编码
但我是通过Java和.Net后台直接请求,因此需要在后台实现类似的功能
所以在此贴上代码
Java
/**
* 汉字编码,实现js escape()
*
* @param src
* @return
*/
public static String escape(String src) {
int i;
char j;
StringBuffer tmp = new StringBuffer();
tmp.ensureCapacity(src.length() * 6);
for (i = 0; i < src.length(); i++) {
j = src.charAt(i);
if (Character.isDigit(j) || Character.isLowerCase(j)
|| Character.isUpperCase(j))
tmp.append(j);
else if (j < 256) {
tmp.append("%");
if (j < 16)
tmp.append("0");
tmp.append(Integer.toString(j, 16));
} else {
tmp.append("%u");
tmp.append(Integer.toString(j, 16));
}
}
return tmp.toString();
}
/**
* 汉字解码 实现js unescap()
*
* @param src
* @return
*/
public static String unescape(String src) {
StringBuffer tmp = new StringBuffer();
tmp.ensureCapacity(src.length());
int lastPos = 0, pos = 0;
char ch;
while (lastPos < src.length()) {
pos = src.indexOf("%", lastPos);
if (pos == lastPos) {
if (src.charAt(pos + 1) == 'u') {
ch = (char) Integer.parseInt(src
.substring(pos + 2, pos + 6), 16);
tmp.append(ch);
lastPos = pos + 6;
} else {
ch = (char) Integer.parseInt(src
.substring(pos + 1, pos + 3), 16);
tmp.append(ch);
lastPos = pos + 3;
}
} else {
if (pos == -1) {
tmp.append(src.substring(lastPos));
lastPos = src.length();
} else {
tmp.append(src.substring(lastPos, pos));
lastPos = pos;
}
}
}
return tmp.toString();
}
.Net
/// <summary>
/// escape加密
/// </summary>
/// <returns></returns>
public string Escape(string s)
{
StringBuilder sb = new StringBuilder();
byte[] byteArr = System.Text.Encoding.Unicode.GetBytes(s);
for (int i = 0; i < byteArr.Length; i += 2)
{
sb.Append("%u");
sb.Append(byteArr[i + 1].ToString("X2"));//把字节转换为十六进制的字符串表现形式
sb.Append(byteArr[i].ToString("X2"));
}
return sb.ToString();
}
/// <summary>
/// unescape解密
/// </summary>
/// <returns></returns>
private string unescape(string s)
{
string str = s.Remove(0, 2);//删除最前面两个"%u"
string[] strArr = str.Split(new string[] { "%u" }, StringSplitOptions.None);//以子字符串"%u"分隔
byte[] byteArr = new byte[strArr.Length * 2];
for (int i = 0, j = 0; i < strArr.Length; i++, j += 2)
{
byteArr[j + 1] = Convert.ToByte(strArr[i].Substring(0, 2), 16); //把十六进制形式的字串符串转换为二进制字节
byteArr[j] = Convert.ToByte(strArr[i].Substring(2, 2), 16);
}
str = System.Text.Encoding.Unicode.GetString(byteArr); //把字节转为unicode编码
return str;
}