Punycode

Punycode是一个根据RFC 3492标准而制定的编码系统,主要用於把域名从地方语言所采用的Unicode编码转换成为可用於DNS系统的编码。Punycode可以防止所谓的IDN欺骗。

1国际化域名IDNs编辑

早期的DNS(Domain Name System)是只支持英文域名解析。在IDNs(国际化域名Internationalized Domain Names)推出以后,为了保证兼容以前的DNS,所以,对IDNs进行punycode转码,转码后的punycode就由26个字母+10个数字,还有“-”组成。

2浏览器对punycode的支持编辑

目前,因为操作系统的核心都是英文组成,DNS服务器的解析也是由英文代码交换,所以DNS服务器上并不支持直接的中文域名解析,所有中文域名的解析都需要转成punycode码,然后由DNS解析punycode码。其实目前所说和各种浏览器完美支持中文域名,只是浏览器软件里面主动加入了中文域名自动转码,不需要原来的再次安装中文域名转码控件来完成整个流程。

3punycode转码的例子编辑

例如:企鹅.com,用Punycode转换后为:xn--hoq754q. com
中国.cn,用Punycode转换后为:xn--fiqs8s. cn

[http://zh.wikipedia.org/wiki/国际化域名]
[http://baike.baidu.com/link?url=QqNn5fPCH39q7_VZHe6h8WuisIzXmT6DiH7r8oGh3MvWoaRNzgNCgXYJQwBJcrJgyERbTwdoOSy6zojoch7Mlq]
展开阅读全文

关于punycode解码的问题

08-06

目前有一些经过punycode加码后无法正常解码的字符串但是可以一些解码网站提供的punycode解码服务得到解码,很不解?rnrnrn实例字符串:xn--fiQ31H22EepUpwBd74Dlp9A.cnrnrn经过以下程序无法正常解码:rnrn public static String decode(String input) rn rn int n = INITIAL_N; rn int i = 0; rn int bias = INITIAL_BIAS; rn StringBuilder output = new StringBuilder(); rn int d = input.LastIndexOf(DELIMITER); rn if (d > 0) rn rn for (int j = 0; j < d; j++) rn rn char c = input[j]; rn if (!isBasic(c)) rn rn throw new Exception("BAD_INPUT"); rn rn output.Append(c); rn rn d++; rn rn else rn rn d = 0; rn rn while (d < input.Length) rn rn int oldi = i; rn int w = 1; rn for (int k = BASE; ; k += BASE) rn rn if (d == input.Length) rn rn throw new Exception("BAD_INPUT"); rn rn int c = input[d++]; rn int digit = codepoint2digit(c); rn if (digit > (int.MaxValue - i) / w) rn rn throw new Exception("OVERFLOW"); rn rn i = i + digit * w; rn int t; rn if (k <= bias) rn rn t = TMIN; rn rn else if (k >= bias + TMAX) rn rn t = TMAX; rn rn else rn rn t = k - bias; rn rn if (digit < t) rn rn break; rn rn w = w * (BASE - t); rn rn bias = adapt(i - oldi, output.Length + 1, oldi == 0); rn if (i / (output.Length + 1) > int.MaxValue - n) rn rn throw new Exception("OVERFLOW"); rn rn n = n + i / (output.Length + 1); rn i = i % (output.Length + 1); rn output.Insert(i, (char)n); rn i++; rn rn return output.ToString(); rn rn public static int adapt(int delta, int numpoints, bool first) rn rn if (first) rn rn delta = delta / DAMP; rn rn else rn rn delta = delta / 2; rn rn delta = delta + (delta / numpoints); rn int k = 0; rn while (delta > ((BASE - TMIN) * TMAX) / 2) rn rn delta = delta / (BASE - TMIN); rn k = k + BASE; rn rn return k + ((BASE - TMIN + 1) * delta) / (delta + SKEW); rn rn public static bool isBasic(char c) rn rn return c < 0x80; rn rn public static int codepoint2digit(int c) rn rn if (c - '0' < 10) rn rn // '0'..'9' : 26..35 rn return c - '0' + 26; rn rn else if (c - 'a' < 26) rn rn // 'a'..'z' : 0..25 rn return c - 'a'; rn rn else rn rn throw new Exception("BAD_INPUT"); rn rn rn rnrnrnrnrn但是在随便一个提供punycode解码的网站都可以正常解码。例如:http://www.nicenic.com/domain/punycode.php 并选择转成GBK中文,然后点击转换。成功转换并显示结果。rnrnrn兄弟们看看哪里有问题。 论坛

◆IE7.0◆URL编码转换问题,Punycode编码,IDN

02-27

请问Punycode编码如何解释成gb2312?rnrn==============================背景知识=================================rn  根据微软公司开发者透露的消息,第二个Beta版的IE7将可以支持用不同语言写的URL,它被广泛的认为可以使得互联网更加国际化。rnrn  IE的开发者VishuGupta在他的blog中写道,IE7将使用API来把域名转换成微代码(punycode)。微代码是Unicode域名的ASCII码翻译,DNS可以支持这种格式。rnrn  Gupta说,IE6并不支持微代码,但一些网站通过链接到微代码编写的URL来解决这个问题。在IE7中,Unicode域名将在被解析之前就转换成微代码并发送到代理服务器。rnrn  Gupta写到,用户可通过控制面板关闭IDN(Internationaldomainname)功能,这样IE7就会像IE6一样运行。rnrn  然而IDN兼容性使得非英语的Internet用户更加容易访问因特网,但同时也增加了伪装攻击的机会。伪装攻击的目的是通过使用与某网址相似的字符来假装成合法的地址,但实际上它是指向另外一个网站。例如,数字“1”和字母“l”就很难区分。rnrn  有时这种差别是很难注意到的,例如根据微软关于IDN信息的文件,用西里尔(古代斯拉夫语)的字母“a”来代替拉丁字母“a”,就变成另外一个网站。rnrn  Gupta写到,使用微代码就可以减少这种欺骗行为,但是对于用户来说并不是那么容易使用。IE7会根据用户浏览器的语言设置来对允许显示在地址栏的脚本进行限制。如果某个域名含有用户选择语言之外的字符,那个地址就会以微代码形式显示出来。rnrn  IE7中的“钓鱼过滤器”会检查域名,看它是否属于已经报告到的恶意站点。这个过滤器也可以判断某个域名是否不确定的,并警告用户。rnrn  微软在本月初透露,第一个beta版的IE7已经在7月推出了,而下一个更新的预释放版将会在2006年的第一季度出现。微软计划在WindowsVista之前推出IE7,而WindowsVista会在2006年年底前推出。rn=========================================================================rn=================================我的问题================================rn新装了IE7.0,发现以前的URL编码方式并不适用,程序报错!rnrn例子:rnhttp://www.csdn.net/view.jsp?name=中文rnrn以前处理方式rnName = new String(Name.getBytes("ISO8859_1"), "gb2312");rn或者rn<% request.setCharacterEncoding("gb2312"); %>rn都可以正确得到中文参数。rnrn但现在无论怎样,都是乱码。rnrn问题:rn按照微软官方讲,手动关闭IDN(Internationaldomainname)功能,就可以了。但是大量用户不会关闭该功能,并且使用IE用户占绝大多数。rnrn请问Punycode编码如何解释成gb2312? 论坛

没有更多推荐了,返回首页