谷歌计算器千位分隔符特殊字符



注意:有关此问题的更多答案,请参阅谷歌计算器中的特殊字符

我注意到,在获取谷歌计算器计算的返回值时,千位用一个相当奇怪的字符分隔。它不仅仅是一个空间。

让我们以4000美元兑换成英镑为例。

如果您访问以下谷歌链接:

http://www.google.com/ig/calculator?hl=en&q=4000%20usd%20to%20gbp

您会注意到,响应是:

{lhs: "4000 U.S. dollars",rhs: "2 497.81441 British pounds",error: "",icc: true}

这看起来是合理的,并且千位似乎由一个空白字符分隔。

但是,如果您在命令行中输入以下内容:

curl -s "http://www.google.com/ig/calculator?hl=en&q=4000%20usd%20to%20gbp"

您会注意到,响应是:

{lhs: "4000 U.S. dollars",rhs: "2?498.28243 British pounds",error: "",icc: true}

那个问号(?)是一个替换字符。发生了什么事?

AppleScript返回不同的替换字符:

{lhs: "4000 U.S. dollars",rhs: "2†498.28243 British pounds",error: "",icc: true}

我也从其他来源得到:

{lhs: "4000 U.S. dollars",rhs: "2�498.28243 British pounds",error: "",icc: true}

事实证明�是正确的Unicode替换字符65533。

有人能告诉我谷歌正在传递给我什么吗?

这是一个不间断的空间,U+00A0。这是为了确保数字不会在一行的末尾被打破。

Google返回正确的编码(UTF-8):

Content-Type: text/html; charset=UTF-8

所以。。。

  • 如果它是一个普通空间(U+0020)(Firefox在复制时会这样做,这已经够愚蠢的了),那么应用程序会将某些字符转换为类似字符,也许是为了适应某种受限代码页(ASCII)
  • 如果有一个问号,那么它被正确地读取为Unicode,但处理过程中的某些部分使用了不包含该字符的遗留字符集,因此它被转换
  • 如果有替换字符�(U+FFFD),然后它可能被读取为UTF-8,转换为包含该字符的遗留字符集(例如拉丁语1),然后重新解释为UTF-8
  • 如果有一个完全不同的字符,比如你的dagger(†),那么我猜响应被正确地读取为Unicode,转换为包含该字符的字符集,并在另一个字符集中重新解释。快速查看Mac Roman代码页可以发现A0确实映射到†

不用说,在处理响应时使用的任何东西中的某些部分在Unicode方面似乎都被严重破坏了。我希望在这个千年里不会经常发生这样的事情,但显然现在仍然如此。


我在PowerShell中摆弄了一下,弄明白了它是什么:

PS Home:> $wc = new-object net.webclient
PS Home:> $x = $wc.downloadstring('http://www.google.com/ig/calculator?hl=en&q=4000%20usd%20to%20gbp')
PS Home:> [char[]]$x|%{"$_ - " + +$_}
...
" - 34
2 - 50
  - 160
4 - 52
9 - 57
8 - 56
. - 46
2 - 50
8 - 56
2 - 50
4 - 52
...

此外,快速查看响应标头可以发现编码设置正确。

根据我在OSX上的终端中对curl的测试,通过更改端子首选项中的国际字符编码:编码为iso latin 1。

当我将编码设置为UTF8:我得到"2?498.28223">

当我将编码设置为MacRoman时:我得到"2†498.28223">

第一个解决方案:从任何浏览器使用用户代理(本例中为OSX 10.6.8上的Safari)

curl -s -A 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.48 (KHTML, like Gecko) Version/5.1 Safari/534.48' 'http://www.google.com/ig/calculator?hl=en&q=4000%20usd%20to%20gbp'

第二种解决方案:使用iconv

curl -s 'http://www.google.com/ig/calculator?hl=en&q=4000%20usd%20to%20gbp' |  iconv -t utf8 -f  iso-8859-1

尝试

set myUrl to quoted form of "http://www.google.com/ig/calculator?hl=en&q=4000%20usd%20to%20gbp"
set xxx to do shell script "curl " & myUrl & " | sed 's/[†]/,/'"

相关内容

  • 没有找到相关文章

最新更新