package cn.cnnic.ops.udf;

public class GetPunycodeFromChinese {
static int TMIN = 1;
static int TMAX = 26;
static int BASE = 36;
static int INITIAL_N = 128;
static int INITIAL_BIAS = 72;
static int DAMP = 700;
static int SKEW = 38;
static char DELIMITER = '-';
static String PUNY_PREFIX = "xn--";
static char DOT = '.';
static String SPLIT_DOT = "\\."; public static void main(String[] args) {
String str = "互联网络信息中心.中国";
GetPunycodeFromChinese gpfc = new GetPunycodeFromChinese();
System.out.println(gpfc.evaluate(str));
} /**
*
* @param txt
* @return
*/
public String evaluate(String txt) {
String strResult=txt;
try {
strResult = fromChineseToPunycode(txt.toString().trim());
} catch (Exception e) {
e.printStackTrace();
}
return strResult;
} /**
*
* @param input
* @return
* @throws Exception
*/
public String fromChineseToPunycode(String input) throws Exception{
if(input == null || input.equalsIgnoreCase("")){
return "";
}else if(input.indexOf(DOT) < 0){
return PUNY_PREFIX+fromChineseToPunycodeUnit(input);
}else if(input.indexOf(DOT) > 0){
String[] arr = input.split(SPLIT_DOT);
String result="";
for(int index = 0; index<arr.length;index++){
result = result + PUNY_PREFIX +fromChineseToPunycodeUnit(arr[index])+".";
}
return result.substring(0, result.length()-1);
}
return input;
} /**
*
* @param input
* @return
* @throws Exception
*/
public String fromChineseToPunycodeUnit(String input) throws Exception {
int n = INITIAL_N;
int delta = 0;
int bias = INITIAL_BIAS;
StringBuilder output = new StringBuilder();
int b = 0;
for (int i = 0; i < input.length(); i++) {
char c = input.charAt(i);
if (isBasic(c)) {
output.append(c);
b++;
}
}
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 Exception("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 Exception("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();
} /**
*
* @param delta
* @param numpoints
* @param first
* @return
*/
public 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);
} /**
*
* @param c
* @return
*/
public boolean isBasic(char c) {
return c < 0x80;
} /**
*
* @param d
* @return
* @throws Exception
*/
public int digit2codepoint(int d) throws Exception {
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 Exception("BAD_INPUT");
}
} /**
*
* @param c
* @return
* @throws Exception
*/
public int codepoint2digit(int c) throws Exception {
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 Exception("BAD_INPUT");
}
}
}

【参考】http://blog.csdn.net/a19881029/article/details/18262671

中文转Punycode的更多相关文章

  1. Punycode与中文互转

    Punycode是一个根据RFC 3492标准而制定的编码系统,主要用于把域名从地方语言所采用的Unicode编码转换成为可用于DNS系统的编码 "中文域名"不被标准的解析服务器支 ...

  2. 如何实现Punycode中文域名转码

    如果你见过中文域名应该会觉得很奇怪,为什么复制出来的域名变成一个很莫名其妙的字符串,比如这个秀恩爱的域名“郝越.我爱你”,实际显示的域名是 http://xn--vq3al9d.xn--6qq986b ...

  3. Punycode转中文

    package cn.cnnic.ops.udf; public class GetChineseFromPunycode { static int TMIN = 1; static int TMAX ...

  4. Python中文乱码

    1,注意:请使用智慧型浏览器 "CHROME" 配合理解和运作本文中提到的程序. 2,提示:谷歌的CHROME浏览器是迄今为止最智慧的浏览器,没有之一,只有第一. 3,谷歌的CHR ...

  5. Nginx中文域名配置

    Nginx虚拟主机上绑定一个带中文域名,比如linuxeye.中国,浏览器不能跳转. why? 因为操作系统的核心都是英文组成,DNS服务器的解析也是由英文代码交换,所以DNS服务器上并不支持直接的中 ...

  6. apache支持中文域名绑定,apache支持中文域名绑定,教你怎样让apache支持中文域名绑定

    摘要:apache支持中文域名绑定,apache支持中文域名绑定,教你怎样让apache支持中文域名绑定,根据本人实际经验,叫你如何让apache支持中文域名绑定,绝对管用的让apache支持中文域名 ...

  7. nginx配置中文域名解析

    当nginx配置文件中的default如果遇到解析指向问题的时候 ,配置了中文 没有用 后来找了找这个网址 http://tools.jb51.net/punycode/ 然后进去转换了一下 把 评估 ...

  8. CNAME关联githubPage域名及中文域名,创建个人网站

    对于前端开发来说,部署一个自己的个人网站部署服务器等比较麻烦,如果只是做静态页面的展示GitHubPage完全够用,而且有300M免费的空间,完全满足需求. 首先你要有GitHubPage项目,具体怎 ...

  9. Punycode

    Punycode是一个根据RFC 3492标准而制定的编码系统,主要用于把域名从地方语言所采用的Unicode编码转换成为可用于DNS系统的编码 “中文域名”不被标准的解析服务器支持,需转化为Puny ...

随机推荐

  1. java如何将毫秒数转为相应的年月日格式

    public static void main(String[] args) { Date date = new Date(); Long time = date.getTime(); System. ...

  2. Knockout.js 数据验证之插件版和无插件版

    本文我们将介绍使用 Knockout.js 实现一些基本的数据验证.就如我们在标题里提到的,我们会使用两种方法来创建数据验证方法. 使用自定义方法,不需要任何插件 最简单的方法是使用已有的插件 如果你 ...

  3. Hystrix的一个坑,queue中的run方法没有被执行?

    今天学的时候随手测了一下Hystrix的queue的异步执行,发现执行queue之后,还没有打印run方法中的内容,程序就结束了: import com.netflix.hystrix.Hystrix ...

  4. tomcat部署war包访问显示404

    在eclipse导出的maven项目war包,放到tomcat下启动,顺利启动且无报错,但是浏览器访问该项目时显示404 原因:未在server.xml中配置这几个项目,导致服务器查找不到 解决方法: ...

  5. 使用DotNetBarcode制作基本常用条码

    核心代码: /// <summary> /// 打印一维码 /// </summary> /// <param name="codeText"> ...

  6. iOS AppIcon尺寸和上传ITunes构建版本尺寸和iPhone屏幕尺寸

    避免忘记. 记录一下 App Icon: 29X2940X4058X5876X7687X8780X80120X120152X152167X167180X180 ITunes构建版本: 1242 x 2 ...

  7. [转]MegCup2015初赛题

    原文链接 门票题:数独有多少种对解线上没有1的填法? 这道"门票题"虽说只是"热身",但还是有一定难度的.共有245名选手通过各种方法拿到了门票.下面,我们就为 ...

  8. 将form表单转化为json数据

    参考地址:https://github.com/hongymagic/jQuery.serializeObject

  9. regular expression 练习

    练习有一个文件,文件名为output_1981.10.21.txt .下面使用Python: 读取文件名中的日期时间信息,并找出这一天是周几.将文件改名为output_YYYY-MM-DD-W.txt ...

  10. 关于PFM工作模式的一些资料总结

    一.PFM模式 为什么升压中用的多呢(http://bbs.eetop.cn/thread-357181-1-1.html) 1.PFM 对于Boost Converter来说可以把PWM固有的右半平 ...