摘自:http://www.koders.com/java/fidA5FC1F237C9D005FD1BAD91769F8CF107601BA28.aspx
1、
class PunycodeException
extends Exception
{
public static String OVERFLOW = "Overflow.";
public static String BAD_INPUT = "Bad input.";
/**
* Creates a new PunycodeException.
*
* @param m message.
*/
public PunycodeException(String m)
{
super(m);
}
}
2、
class Punycode
{
/* Punycode parameters */
final static int TMIN = 1;
final static int TMAX = 26;
final static int BASE = 36;
final static int INITIAL_N = 128;
final static int INITIAL_BIAS = 72;
final static int DAMP = 700;
final static int SKEW = 38;
final static char DELIMITER = '-';
/**
* Punycodes a unicode string.
*
* @param input Unicode string.
* @return Punycoded string.
*/
public static String encode(String input)
throws PunycodeException
{
int n = INITIAL_N;
int delta = 0;
int bias = INITIAL_BIAS;
StringBuilder output = new StringBuilder();
// Copy all basic code points to the output
int b = 0;
for (int i = 0; i < input.length(); i++) {
char c = input.charAt(i);
if (isBasic(c)) {
output.append(c);
b++;
}
}
// Append delimiter
if (b > 0) {
output.append(DELIMITER);
}
int h = b;
while (h < input.length()) {
int m = Integer.MAX_VALUE;
// Find the minimum code point >= n
for (int i = 0; i < input.length(); i++) {
int c = input.charAt(i);
if (c >= n && c < m) {
m = c;
}
}
if (m - n > (Integer.MAX_VALUE - delta) / (h + 1)) {
throw new PunycodeException(PunycodeException.OVERFLOW);
}
delta = delta + (m - n) * (h + 1);
n = m;
for (int j = 0; j < input.length(); j++) {
int c = input.charAt(j);
if (c < n) {
delta++;
if (0 == delta) {
throw new PunycodeException(PunycodeException.OVERFLOW);
}
}
if (c == n) {
int q = delta;
for (int k = BASE;; k += BASE) {
int t;
if (k <= bias) {
t = TMIN;
} else if (k >= bias + TMAX) {
t = TMAX;
} else {
t = k - bias;
}
if (q < t) {
break;
}
output.append((char) digit2codepoint(t + (q - t) % (BASE - t)));
q = (q - t) / (BASE - t);
}
output.append((char) digit2codepoint(q));
bias = adapt(delta, h + 1, h == b);
delta = 0;
h++;
}
}
delta++;
n++;
}
return output.toString();
}
/**
* Decode a punycoded string.
*
* @param input Punycode string
* @return Unicode string.
*/
public static String decode(String input)
throws PunycodeException
{
int n = INITIAL_N;
int i = 0;
int bias = INITIAL_BIAS;
StringBuilder output = new StringBuilder();
int d = input.lastIndexOf(DELIMITER);
if (d > 0) {
for (int j = 0; j < d; j++) {
char c = input.charAt(j);
if (!isBasic(c)) {
throw new PunycodeException(PunycodeException.BAD_INPUT);
}
output.append(c);
}
d++;
} else {
d = 0;
}
while (d < input.length()) {
int oldi = i;
int w = 1;
for (int k = BASE; ; k += BASE) {
if (d == input.length()) {
throw new PunycodeException(PunycodeException.BAD_INPUT);
}
int c = input.charAt(d++);
int digit = codepoint2digit(c);
if (digit > (Integer.MAX_VALUE - i) / w) {
throw new PunycodeException(PunycodeException.OVERFLOW);
}
i = i + digit * w;
int t;
if (k <= bias) {
t = TMIN;
} else if (k >= bias + TMAX) {
t = TMAX;
} else {
t = k - bias;
}
if (digit < t) {
break;
}
w = w * (BASE - t);
}
bias = adapt(i - oldi, output.length()+1, oldi == 0);
if (i / (output.length() + 1) > Integer.MAX_VALUE - n) {
throw new PunycodeException(PunycodeException.OVERFLOW);
}
n = n + i / (output.length() + 1);
i = i % (output.length() + 1);
output.insert(i, (char) n);
i++;
}
return output.toString();
}
public final static int adapt(int delta, int numpoints, boolean first)
{
if (first) {
delta = delta / DAMP;
} else {
delta = delta / 2;
}
delta = delta + (delta / numpoints);
int k = 0;
while (delta > ((BASE - TMIN) * TMAX) / 2) {
delta = delta / (BASE - TMIN);
k = k + BASE;
}
return k + ((BASE - TMIN + 1) * delta) / (delta + SKEW);
}
public final static boolean isBasic(char c)
{
return c < 0x80;
}
public final static int digit2codepoint(int d)
throws PunycodeException
{
if (d < 26) {
// 0..25 : 'a'..'z'
return d + 'a';
} else if (d < 36) {
// 26..35 : '0'..'9';
return d - 26 + '0';
} else {
throw new PunycodeException(PunycodeException.BAD_INPUT);
}
}
public final static int codepoint2digit(int c)
throws PunycodeException
{
if (c - '0' < 10) {
// '0'..'9' : 26..35
return c - '0' + 26;
} else if (c - 'a' < 26) {
// 'a'..'z' : 0..25
return c - 'a';
} else {
throw new PunycodeException(PunycodeException.BAD_INPUT);
}
}
}
分享到:
相关推荐
基于PHP的中文域名转码系统 基于PHP的中文域名转码系统HTML5版源码.zip 基于PHP的中文域名转码系统HTML5版源码.zip 基于PHP的中文域名转码系统HTML5版源码.zip 基于PHP的中文域名转码系统HTML5版源码.zip 基于PHP的...
基于PHP的中文域名转码系统HTML5版v1.2源码.zip 基于PHP的中文域名转码系统HTML5版v1.2源码.zip 基于PHP的中文域名转码系统HTML5版v1.2源码.zip 基于PHP的中文域名转码系统HTML5版v1.2源码.zip 基于PHP的中文域名...
asp源码—asp中文域名转码查询工具 v1.0版.zip asp源码—asp中文域名转码查询工具 v1.0版.zip asp源码—asp中文域名转码查询工具 v1.0版.zip asp源码—asp中文域名转码查询工具 v1.0版.zip asp源码—asp中文域名转码...
中文域名转码asp版,近日都在哭着喊着要这东西,写了一个这个是ASP版的,其实早前我已经发布了一个翻译国外的PHP版本的,可能时间太久远了,很多人找不到了
ip.asp:Ping域名的ASP样式代码(包含中文域名自动转码)MX.asp:查询域名MX记录的ASP样式代码(包含中文域名自动转码)ASPDNS.DLL:Ping组件ASPMX.DLL:查询MX组件ScptUtl.DLL:自动转码组件(支持多种编码互转...
基于PHP的中文域名punycode转码工具源码.zip 基于PHP的中文域名punycode转码工具源码.zip 基于PHP的中文域名punycode转码工具源码.zip 基于PHP的中文域名punycode转码工具源码.zip 基于PHP的中文域名punycode转码...
PHP实例开发源码—中文域名转码系统HTML5版 v1.2.zip PHP实例开发源码—中文域名转码系统HTML5版 v1.2.zip PHP实例开发源码—中文域名转码系统HTML5版 v1.2.zip
java视频上传,转码,截图,播放实现java视频上传,转码,截图,播放实现java视频上传,转码,截图,播放实现
中文域名转码ASP组件 本地编码解码实现 非远程获取 比如把 中文.com 转行成 abcd-rrhhgf.com 这样的功能 对实现中文二级域名很有帮助
ASP实例开发源码—中文域名转码系统 php版.zip ASP实例开发源码—中文域名转码系统 php版.zip ASP实例开发源码—中文域名转码系统 php版.zip
落伍代码版近日都在哭着喊着要这东西,写了一个 这个是ASP版的,其实早前空心菜已经发布了一个翻译国外的PHP版本的 可能时间太久远了,很多人找不到了 程序演示:http://www.qqcn.cc/zhuanma ...
10.11更新V1.2版本: ... 安装方法: ...直接上传到空间即可使用输入中文域名即可解码成英文域名例如:站长之家.com可以解码成xn--9iqy04aglyxux.com 输入xn--9iqy04aglyxux.com同样可以解成站长之家.com
ASP实例开发源码—asp中文域名转码查询工具 v1.0版.zip ASP实例开发源码—asp中文域名转码查询工具 v1.0版.zip ASP实例开发源码—asp中文域名转码查询工具 v1.0版.zip
此代码不包含上传视频到oss存储.
ASP源码—中文域名转码系统 php版.zip
java转码 工具类,
基于ASP的中文域名转码系统 php版.zip
基于PHP的中文域名转码系统HTML5版.zip
java使用ffmpeg实现视频转码
ASP源码—中文域名转码查询工具 v1.0版.zip