【问题标题】:Google Calculator Thousands Separator Special Character谷歌计算器千位分隔符特殊字符
【发布时间】:2012-10-01 10:08:11
【问题描述】:

注意:有关此问题的更多答案,请参阅 Special Characters in Google Calculator

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

我们以将 4,000 美元兑换成英镑为例。

如果您访问以下 Google 链接:

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。

谁能告诉我 Google 传递给我的信息?

【问题讨论】:

    标签: unicode google-api calculator separator


    【解决方案1】:

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

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

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

    所以...

    • 如果它以普通空格 (U+0020) 的形式出现(Firefox 在复制时会这样做,非常愚蠢),那么应用程序会将某些字符转换为相似字符,可能是为了适应某种受限代码页 (也许是 ASCII)。
    • 如果有问号,则它被正确读取为 Unicode,但处理中的某些部分使用不包含该字符的旧字符集,因此它被转换。
    • 如果有替换字符 � (U+FFFD),那么它很可能被读取为 UTF-8,转换为包含该字符的旧字符集(例如拉丁文 1),然后重新解释为 UTF-8。
    • 如果有一个完全不同的字符,比如你的匕首 (†),那么我猜响应被正确读取为 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
    ...
    

    还快速查看响应标头显示编码设置正确。

    【讨论】:

    • 谢谢。您是如何确定的?
    • 我添加了关于如何操作的注释。但实际上,这是相当基本的东西。
    • 我非常感谢您的彻底回复。我学到了很多东西。
    • curl -s "http://www.google.com/ig/calculator?hl=en&q=4000%20usd%20to%20gbp" | iconv -t UTF8 {lhs: "4000 U.S. dollars",rhs: "2 iconv: (stdin):1:33: cannot convert
    • 我不知道那里发生了什么,因为 Unix 本质上只是传递字节(即随机二进制数据),有时恰好在某些系统范围定义的编码中。因此,当curl 将文本打印到其输出流时,可能已经进行了相当多的转换。结果可能因您的语言和编码设置、终端设置、curl 设置和/或构建选项等而异。
    【解决方案2】:

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

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

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

    第一个解决方案:在任何浏览器中使用用户代理(本例中为 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
    

    【讨论】:

    • 我曾尝试使用 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 换行符,QUERY 表示 url 编码查询。
    【解决方案3】:

    试试

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

    【讨论】:

    • 这可以很好地“修复”AppleScript 中的字符,尽管仍然不知道 Google 为什么要返回这个特殊字符或它到底是什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多