【发布时间】:2012-01-13 18:58:17
【问题描述】:
我有一些链接资源没有像 åäö 这样的拉丁字符 这些通常是用户上传的文件
问题是我没有成功编码它们
使用 filename.encodeAsURL 似乎没有正确编码
例如字符ö变成o%CC%88 测试在 Firefox 中键入相同内容并复制内容会得到 %C3%B6
这些编码有什么区别,我应该用什么来获得正确的编码??
【问题讨论】:
标签: grails url-encoding non-ascii-characters
我有一些链接资源没有像 åäö 这样的拉丁字符 这些通常是用户上传的文件
问题是我没有成功编码它们
使用 filename.encodeAsURL 似乎没有正确编码
例如字符ö变成o%CC%88 测试在 Firefox 中键入相同内容并复制内容会得到 %C3%B6
这些编码有什么区别,我应该用什么来获得正确的编码??
【问题讨论】:
标签: grails url-encoding non-ascii-characters
两种编码都是正确的。您实际上看到的是两个不同字符串的编码。
这里的关键是注意字符串开头的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。
规范化尝试确保所有字符的表示一致,以便重音字符始终由组合字符或始终由字符+组合标记表示。
粗略的例子:
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 更容易阅读。
【讨论】: