1. package cn.cnnic.ops.udf;
  2.  
  3. public class GetPunycodeFromChinese {
  4. static int TMIN = 1;
  5. static int TMAX = 26;
  6. static int BASE = 36;
  7. static int INITIAL_N = 128;
  8. static int INITIAL_BIAS = 72;
  9. static int DAMP = 700;
  10. static int SKEW = 38;
  11. static char DELIMITER = '-';
  12. static String PUNY_PREFIX = "xn--";
  13. static char DOT = '.';
  14. static String SPLIT_DOT = "\\.";
  15.  
  16. public static void main(String[] args) {
  17. String str = "互联网络信息中心.中国";
  18. GetPunycodeFromChinese gpfc = new GetPunycodeFromChinese();
  19. System.out.println(gpfc.evaluate(str));
  20. }
  21.  
  22. /**
  23. *
  24. * @param txt
  25. * @return
  26. */
  27. public String evaluate(String txt) {
  28. String strResult=txt;
  29. try {
  30. strResult = fromChineseToPunycode(txt.toString().trim());
  31. } catch (Exception e) {
  32. e.printStackTrace();
  33. }
  34. return strResult;
  35. }
  36.  
  37. /**
  38. *
  39. * @param input
  40. * @return
  41. * @throws Exception
  42. */
  43. public String fromChineseToPunycode(String input) throws Exception{
  44. if(input == null || input.equalsIgnoreCase("")){
  45. return "";
  46. }else if(input.indexOf(DOT) < 0){
  47. return PUNY_PREFIX+fromChineseToPunycodeUnit(input);
  48. }else if(input.indexOf(DOT) > 0){
  49. String[] arr = input.split(SPLIT_DOT);
  50. String result="";
  51. for(int index = 0; index<arr.length;index++){
  52. result = result + PUNY_PREFIX +fromChineseToPunycodeUnit(arr[index])+".";
  53. }
  54. return result.substring(0, result.length()-1);
  55. }
  56. return input;
  57. }
  58.  
  59. /**
  60. *
  61. * @param input
  62. * @return
  63. * @throws Exception
  64. */
  65. public String fromChineseToPunycodeUnit(String input) throws Exception {
  66. int n = INITIAL_N;
  67. int delta = 0;
  68. int bias = INITIAL_BIAS;
  69. StringBuilder output = new StringBuilder();
  70. int b = 0;
  71. for (int i = 0; i < input.length(); i++) {
  72. char c = input.charAt(i);
  73. if (isBasic(c)) {
  74. output.append(c);
  75. b++;
  76. }
  77. }
  78. if (b > 0) {
  79. output.append(DELIMITER);
  80. }
  81. int h = b;
  82. while (h < input.length()) {
  83. int m = Integer.MAX_VALUE;
  84. // Find the minimum code point >= n
  85. for (int i = 0; i < input.length(); i++) {
  86. int c = input.charAt(i);
  87. if (c >= n && c < m) {
  88. m = c;
  89. }
  90. }
  91. if (m - n > (Integer.MAX_VALUE - delta) / (h + 1)) {
  92. throw new Exception("OVERFLOW");
  93. }
  94. delta = delta + (m - n) * (h + 1);
  95. n = m;
  96. for (int j = 0; j < input.length(); j++) {
  97. int c = input.charAt(j);
  98. if (c < n) {
  99. delta++;
  100. if (0 == delta) {
  101. throw new Exception("OVERFLOW");
  102. }
  103. }
  104. if (c == n) {
  105. int q = delta;
  106. for (int k = BASE;; k += BASE) {
  107. int t;
  108. if (k <= bias) {
  109. t = TMIN;
  110. } else if (k >= bias + TMAX) {
  111. t = TMAX;
  112. } else {
  113. t = k - bias;
  114. }
  115. if (q < t) {
  116. break;
  117. }
  118. output.append((char) digit2codepoint(t + (q - t) % (BASE - t)));
  119. q = (q - t) / (BASE - t);
  120. }
  121. output.append((char) digit2codepoint(q));
  122. bias = adapt(delta, h + 1, h == b);
  123. delta = 0;
  124. h++;
  125. }
  126. }
  127. delta++;
  128. n++;
  129. }
  130. return output.toString();
  131. }
  132.  
  133. /**
  134. *
  135. * @param delta
  136. * @param numpoints
  137. * @param first
  138. * @return
  139. */
  140. public int adapt(int delta, int numpoints, boolean first) {
  141. if (first) {
  142. delta = delta / DAMP;
  143. } else {
  144. delta = delta / 2;
  145. }
  146. delta = delta + (delta / numpoints);
  147. int k = 0;
  148. while (delta > ((BASE - TMIN) * TMAX) / 2) {
  149. delta = delta / (BASE - TMIN);
  150. k = k + BASE;
  151. }
  152. return k + ((BASE - TMIN + 1) * delta) / (delta + SKEW);
  153. }
  154.  
  155. /**
  156. *
  157. * @param c
  158. * @return
  159. */
  160. public boolean isBasic(char c) {
  161. return c < 0x80;
  162. }
  163.  
  164. /**
  165. *
  166. * @param d
  167. * @return
  168. * @throws Exception
  169. */
  170. public int digit2codepoint(int d) throws Exception {
  171. if (d < 26) {
  172. // 0..25 : 'a'..'z'
  173. return d + 'a';
  174. } else if (d < 36) {
  175. // 26..35 : '0'..'9';
  176. return d - 26 + '0';
  177. } else {
  178. throw new Exception("BAD_INPUT");
  179. }
  180. }
  181.  
  182. /**
  183. *
  184. * @param c
  185. * @return
  186. * @throws Exception
  187. */
  188. public int codepoint2digit(int c) throws Exception {
  189. if (c - '0' < 10) {
  190. // '0'..'9' : 26..35
  191. return c - '0' + 26;
  192. } else if (c - 'a' < 26) {
  193. // 'a'..'z' : 0..25
  194. return c - 'a';
  195. } else {
  196. throw new Exception("BAD_INPUT");
  197. }
  198. }
  199. }

