我有一些链接资源没有拉丁字符,如åäö 这些通常是用户上传的文件
问题是我没有成功编码它们
使用filename.encodeAsURL似乎没有以正确的方式对其进行编码
例如,角色ö变为o%CC%88 测试在firefox中键入相同的内容并复制内容给出%C3%B6
这些编码之间有什么区别,我应该用什么来获得正确的编码?
答案 0 :(得分:2)
两种编码都是正确的。您实际上看到了两个不同字符串的编码。
这里的关键是注意到字符串开头的o
:
o%CC%88
是o
后跟Unicode Character Combining Diaeresis的字母,在呈现时与前一个字符结合。
%C3%B6
是Unicode 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.pdf
比bo%CC%88o.pdf
更容易阅读。