网络使用中的 URL 编码

有时,Corona 的 网络 库用户面临的一个挑战是如何正确编码 URL。让我们来看一个例子

https://www.google.com/search?q=coronalabs&ie=utf-8&client=firefox-a&channel=sb

这个 URL 最初可以分解成以下几个方面

接下来是一系列键值对,由问号 (?) 开头,每对之间用与符号 (&) 分隔。每个键及其关联的值用等号 (=) 分隔。在本例中,我们有以下键值键值对

编码规则

理解 URL 的组成部分以及符号 /.?&的用法非常重要。URL **不能**包含空格,键/值也不能包含空格或符号,包括UTF-8字符。在浏览器中输入包含空格或特殊字符的 URL 时,浏览器会安全地为您转换它们。有些人会在浏览器中测试 URL,假设它可以正常工作,然后尝试在 network.request() 中使用它,却发现它失败了。

一个正确编码的URL 的一些基本规则是

为了说明这个概念,让我们考虑另一个 URL

https://www.google.com/search?q=Corona tutorials & guides

正确编码后,URL 如下所示

https://www.google.com/search?q=Corona+tutorials+%26+guides

编码函数

在 Corona 的 网络 库中使用 URL 时,您有责任对其进行正确编码,以便它可以通过 Internet 安全传输。幸运的是,一个简单的 Lua 函数可以为我们完成这项工作

function string.urlEncode( str )

    if ( str ) then
        str = string.gsub( str, "\n", "\r\n" )
        str = string.gsub( str, "([^%w ])",
            function( c )
                return string.format( "%%%02X", string.byte(c) )
            end
        )
        str = string.gsub( str, " ", "+" )
    end
    return str
end

使用此函数,我们可以这样编码 URL

local searchQuery = "Corona tutorials & guides"
local URL = "https://google.com/q=" .. string.urlEncode( searchQuery )

或者,由于我们将此函数添加到 Corona 的内置 字符串 库中,因此也可以在冒号运算符语法中使用它

local searchQuery = "Corona tutorials & guides"
local URL = "https://google.com/q=" .. searchQuery:urlEncode()

就是这样!正确编码 URL 后,我们可以在 Corona 的 网络 函数中使用它来发出网络请求,将 URL 传递给 native.newWebView(),或将其与任何其他需要 URL 的 API/函数一起使用。

总结

总而言之,请记住,如果 URL 包含空格、符号或二进制数据(如UTF-8 多字节字符),则**必须**对其进行编码。本教程中的便捷函数简化了编码过程,可以帮助您构建更好的基于网络的应用。