【参考】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. Maven的settings.xml文件结构之mirrors

    Maven的远程库提供大量构件,供Maven项目直接下载使用.对于一个Maven项目,如果没有特别声明,默认使用Maven的central库,url如下: http://repo.maven.apac ...

  2. Theano Logistic Regression

    原理 逻辑回归的推理过程能够參考这篇文章:http://blog.csdn.net/zouxy09/article/details/20319673,当中包括了关于逻辑回归的推理,梯度下降以及pyth ...

  3. Oracle内存管理(之二)

    [深入解析--eygle] 学习笔记 1.2.2 UGA和CGA UGA(用户全局区)由用户会话数据.游标状态和索引区组成.在共享server模式下,一个共享服务进程被多个用户进程共享,此时UGA是S ...

  4. python之函数用法bin()

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python之函数用法bin() #bin() #说明:一个整数转换为一个二进制字符串 ''' bin(.. ...

  5. 用C/C++开发android应用

    在某些情况下,比如原来与很多c/c++的代码, 可能希望采用c/c++编写android应用程序.在这种情况下,一般使用NDK.但是由于android直提供了java接口,因此不能够直接调用andro ...

  6. HDUOJ---2955 Robberies

    Robberies Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  7. HDUOJ-------(1022)Train Problem I

    Train Problem I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  8. VI打开和编辑多个文件的命令

    http://www.05112.org/school/xtrm/linux/2013/0625/4280.htmlVI打开和编辑多个文件的命令 可分两种情况: 1.在同一窗口中打开多个文件:   v ...

  9. 区块链的java实现

    原文地址:http://blog.csdn.net/xiangzhihong8/article/details/53931213 本文90%来着于翻译,原文地址:http://java-lang-pr ...

  10. SSH2框架实现注冊发短信验证码实例

    这两天開始写程序了,让用SSH2框架,曾经没有接触过Java项目更没有接触过SSH2框架,所以用注冊開始了我Java之旅.后来发现,后台代码挺easy理解的,跟.net的差点儿相同.就是层与层之间的调 ...