punycode和中文相互转换

资料出处:http://blog.csdn.net/jinjazz/article/details/3981795

问题来自论坛,google了一下有java的版本,随手翻译了一下,测试没有问题

java代码来自

http://www.koders.com/java/fidA5FC1F237C9D005FD1BAD91769F8CF107601BA28.aspx

感谢原作者

 

[c-sharp]  view plain copy
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Text;  
  4. using System.Runtime.InteropServices;  
  5. namespace ConsoleApplication9  
  6. {  
  7.     class Program  
  8.     {  
  9.         static void Main(string[] args)  
  10.         {  
  11.             string strPunycode ="xn--"+ Punycode.encode("近身剪");  
  12.             //xn--ferv28lgza  
  13.             string strChinese = Punycode.decode("ferv28lgza");  
  14.             //近身剪  
  15.         }  
  16.     }  
  17.     class Punycode  
  18.     {  
  19.         /* Punycode parameters */  
  20.         static int TMIN = 1;  
  21.         static int TMAX = 26;  
  22.         static int BASE = 36;  
  23.         static int INITIAL_N = 128;  
  24.         static int INITIAL_BIAS = 72;  
  25.         static int DAMP = 700;  
  26.         static int SKEW = 38;  
  27.         static char DELIMITER = '-';  
  28.         /** 
  29.          * Punycodes a unicode string. 
  30.          * 
  31.          * @param input Unicode string. 
  32.          * @return Punycoded string. 
  33.          */  
  34.         public static String encode(String input)  
  35.         {  
  36.             int n = INITIAL_N;  
  37.             int delta = 0;  
  38.             int bias = INITIAL_BIAS;  
  39.             StringBuilder output = new StringBuilder();  
  40.             // Copy all basic code points to the output  
  41.             int b = 0;  
  42.             for (int i = 0; i < input.Length; i++)  
  43.             {  
  44.                 char c = input[i];  
  45.                 if (isBasic(c))  
  46.                 {  
  47.                     output.Append(c);  
  48.                     b++;  
  49.                 }  
  50.             }  
  51.             // Append delimiter  
  52.             if (b > 0)  
  53.             {  
  54.                 output.Append(DELIMITER);  
  55.             }  
  56.             int h = b;  
  57.             while (h < input.Length)  
  58.             {  
  59.                 int m = int.MaxValue;  
  60.                 // Find the minimum code point >= n  
  61.                 for (int i = 0; i < input.Length; i++)  
  62.                 {  
  63.                     int c = input[i];  
  64.                     if (c >= n && c < m)  
  65.                     {  
  66.                         m = c;  
  67.                     }  
  68.                 }  
  69.                 if (m - n > (int.MaxValue - delta) / (h + 1))  
  70.                 {  
  71.                     throw new Exception("OVERFLOW");  
  72.                 }  
  73.                 delta = delta + (m - n) * (h + 1);  
  74.                 n = m;  
  75.                 for (int j = 0; j < input.Length; j++)  
  76.                 {  
  77.                     int c = input[j];  
  78.                     if (c < n)  
  79.                     {  
  80.                         delta++;  
  81.                         if (0 == delta)  
  82.                         {  
  83.                             throw new Exception("OVERFLOW");  
  84.                         }  
  85.                     }  
  86.                     if (c == n)  
  87.                     {  
  88.                         int q = delta;  
  89.                         for (int k = BASE; ; k += BASE)  
  90.                         {  
  91.                             int t;  
  92.                             if (k <= bias)  
  93.                             {  
  94.                                 t = TMIN;  
  95.                             }  
  96.                             else if (k >= bias + TMAX)  
  97.                             {  
  98.                                 t = TMAX;  
  99.                             }  
  100.                             else  
  101.                             {  
  102.                                 t = k - bias;  
  103.                             }  
  104.                             if (q < t)  
  105.                             {  
  106.                                 break;  
  107.                             }  
  108.                             output.Append((char)digit2codepoint(t + (q - t) % (BASE - t)));  
  109.                             q = (q - t) / (BASE - t);  
  110.                         }  
  111.                         output.Append((char)digit2codepoint(q));  
  112.                         bias = adapt(delta, h + 1, h == b);  
  113.                         delta = 0;  
  114.                         h++;  
  115.                     }  
  116.                 }  
  117.                 delta++;  
  118.                 n++;  
  119.             }  
  120.             return output.ToString();  
  121.         }  
  122.         /** 
  123.          * Decode a punycoded string. 
  124.          * 
  125.          * @param input Punycode string 
  126.          * @return Unicode string. 
  127.          */  
  128.         public static String decode(String input)  
  129.         {  
  130.             int n = INITIAL_N;  
  131.             int i = 0;  
  132.             int bias = INITIAL_BIAS;  
  133.             StringBuilder output = new StringBuilder();  
  134.             int d = input.LastIndexOf(DELIMITER);  
  135.             if (d > 0)  
  136.             {  
  137.                 for (int j = 0; j < d; j++)  
  138.                 {  
  139.                     char c = input[j];  
  140.                     if (!isBasic(c))  
  141.                     {  
  142.                         throw new Exception("BAD_INPUT");  
  143.                     }  
  144.                     output.Append(c);  
  145.                 }  
  146.                 d++;  
  147.             }  
  148.             else  
  149.             {  
  150.                 d = 0;  
  151.             }  
  152.             while (d < input.Length)  
  153.             {  
  154.                 int oldi = i;  
  155.                 int w = 1;  
  156.                 for (int k = BASE; ; k += BASE)  
  157.                 {  
  158.                     if (d == input.Length)  
  159.                     {  
  160.                         throw new Exception("BAD_INPUT");  
  161.                     }  
  162.                     int c = input[d++];  
  163.                     int digit = codepoint2digit(c);  
  164.                     if (digit > (int.MaxValue - i) / w)  
  165.                     {  
  166.                         throw new Exception("OVERFLOW");  
  167.                     }  
  168.                     i = i + digit * w;  
  169.                     int t;  
  170.                     if (k <= bias)  
  171.                     {  
  172.                         t = TMIN;  
  173.                     }  
  174.                     else if (k >= bias + TMAX)  
  175.                     {  
  176.                         t = TMAX;  
  177.                     }  
  178.                     else  
  179.                     {  
  180.                         t = k - bias;  
  181.                     }  
  182.                     if (digit < t)  
  183.                     {  
  184.                         break;  
  185.                     }  
  186.                     w = w * (BASE - t);  
  187.                 }  
  188.                 bias = adapt(i - oldi, output.Length + 1, oldi == 0);  
  189.                 if (i / (output.Length + 1) > int.MaxValue - n)  
  190.                 {  
  191.                     throw new Exception("OVERFLOW");  
  192.                 }  
  193.                 n = n + i / (output.Length + 1);  
  194.                 i = i % (output.Length + 1);  
  195.                 output.Insert(i, (char)n);  
  196.                 i++;  
  197.             }  
  198.             return output.ToString();  
  199.         }  
  200.         public static int adapt(int delta, int numpoints, bool first)  
  201.         {  
  202.             if (first)  
  203.             {  
  204.                 delta = delta / DAMP;  
  205.             }  
  206.             else  
  207.             {  
  208.                 delta = delta / 2;  
  209.             }  
  210.             delta = delta + (delta / numpoints);  
  211.             int k = 0;  
  212.             while (delta > ((BASE - TMIN) * TMAX) / 2)  
  213.             {  
  214.                 delta = delta / (BASE - TMIN);  
  215.                 k = k + BASE;  
  216.             }  
  217.             return k + ((BASE - TMIN + 1) * delta) / (delta + SKEW);  
  218.         }  
  219.         public static bool isBasic(char c)  
  220.         {  
  221.             return c < 0x80;  
  222.         }  
  223.         public static int digit2codepoint(int d)  
  224.         {  
  225.             if (d < 26)  
  226.             {  
  227.                 // 0..25 : 'a'..'z'  
  228.                 return d + 'a';  
  229.             }  
  230.             else if (d < 36)  
  231.             {  
  232.                 // 26..35 : '0'..'9';  
  233.                 return d - 26 + '0';  
  234.             }  
  235.             else  
  236.             {  
  237.                 throw new Exception("BAD_INPUT");  
  238.             }  
  239.         }  
  240.         public static int codepoint2digit(int c)  
  241.         {  
  242.             if (c - '0' < 10)  
  243.             {  
  244.                 // '0'..'9' : 26..35  
  245.                 return c - '0' + 26;  
  246.             }  
  247.             else if (c - 'a' < 26)  
  248.             {  
  249.                 // 'a'..'z' : 0..25  
  250.                 return c - 'a';  
  251.             }  
  252.             else  
  253.             {  
  254.                 throw new Exception("BAD_INPUT");  
  255.             }  
  256.         }  
  257.     }  
  258. }  

 

检查结果可以用以下网站工具

http://www.nicenic.com/domain/punycode.php

你可能感兴趣的:(java,c,String,Google,input,qt)