规范化字符串以在 Java 中创建安全的 URL

Posted

技术标签:

【中文标题】规范化字符串以在 Java 中创建安全的 URL【英文标题】:Normalize a String to create a safe URL in Java 【发布时间】:2014-03-07 20:47:38 【问题描述】:

我正在用 Java 编写一个库,它以这种方式从文件名列表中创建 URL:

final String domain = "http://www.example.com/";

String filenames[] = "Normal text","Ich weiß nicht", "L'ho inserito tra i princìpi";

System.out.println(domain+normalize(filenames[0]);
//Prints  "http://www.example.com/Normal_text"
System.out.println(domain+normalize(filenames[1]);
//Prints  "http://www.example.com/Ich_weib_nicht"
System.out.println(domain+normalize(filenames[2]);
//Prints  "http://www.example.com/L_ho_inserito_tra_i_principi"

在某个地方存在一个 Java 库,它公开了我在上面的代码中使用的方法 normalize

文学:

Which special characters are safe to use in url? Safe characters for friendly url

【问题讨论】:

看看这个:***.com/questions/21489289/… @PopoFibo 是的,它有效!我从未见过 Java 中的 Normalizer 类!非常感谢!你能用一个简短的例子来回答吗? 【参考方案1】:

假设您的意思是要对字符串进行编码以使其对 url 安全。在这种情况下使用 URLEncoder:

final String domain = "http://www.example.com/";

String filenames[] = "Normal text","Ich weiß nicht", "L'ho inserito tra i princìpi";

System.out.println(domain + URLEncoder.encode(filenames[0], "UTF-8"));
System.out.println(domain + URLEncoder.encode(filenames[1], "UTF-8"));
System.out.println(domain + URLEncoder.encode(filenames[2], "UTF-8"));

【讨论】:

不,因为我不能使用来自 URLEncoder.encode() 方法的“特殊”字符,如 % 等。我正在创建必须通过特殊的 XML 验证器有效的 URL。它不需要空格,不需要特殊字符等等 所以它们不是 URL 不不,他们是! XML 包含一个元素列表,每个元素都有一个 rdf:about 属性,该属性有一个 URL 作为值 在这种情况下,我会使用 apache commons lang 库中的 StringEscapeUtils.escapeXML() 但我看不出这与 URL 有什么关系 该方法不适用于验证器。例如,StringEscapeUtils.escapeXml("l'avevo all'università") 转义为l'avevo all'università:重音“a”仍然存在!此外,文本不是人类可读的。【参考方案2】:

从我之前的回答here 中获取内容,您可以使用java.text.Normalizer,它接近于规范化Java 中的字符串。规范化的一个例子是;

重音去除:

String accented = "árvíztűrő tükörfúrógép";
String normalized = Normalizer.normalize(accented,  Normalizer.Form.NFD);
normalized = normalized.replaceAll("[^\\pASCII]", "");

System.out.println(normalized);

给予;

arvizturo tukorfurogep

【讨论】:

以上是关于规范化字符串以在 Java 中创建安全的 URL的主要内容,如果未能解决你的问题,请参考以下文章

无法取消嵌套 json 文件以在 r 中创建地图?

如何从字符串中提取值以在 Scala 中创建案例类实例

如何在 Javascript 中创建查询参数?

如何在我添加到项目中的 SQL Server Express 数据库中创建用户?

如何从 JSON 数组在 DB 中创建表以在 Spring Boot 中创建 REST API

授予权限以在 oracle sql 过程中创建表