【问题标题】:Grails UrlEncoding non latin characters like åäöGrails UrlEncoding 非拉丁字符,如 åäö
【发布时间】:2012-01-13 18:58:17
【问题描述】:

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

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

使用 filename.encodeAsURL 似乎没有正确编码

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    o%CC%88 是字母o 后跟Unicode Character Combining Diaeresis,在渲染时与前一个字符结合。

    %C3%B6Unicode 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.pdfbo%CC%88o.pdf 更容易阅读。

    【讨论】:

    • 感谢您的解释。我想一般来说最好为这样的链接洗掉非 ascii 字符。这确实是不同的输入,第一个是从目录中获取的文件名,也是我手动输入的文件名。但是我觉得奇怪的是有两种不同的方式来表示同一个字符。
    • 如果有帮助,请accept the answer。谢谢!
    • 它确实解释了会发生什么,但并没有真正说明该怎么做。如何在 grails 或 java 中正确处理,以便您可以链接到非 ascii 字符的资源?
    • 如果您对名称进行硬编码,请复制并粘贴文件名以确保字符相同。
    • 我更新了我的答案,提供了有关如何规范化您的 Unicode 输入(如果文本不是硬编码)的信息。
    猜你喜欢
    • 2015-06-26
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-08
    • 1970-01-01
    相关资源
    最近更新 更多