Grails UrlEncoding non latin character like åäö



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

问题是我没有成功地编码他们

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

例如,字符ö变成了o%CC%88测试在firefox中键入相同的东西并复制内容会得到%C3%B6

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

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

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

o%CC%88是字母o,后跟Unicode字符组合分音符,在渲染时与前一个字符组合。

%C3%B6是带分音符的Unicode字符拉丁文小写O。

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

我的猜测是,你看到了两种不同输入之间的差异。


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

规范化试图确保所有字符都得到一致的表示,以便重音字符始终由组合字符表示或始终由字符+组合标记表示。

粗略示例:

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

规范化有四种形式。我根据对它们工作方式的描述,选择了一个似乎最适合你的案例,但你可能更喜欢尝试其他的,看看什么最有效。


话虽如此,如果你试图在URL中表示Unicode字符,而代码没有直接加载和处理这些字符,那么最好避免完全使用非拉丁字符。这不仅有一致性的好处,而且URL更短、更清晰。CCD_ 9比CCD_。

最新更新