中文转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

时间: 2024-10-12 01:43:08

中文转Punycode的相关文章

Punycode转中文

package cn.cnnic.ops.udf; public class GetChineseFromPunycode { 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 DELIMI

Nginx中文域名配置

中文域名变为Punycode编码即可,在线转码地址:http://tools.jb51.net/punycode/, Punycode? Punycode是一个根据RFC 3492标准而制定的编码系统,主要用於把域名从地方语言所采用的Unicode编码转换成为可用於DNS系统的编码. "中文域名"后缀不被标准的解析服务器支持,需转化为punycode码进行解析. 修改Nginx配置 server { listen 80; server_name blog.linuxeye.com ;.

Nginx配置中文域名

今天碰到一个好玩的问题,还以为是nginx的缓存,各种清理就差把nginx卸载了,后来想想不对应该是中文域名的问题,对中文进行编码,搞定,如下: ... server { listen 80; server_name abc.cn; root /home/abc/abcPage; index /1/abcPage.html; } server { listen 80; server_name 中文.cn; root /home/123/123Page; index /1/123Page.html

Python中文乱码

1,注意:请使用智慧型浏览器 "CHROME" 配合理解和运作本文中提到的程序. 2,提示:谷歌的CHROME浏览器是迄今为止最智慧的浏览器,没有之一,只有第一. 3,谷歌的CHROME浏览器最特殊的一点是:"根据字符集使用不同的后台智能解码程序". 4,本文内容请见红字部分: 使用办法为: 在文件中开头加入代码如下: #!/usr/bin/python  或 者  #!user/bin/env python # -*- coding: utf-8 -*-# -*-

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

摘要:apache支持中文域名绑定,apache支持中文域名绑定,教你怎样让apache支持中文域名绑定,根据本人实际经验,叫你如何让apache支持中文域名绑定,绝对管用的让apache支持中文域名绑定的方法.在百度搜索:中文域名在线转码然后在线转中文域名为punyco 我从事php开发网站已经有5年之久以前遇到一个同事问我怎么样才能将apache绑定中文域名,支付中文域名访问而我以在实际项目获得并总结的经验告诉他,以下是方法: 根据本人实际经验,叫你如何让apache支持中文域名绑定,绝对管

IIS 7.5绑定中文域名转码启动站点报“值不在预期的范围内”

问题现象 IIS 7.5在绑定中文域名转码后,启动站点会出现[值不在预期的范围内]: 解决方案 此问题是由于中文域名绑定错误导致的,IIS 7.5针对中文域名会自动转换为punycode码,所以不需要绑定punycode码,如果要绑定中文域名直接绑定就可以了.(简单地讲就是直接在iis管理器绑定里面删除中文域名的转码保留中文即可) -----------------------------------------------------------------------------------

申请中文域名并跳转到个人网站(多种方法的尝试)

0x00 写在前面 今天看了篇知乎: 感慨这些无聊的人的同时,也萌生了自己申请一个有趣的中文域名的想法 说干就干,下面记录一下设置中文域名跳转的过程 也算是踩了不少坑,有兴趣的同学可以把我提到的几种方法都试一试,各种方法各有优劣,最好先看完全文再选择 0x01 购买域名 需要在支持中文域名购买的网站上购买域名,例如腾讯云.阿里云.西部数码等等,之前我用过的namesilo不支持中文域名的搜索 我尝试了在 腾讯云:https://dnspod.cloud.tencent.com/ 西部数码香港站:

Python cmd 中文显示乱码

方法一:# -*- coding:utf-8 -*- content = "我是中文" content_unicode = content.decode("utf-8") content_gbk = content_unicode.encode("gbk") print content_gbk 方法二: 解决非常简单 先引入import sys 再加一句:type=sys.getfilesystemencoding() 然后在输出乱码的数据的时候

大写中文数字-財务

壹.贰.叁.肆.伍.陆.柒.捌.玖.拾.佰.仟.万.亿.元(圆).角.分.零.整.这是大家常常要填写的大写数字,问什么要用大写数字呢?想必非常多人都不是非常清楚! 先看看下面两个有关大写数字的表格: 1.数码与大.小写数字的对比表: 数码 小写数字 大写数字 0 ○ 零 1 一 壹 2 二 贰 3 三 叁/參 4 四 肆 5 五 伍 6 六 陆 7 七 柒 8 八 捌 9 九 玖 2.进位数码与大.小写数字的对比表 数码 小写数字 大写数字 10 十 拾 20 二十 廿 30 三十 卅 100