java实现js的中一样的函数方法
发布网友
发布时间:2022-05-12 21:30
我来回答
共1个回答
热心网友
时间:2022-04-24 19:48
package know.t5;
public class UrlEncodeWithoutASCII {
public static String encode(String input)
{
StringBuilder sb = new StringBuilder(input.length() + 16);
appendEncoded(sb, input);
return sb.toString();
}
public static StringBuilder appendEncoded(StringBuilder sb, String input)
{
int safe[] = SAFE_ASCII;
int i = 0;
int c;
for(int len = input.length(); i < len; i += Character.charCount(c))
{
c = input.codePointAt(i);
if(c <= 127)
{
if(safe[c] != 0)
sb.append((char)c);
else
appendSingleByteEncoded(sb, c);
} else
{
appendMultiByteEncoded(sb, c);
}
}
return sb;
}
private static final void appendSingleByteEncoded(StringBuilder sb, int value)
{
sb.append('%');
sb.append(HEX[value >> 4]);
sb.append(HEX[value & 15]);
}
private static final void appendMultiByteEncoded(StringBuilder sb, int value)
{
if(value < 2048)
{
appendSingleByteEncoded(sb, 192 | value >> 6);
appendSingleByteEncoded(sb, 128 | value & 63);
} else
if(value < 65536)
{
appendSingleByteEncoded(sb, 224 | value >> 12);
appendSingleByteEncoded(sb, 128 | value >> 6 & 63);
appendSingleByteEncoded(sb, 128 | value & 63);
} else
{
appendSingleByteEncoded(sb, 240 | value >> 18);
appendSingleByteEncoded(sb, 128 | value >> 12 & 63);
appendSingleByteEncoded(sb, 128 | value >> 6 & 63);
appendSingleByteEncoded(sb, 128 | value & 63);
}
}
private static final int SAFE_ASCII[];
private static final char HEX[] = "0123456789ABCDEF".toCharArray();
static
{
SAFE_ASCII = new int[128];
for(int i = 97; i <= 122; i++)
SAFE_ASCII[i] = 1;
for(int i = 65; i <= 90; i++)
SAFE_ASCII[i] = 1;
for(int i = 39; i <= 57; i++){
if(i==43||i==44||i==47)
continue;
SAFE_ASCII[i] = 1;
}
SAFE_ASCII[33] = 1;
SAFE_ASCII[95] = 1;
SAFE_ASCII[126] = 1;
}
}
encodeURIComponent函数可以用上面的类encode方法代替,unescape可以用任意URLDecoder代替,btoa可以用任意Base64工具代替(参数为byte[]时需将字符串按utf8编码),这个方案你可以试试效果