2012-05-11 29 views
2

最近我重建了一些表格,以便他們將接受國際域名一樣ColdFusion和Java的如何驗證使用Punycode IDN

的http://例子測試

我會那麼這些存儲爲的Punycode 。在此之前,雖然我們有驗證代碼運行檢查域是否Coldfusions有效使用isValid()方法:

if(not isValid("url", sURL)){ 
return false; 
} 

用的Punycode我們有isValid()功能失效的問題時域就像是:

HTTP://例子測

或當它轉化爲它的使用CreateObject("java", "java.net.IDN").toASCII(sURL);的Punycode在某些情況下出來,如:

XN - HTTP:// 133ab - xn328sdf

(由例如但在某些情況下會出現在http之前字符://部分)

是目前有一個使用Java庫或Coldfusion庫或正則表達式來驗證IDN和「正常」域的方法?

回答

2

IDN僅表示域名,您似乎在要轉換的字符串中包含協議(http://)。

首先用一個簡單的replace()或者使用java.net.URL去除協議,然後在需要時重新組合協議和idn。

<cfscript> 
oUrl = createobject("java", "java.net.URL").init("httP://例子.測試"); 
protocol = oUrl.getProtocol(); 
domain = oUrl.getHost(); 
idn = createobject("java", "java.net.IDN").toAscii(domain); 
writeDump(protocol); // -> http 
writeDump(domain); // -> 例子.測試 
writeDump(idn);  // -> xn--fsqu00a.xn--0zwm56d 
</cfscript> 

一旦你有了punycode,你應該可以使用isValid()就可以了。

+0

對於未來的用戶:您需要單獨的域和協議,然後重新組合它們當使用isValid時。但是,如果您正在存儲它,請在原始URL上使用toAscii函數,因爲當您嘗試訪問Unicode時,如果URL在http://之前沒有xn--,則不會顯示該域的Unicode正確。 – Jarede

+0

如果您要存儲它,則應將其存儲在有效的表單中。在轉換回unicode之前,您總是可以關閉該協議,然後重新組合協議。 –