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

Unicode 谷歌计算器千位分隔符特殊字符,unicode,google-api,calculator,separator,Unicode,Google Api,Calculator,Separator,注:有关此问题的更多答案,请参阅 我注意到,在获取Google Calculator计算的返回值时,千位之间用一个相当奇怪的字符分隔。它不仅仅是一个空间 让我们以将4000美元转换为英镑为例 如果您访问以下谷歌链接: 您会注意到响应是: {lhs: "4000 U.S. dollars",rhs: "2 497.81441 British pounds",error: "",icc: true} {lhs: "4000 U.S. dollars",rhs: "2?498.28243 Bri

注:有关此问题的更多答案,请参阅

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

让我们以将4000美元转换为英镑为例

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

您会注意到响应是:

{lhs: "4000 U.S. dollars",rhs: "2 497.81441 British pounds",error: "",icc: true}
{lhs: "4000 U.S. dollars",rhs: "2?498.28243 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 497.81441 British pounds",error: "",icc: true}
{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

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

试试看

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/[†]/,/'"

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

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

所以

  • 如果它显示为一个普通的空格(U+0020)(Firefox在复制时会这样做,这已经够愚蠢了),那么应用程序会将某些字符转换为类似的外观,可能是为了适应某种受限代码页(可能是ASCII)
  • 如果有问号,则正确地将其读取为Unicode,但处理过程中的某些部分使用了不包含该字符的旧字符集,因此它会被转换
  • 如果有替换字符� (U+FFFD)然后它可能被读取为UTF-8,转换为包含该字符的传统字符集(例如拉丁1),然后重新解释为UTF-8
  • 如果有一个完全不同的字符,例如您的dagger(†),那么我猜响应被正确读取为Unicode,转换为包含该字符的字符集,并在另一个字符集中重新解释。快速查看代码页可以发现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.28243”

当我将编码设置为MacRoman时:我得到“2†498.28243”

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

第二种解决方案:使用
iconv

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

这可以很好地“修复”AppleScript中的字符,但仍然不知道Google为什么返回这个特殊字符,或者它到底是什么。谢谢。你是怎么决定的?我加了一条关于如何决定的注释。但事实上,这是相当基本的东西。我真的很感谢你的全面回应。我学到了很多。
curl-s“http://www.google.com/ig/calculator?hl=en&q=4000%20usd%20to%20gbp“|iconv-t UTF8{lhs:“4000美元”,rhs:“2 iconv:(stdin):1:33:无法转换
我不知道那里发生了什么,因为Unix基本上只传递字节(即随机二进制数据)这有时碰巧是在一些系统范围内定义的编码中。因此,当
curl
将文本打印到其输出流时,可能已经发生了相当多的转换。结果可能会根据您的语言和编码设置、终端设置、
curl
设置和/或构建选项等而有所不同。我曾经尝试过这样做使用inconv,但只输入-t(to)而不是正确的-f(from)。谢谢。您的inconv解决方案比我尝试的解决方案要好,并且是我当前的解决方案。我发现以下内容在JSON的答案部分输出了有效的HTML:
echo-en$(curl-s)http://www.google.com/ig/calculator?hl=en&q=QUERY')>~/temp.html
其中-e代表echo解释转义,-n抑制echo换行符,查询表示url编码的查询。