我有一些链接资源,没有像åäö这样的拉丁字符这些通常是用户上传的文件
问题是我没有成功地编码他们
使用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_。