中文转Punycode
- 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的更多相关文章
- Punycode与中文互转
Punycode是一个根据RFC 3492标准而制定的编码系统,主要用于把域名从地方语言所采用的Unicode编码转换成为可用于DNS系统的编码 "中文域名"不被标准的解析服务器支 ...
- 如何实现Punycode中文域名转码
如果你见过中文域名应该会觉得很奇怪,为什么复制出来的域名变成一个很莫名其妙的字符串,比如这个秀恩爱的域名“郝越.我爱你”,实际显示的域名是 http://xn--vq3al9d.xn--6qq986b ...
- Punycode转中文
package cn.cnnic.ops.udf; public class GetChineseFromPunycode { static int TMIN = 1; static int TMAX ...
- Python中文乱码
1,注意:请使用智慧型浏览器 "CHROME" 配合理解和运作本文中提到的程序. 2,提示:谷歌的CHROME浏览器是迄今为止最智慧的浏览器,没有之一,只有第一. 3,谷歌的CHR ...
- Nginx中文域名配置
Nginx虚拟主机上绑定一个带中文域名,比如linuxeye.中国,浏览器不能跳转. why? 因为操作系统的核心都是英文组成,DNS服务器的解析也是由英文代码交换,所以DNS服务器上并不支持直接的中 ...
- apache支持中文域名绑定,apache支持中文域名绑定,教你怎样让apache支持中文域名绑定
摘要:apache支持中文域名绑定,apache支持中文域名绑定,教你怎样让apache支持中文域名绑定,根据本人实际经验,叫你如何让apache支持中文域名绑定,绝对管用的让apache支持中文域名 ...
- nginx配置中文域名解析
当nginx配置文件中的default如果遇到解析指向问题的时候 ,配置了中文 没有用 后来找了找这个网址 http://tools.jb51.net/punycode/ 然后进去转换了一下 把 评估 ...
- CNAME关联githubPage域名及中文域名,创建个人网站
对于前端开发来说,部署一个自己的个人网站部署服务器等比较麻烦,如果只是做静态页面的展示GitHubPage完全够用,而且有300M免费的空间,完全满足需求. 首先你要有GitHubPage项目,具体怎 ...
- Punycode
Punycode是一个根据RFC 3492标准而制定的编码系统,主要用于把域名从地方语言所采用的Unicode编码转换成为可用于DNS系统的编码 “中文域名”不被标准的解析服务器支持,需转化为Puny ...
随机推荐
- Maven的settings.xml文件结构之mirrors
Maven的远程库提供大量构件,供Maven项目直接下载使用.对于一个Maven项目,如果没有特别声明,默认使用Maven的central库,url如下: http://repo.maven.apac ...
- Theano Logistic Regression
原理 逻辑回归的推理过程能够參考这篇文章:http://blog.csdn.net/zouxy09/article/details/20319673,当中包括了关于逻辑回归的推理,梯度下降以及pyth ...
- Oracle内存管理(之二)
[深入解析--eygle] 学习笔记 1.2.2 UGA和CGA UGA(用户全局区)由用户会话数据.游标状态和索引区组成.在共享server模式下,一个共享服务进程被多个用户进程共享,此时UGA是S ...
- python之函数用法bin()
# -*- coding: utf-8 -*- #python 27 #xiaodeng #python之函数用法bin() #bin() #说明:一个整数转换为一个二进制字符串 ''' bin(.. ...
- 用C/C++开发android应用
在某些情况下,比如原来与很多c/c++的代码, 可能希望采用c/c++编写android应用程序.在这种情况下,一般使用NDK.但是由于android直提供了java接口,因此不能够直接调用andro ...
- HDUOJ---2955 Robberies
Robberies Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- HDUOJ-------(1022)Train Problem I
Train Problem I Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- VI打开和编辑多个文件的命令
http://www.05112.org/school/xtrm/linux/2013/0625/4280.htmlVI打开和编辑多个文件的命令 可分两种情况: 1.在同一窗口中打开多个文件: v ...
- 区块链的java实现
原文地址:http://blog.csdn.net/xiangzhihong8/article/details/53931213 本文90%来着于翻译,原文地址:http://java-lang-pr ...
- SSH2框架实现注冊发短信验证码实例
这两天開始写程序了,让用SSH2框架,曾经没有接触过Java项目更没有接触过SSH2框架,所以用注冊開始了我Java之旅.后来发现,后台代码挺easy理解的,跟.net的差点儿相同.就是层与层之间的调 ...