Punycode与中文互转
其实目前所说的各种浏览器完美支持中文域名,只是浏览器中主动加入了中文域名自动转码,不需要再次安装中文域名转码控件来完成整个流程
如在浏览器中输入"北京大学.com”,然后通过wireshark抓包
- GET http://xn--1lq90ic7fzpc.com/ HTTP/1.1
- public class CharsetTool {
- 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 = '-';
- /**
- * Punycodes a unicode string.
- *
- * @param input
- * Unicode string.
- *
- * @return Punycoded string.
- */
- public static String encode(String input) throws Exception {
- int n = INITIAL_N;
- int delta = 0;
- int bias = INITIAL_BIAS;
- StringBuilder output = new StringBuilder();
- // Copy all basic code points to the output
- int b = 0;
- for (int i = 0; i < input.length(); i++) {
- char c = input.charAt(i);
- if (isBasic(c)) {
- output.append(c);
- b++;
- }
- }
- // Append delimiter
- 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();
- }
- /**
- * Decode a punycoded string.
- *
- * @param input
- * Punycode string
- *
- * @return Unicode string.
- */
- public static String decode(String input) throws Exception {
- int n = INITIAL_N;
- int i = 0;
- int bias = INITIAL_BIAS;
- StringBuilder output = new StringBuilder();
- int d = input.lastIndexOf(DELIMITER);
- if (d > 0) {
- for (int j = 0; j < d; j++) {
- char c = input.charAt(j);
- if (!isBasic(c)) {
- throw new Exception("BAD_INPUT");
- }
- output.append(c);
- }
- d++;
- } else {
- d = 0;
- }
- while (d < input.length()) {
- int oldi = i;
- int w = 1;
- for (int k = BASE;; k += BASE) {
- if (d == input.length()) {
- throw new Exception("BAD_INPUT");
- }
- int c = input.charAt(d++);
- int digit = codepoint2digit(c);
- if (digit > (Integer.MAX_VALUE - i) / w) {
- throw new Exception("OVERFLOW");
- }
- i = i + digit * w;
- int t;
- if (k <= bias) {
- t = TMIN;
- } else if (k >= bias + TMAX) {
- t = TMAX;
- } else {
- t = k - bias;
- }
- if (digit < t) {
- break;
- }
- w = w * (BASE - t);
- }
- bias = adapt(i - oldi, output.length() + 1, oldi == 0);
- if (i / (output.length() + 1) > Integer.MAX_VALUE - n) {
- throw new Exception("OVERFLOW");
- }
- n = n + i / (output.length() + 1);
- i = i % (output.length() + 1);
- output.insert(i, (char) n);
- i++;
- }
- return output.toString();
- }
- public static 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);
- }
- public static boolean isBasic(char c) {
- return c < 0x80;
- }
- public static 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");
- }
- }
- public static 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");
- }
- }
- public static void main(String[] args) throws Exception {
- String strPunycode ="xn--"+ CharsetTool.encode("北京大学");
- System.out.println(strPunycode);
- String strChinese = CharsetTool.decode("1lq90ic7fzpc");
- System.out.println(strChinese);
- }
- }
- xn--1lq90ic7fzpc
- 北京大学
Punycode与中文互转的更多相关文章
- Unicode编码与中文互转
/** * unicode编码转换为汉字 * @param unicodeStr 待转化的编码 * @return 返回转化后的汉子 */ public static String UnicodeTo ...
- c#unicode,中文互转
/// <summary> /// 中文转unicode /// </summary> /// <returns></returns> public s ...
- Punycode转中文
package cn.cnnic.ops.udf; public class GetChineseFromPunycode { static int TMIN = 1; static int TMAX ...
- JS 实现 unicode 中文互转
// 转为unicode 编码 function encodeUnicode(str) { var res = []; for ( var i=0; i<str.length; i++ ) { ...
- RGB与16进制色互转
点击进入新版 <前端在线工具站> CSS, JavaScript 压缩YUI compressor, JSPacker...HTML特殊符号对照表PNG,GIF,JPG... Base ...
- 个人永久性免费-Excel催化剂功能第29波-追加中国特色的中文相关自定义函数
中文世界里,有那么几个需求在原生Excel里没提供,例如财务部的数字转大写金额,文字转拼音等,在其他插件里,大部分是以功能区菜单按钮的方式提供.Excel催化剂认为,最佳的使用方式乃是自定义函数的方式 ...
- C#设计模式总结
一.引言 经过这段时间对设计模式的学习,自己的感触还是很多的,因为我现在在写代码的时候,经常会想想这里能不能用什么设计模式来进行重构.所以,学完设计模式之后,感觉它会慢慢地影响到你写代码的思维方式.这 ...
- jni数据传递——会不断的更新,测试没有问题,再整理进来。
工作中遇到了ndk编程,其实核心就是java和本地的数据交互.现把所有数据类型的传递写成demo. 1,ini数组传递 我们实现传递8个数值过去,然后本地将八个数值放到数组,返回. java代码: ...
- C#设计模式总结(转)
一.引言 经过这段时间对设计模式的学习,自己的感触还是很多的,因为我现在在写代码的时候,经常会想想这里能不能用什么设计模式来进行重构.所以,学完设计模式之后,感觉它会慢慢地影响到你写代码的思维方式.这 ...
随机推荐
- 解决因block的损坏而导致hdfs启动后进入安全模式
问题描述: 以单机伪分布式方式安装了hadoop2.7.1,并在该机器上安装了hive1.2.1.首先执行 sbin/start-dfs.sh 启动hdfs服务,然后执行hive,这时hive脚本启动 ...
- [NYOJ 37] 回文字符串
回文字符串 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba".当 ...
- c程序设计语言_习题1-9_将输入流复制到输出流,并将多个空格过滤成一个空格
Write a program to copy its input to its output, replacing each string of one or more blanks by a si ...
- javascript点击图片放大的功能(原生)
使用的图片: 1.jpg <!doctype html> <html lang="en"> <head> <meta charset=&q ...
- (转载)腾讯CMEM的PHP扩展
(转载)http://blog.renren.com/share/223341289/7693783476 题外话 最近公司在做相关的业务,由于Memcached协议缺少返回码,为了保证业务数据的安全 ...
- Node.js 创建第一个应用
如果我们使用PHP来编写后端的代码时,需要Apache 或者 Nginx 的HTTP 服务器,并配上 mod_php5 模块和php-cgi. 从这个角度看,整个"接收 HTTP 请求并提供 ...
- [Bhatia.Matrix Analysis.Solutions to Exercises and Problems]ExI.2.5
Show that matrices with distinct eigenvalues are dense in the space of all $n\times n$ matrices. (Us ...
- [Raobin] Ext.net在前端直接将对象转为json形式传入后台
d.Render.ExtraParams.Add(Html.Y().Parameter("Json", new JavaScriptSerializer().Serialize(e ...
- 用FSM写Case,玩过没?
一.引言 测试工程师小新一是一名安卓客户端测试工程师,对于安卓客户端的功能测试.自动化测试和性能测试方面都有着非常丰富的经验.最近小新一被通知负责某二手交易APP的功能测试,在初步了解了该APP后,小 ...
- Appium 小白从零安装 ,Appium连接真机测试。
以下是我个人在初次安装使用Appium时的过程,过程中遇到了一些问题,在这里也一一给出解决办法. Appium安装过程 先安装了 Node.js.在node的官网上下载的exe安装文件. 在node的 ...