Coldfusion и Java, как проверить IDN punycode

Недавно я перестроил некоторые формы, чтобы они принимали международные домены, такие как

http://例子.测试

Затем я бы сохранил их как punycode. Однако до этого у нас был запущен код проверки, чтобы проверить, является ли домен действительным, с использованием метода Coldfusions isValid():

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

С punycode у нас есть проблема с ошибкой функции isValid(), когда домен выглядит так:

http://例子.测

или когда он преобразуется в свой punycode с использованием CreateObject( "java", "java.net.IDN" ).toASCII(sURL); и в некоторых случаях получается так:

xn--http://133ab--xn328sdf

(составленный пример, но в некоторых случаях перед частью http:// будут символы)

существует ли в настоящее время способ использования библиотеки Java, библиотеки Coldfusion или регулярного выражения для проверки IDN и «обычных» доменов?


person Jarede    schedule 11.05.2012    source источник


Ответы (2)


IDN является представлением только доменного имени, вы, кажется, включаете протокол (http://) в строку, которую вы конвертируете.

Сначала удалите протокол либо с помощью простой замены(), либо с помощью java.net.URL, а затем, при необходимости, повторно объедините протокол и идентификатор.

<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().

person Chris Blackwell    schedule 11.05.2012
comment
Для будущих пользователей: вам нужно разделить домен и протокол, а затем объединить их при использовании isValid. Однако, если вы сохраняете его, используйте функцию toAscii для исходного URL-адреса, как при попытке использовать toUnicode, если в URL-адресе нет xn-- перед http://, он не будет отображать юникод для домена. правильно. - person Jarede; 11.05.2012
comment
Если вы храните его, вы должны хранить его в допустимой форме. Вы всегда можете снова отключить протокол перед преобразованием обратно в Unicode, а затем рекомбинировать с протоколом. - person Chris Blackwell; 11.05.2012

Возможно, ответы здесь могут помочь Как отправить электронную почту получателю с умляутами в доменном имени?

Они предлагают использовать

<cfset jUrl = CreateObject( "java", "java.net.IDN" ).toUnicode(sUrl) />

или библиотеку Java LibIdn.

person Cyril Hanquez    schedule 11.05.2012