gpt4 book ai didi

ruby - 使用 ruby​​(使用 Addressable Gem)显示来自规范化 URI 的 IDN

转载 作者:数据小太阳 更新时间:2023-10-29 07:19:51 25 4
gpt4 key购买 nike

在我的 Ruby 应用程序中,我需要处理来自用户输入的 URI(实际上是 IRI)

str = "http://उदाहरण.परीक्षा/मुख्य_पृष्ठ"

我使用 Addressable 规范化这些,并且只存储规范化的形式:

normalized = Addressable::URI.parse(str).normalize
normalized.to_s
#=> http://xn--p1b6ci4b4b3a.xn--11b5bs3a9aj6g/%E0%A4%AE%E0%A5%81%E0%A4%96%E0%A5%8D%E0%A4%AF_%E0%A4%AA%E0%A5%83%E0%A4%B7%E0%A5%8D%E0%A4%A0

这很好用,但显然不能很好地显示给最终用户。

为此,我想将此 URI 转换回其原始形式(非 punycode,非百分比编码路径)

Addressable 有 display_uri,但它只转换主机:

nicer = normalized.display_uri.to_s
#=> http://उदाहरण.परीक्षा/%E0%A4%AE%E0%A5%81%E0%A4%96%E0%A5%8D%E0%A4%AF_%E0%A4%AA%E0%A5%83%E0%A4%B7%E0%A5%8D%E0%A4%A0

这看起来可行:

display_s = Addressable::URI.parse(str).display_uri.to_s
pretty = Addressable::URI.unencode(display_s.force_encoding("ASCII-8BIT"))

但是,该代码看起来不对(我不需要使用 force_encoding)而且我完全不确定它是否正确。

  • 将整个 URI 转换为可供最终用户使用的内容的好方法是什么("http://उदाहरण.परीक्षा/मुख्य_पृष्ठ")

  • 存储规范化的 URI 是个好主意还是会产生我可能不知道的后果?

代码:https://gist.github.com/levinalex/6115764

tl;dr

如何转换:

"http://xn--p1b6ci4b4b3a.xn--11b5bs3a9aj6g/" +
"%E0%A4%AE%E0%A5%81%E0%A4%96%E0%A5%8D%E0%A4" +
"%AF_%E0%A4%AA%E0%A5%83%E0%A4%B7%E0%A5%8D%E0%A4%A0"

为此:

"http://उदाहरण.परीक्षा/मुख्य_पृष्ठ"

最佳答案

您不需要任何强制(重新)编码来恢复原始 URI。简单地:

normalised_s = "http://xn--p1b6ci4b4b3a.xn--11b5bs3a9aj6g/%E0%A4%AE%E0%A5%81%E0%A4%96%E0%A5%8D%E0%A4%AF_%E0%A4%AA%E0%A5%83%E0%A4%B7%E0%A5%8D%E0%A4%A0"        
Addressable::URI.unencode(Addressable::URI.parse(normalised_s).display_uri)

=> "http://उदाहरण.परीक्षा/मुख्य_पृष्ठ"

重复 Bob 在评论中所说的,规范化绝对是保证存储唯一性的好方法。

关于ruby - 使用 ruby​​(使用 Addressable Gem)显示来自规范化 URI 的 IDN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17954901/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com