我正在尝试在我的网站上创建一些“社交分享”按钮,但我生成的网址并没有被这些服务解码。
一个例子,对于twitter:
private function twitter(e:Event):void {
var message:String = "Message with special chars âõáà";
var url:String = "http://www.twitter.com/home?status=";
var link:URLRequest = new URLRequest( url + escape(message) );
}
但是当twitter打开时,消息是:
带有特殊字符的消息 %E2%F5%E1%E0
Facebook和Orkut发生了类似情况(但这两个隐藏了特殊字符)。
有人知道为什么会这样吗?
答案 0 :(得分:0)
问题是escape()函数不考虑UTF-8 enconding。使用UTF-8编码查询字符串所需的函数是encodeURIComponent()。
所以,假设你有一个“ñ”(西班牙语,或者n加代)。我正在使用“ñ”,因为我记得它的代码点和它的UTF-8表示,因为我总是用它来进行调试,但这同样适用于其他非ASCII,非字母数字的数字。
假设您有字符串“Año”(顺便说一下,西班牙语为“年份”)。
代码点(Unicode和iso-8859-1)是:
A: 0x41
ñ: 0xf1
o: 0x6f
如果你调用escape(),你会得到这个:
A: A
ñ: %F1
o: o
“A”和“o”不需要编码。 “ñ”编码为“%”加上其代码点,即0xf1。
但是,推特,脸书等等,期待UTF-8。 0xf1不是有效的UTF-8序列,应该用2字节序列表示。含义,“ñ”应编码为:
0xC3
0xB1
这就是encodeURIComponent的作用。它将以这种方式编码“año”:
A: A
ñ: %C3
%B1
o: o
所以,总而言之,而不是:
var link:URLRequest = new URLRequest( url + escape(message) );
试试这个
var link:URLRequest = new URLRequest( url + encodeURIComponent(message) );
它应该可以正常工作。