Grails UrlEccoding非拉丁字符,如åäö

时间:2012-01-13 18:58:17

标签: grails url-encoding non-ascii-characters

我有一些链接资源没有拉丁字符,如åäö 这些通常是用户上传的文件

问题是我没有成功编码它们

使用filename.encodeAsURL似乎没有以正确的方式对其进行编码

例如,角色ö变为o%CC%88 测试在firefox中键入相同的内容并复制内容给出%C3%B6

这些编码之间有什么区别,我应该用什么来获得正确的编码?

1 个答案:

答案 0 :(得分:2)

两种编码都是正确的。您实际上看到了两个不同字符串的编码。

这里的关键是注意到字符串开头的o

o%CC%88o后跟Unicode Character Combining Diaeresis的字母,在呈现时与前一个字符结合。

%C3%B6Unicode Character Latin Small O With Diaeresis

您看到的是,在第一种情况下,输入的字符串类似于这两个字符:o ¨,实际上呈现为ö。 在第二种情况下,它是实际的字符ö

我的猜测是你看到两种不同输入之间的区别。


基于以下讨论进行更新:如果您正在动态处理Unicode字符,并且无法控制输入方法,则可以尝试使用java.text.Normalizer(Java 1.6或更高版本)来规范化Unicode。 / p>

规范化尝试以确保始终表示所有字符,以便重音字符始终由组合字符表示或始终由字符+组合标记表示。

粗略的例子:

String.metaClass.normalizeUnicode = {
    return java.text.Normalizer.normalize(delegate, java.text.Normalizer.Form.NFC)
}

input = input.normalizeUnicode()

有四种标准化形式。我选择了一个最适合您案例based on the description of how they work的案例,但您可能更愿意尝试其他案例,看看哪些案例最有效。


所有这一切,如果您尝试在URL中表示Unicode字符,并且它们没有被代码直接加载和处理,则最好避免完全使用非拉丁字符。这不仅具有一致性,而且具有明显更短且更易读的URL的优点。 boo.pdfbo%CC%88o.pdf更容易阅读。