URL 遇到 中文字符 无法初始化

在 Swift 中,大家经常会用 URL 来初始化一个路径,比如网页的链接。比如这样:

当用户点击按钮(比如说这个帮助按钮),那么一下子就帮用户打开默认的浏览器,并打开指定的页面(这里是个论坛)。

那么,如果你的链接是这样的: "https://v2mm.tech/topic/618/怎样优雅地使用落格输入法的点划功能" 那么很不幸,崩溃。

崩溃的原因是 NSWorkspace.shared.open(url!) 这一句,再具体一点就是 url 这个变量遇到了空值——说白了就是空指针。为什么会这样呢?

显然,这个 URL 对象没有初始化成功。

URL 不能处理中文字符

我们必须用其他的办法来让他初始化——毕竟,浏览器是支持这样打开一个链接的,你也不可能去要求网站提供商改变他们的页面链接,这个时候就要用到 % 大法了。

Percent-encoding

也就是常说的百分号编码,它能够让 URL ,也就是你的链接支持一些奇奇怪怪的字符——比如中文。所以,上文中我们那个字符串,也可以是这样: https://v2mm.tech/topic/618/%D4%F5%D1%F9%D3%C5%D1%C5%B5%D8%CA%B9%D3%C3%C2%E4%B8%F1%CA%E4%C8%EB%B7%A8%B5%C4%B5%E3%BB%AE%B9%A6 这个和上文中的带有中文的链接是等价的。其实,你有时候经常会在一些跳转网站页面看到一长串这样的百分号,其实他们就是把那个要跳转的链接完全编码成了百分号格式,包括那些 /// : https%3A%2F%2Fv2mm.tech%2Ftopic%2F618%2F%D4%F5%D1%F9%D3%C5%D1%C5%B5%D8%CA%B9%D3%C3%C2%E4%B8%F1%CA%E4%C8%EB%B7%A8%B5%C4%B5%E3%BB%AE%B9%A6%C4%DC

这样一来,这个的 URL 都变成了没有意义的文本串,就避免了在 URL 路径里传参时出现歧义。

那么

该怎么用代码来实现这种编码呢?

现成的 API 可以用,如下:

不过你要注意,这样的编码,会让整个字符串被编码,所以我们只需要编码中文部分即可,那么具体到本文中的例子,就是这样的:

延伸阅读

https://zh.wikipedia.org/zh-cn/百分号编码

http://web.chacuo.net/charseturlencode

本文由 落格博客 原创撰写:落格博客 » URL 遇到 中文字符 无法初始化

转载请保留出处和原文链接:https://www.logcg.com/archives/2765.html

About the Author

R0uter

如非声明,本人所著文章均为原创手打,转载请注明本页面链接和我的名字。

Comments

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注