首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Google Calculator中的特殊字符

Google Calculator中的特殊字符
EN

Stack Overflow用户
提问于 2012-10-13 05:37:05
回答 2查看 635关注 0票数 2

在一次previous question中,我被告知谷歌会将UTF8编码的响应传递给查询。这解决了不间断空格(A0)在通过curl传递到我的终端后变得混乱的问题。通过将curl输出通过管道传输到inconv并转换为UTF-8,解决了这个问题。然而,即使有了这个解决方案,我仍然得到了一些奇怪的输出。

考虑以下2米到英尺的转换:

http://www.google.com/ig/calculator?hl=en&q=2%20m%20in%20feet

这是我在浏览器和其他地方看到的输出:

代码语言:javascript
复制
{lhs: "2 meters",rhs: "6.56167979 feet (6 feet 6\x3csup\x3e47\x3c/sup\x3e\x26#8260;\x3csub\x3e64\x3c/sub\x3e inches)",error: "",icc: false}

预期输出为:

代码语言:javascript
复制
{lhs: "2 meters",rhs: "6.56167979 feet (6 feet 6 47/64 inches)",error: "",icc: false}

我可以使用正则表达式或其他解决方案进行文本替换,但我想知道这里发生了什么。有什么见解吗?

我正在运行Mac OS X Mountain Lion 10.8.2

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-16 02:13:08

通过curl访问的Google Calculator返回JSON。Google使用\xHH表示法作为JSON的标准。如果要将输出发送到浏览器(或其他解析HTML的内容)而不是标准输出,则只需要一个好的JSON解码器。

让我们看看可以从命令行执行哪些操作来解析JSON。

echo -en $(curl -s 'http://www.google.com/ig/calculator?hl=en&q=4^22') > ~/temp.html

这将使我们获得有效的HTML,我们可以通过浏览器查看,但我们需要将所有内容简化为可以通过标准输出显示的内容。

echo -en "$(curl -s --connect-timeout 10 "http://www.google.com/ig/calculator?hl=en&q=2%20m%20in%20feet")" | sed -e 's/<sup>/ &/g' -e :a -e 's/<[^>]*>//g;/</N;//ba' | perl -MHTML::Entities -ne 'print decode_entities($_)' | iconv -f ISO-8859-1 -t UTF-8

对于echo命令,-e解释转义,例如\x3e、\x3c和\x26 (分别为<、>和&),而-n则取消echo通常会添加的换行符。

到sed的管道在所有(上标)标记之前添加一个空格,然后删除所有HTML标记。

然后,到perl的管道将所有⁄实体解码为⁄(斜杠)。http://en.wikipedia.org/wiki/Html_special_characters#Character_entity_references_in_HTML

到iconv的管道将ISO-8859-1输出转换为预期的UTF-8。这是最后完成的,因为perl行可以生成需要正确转换的UTF-8实体。

这仍然存在区分分数和指数的问题( 47 /64,其中47包含在上标标记中,64包含在下标标记中,以及10^13,其中13包含在上标标记中)。

我们可以变得非常愚蠢,创建一个非常长的sed行来解析所有的特殊字符(下面是用AppleScript编写的,所以你可以看到它的语法有多荒谬):

set jsonResponse to do shell script "curl " & queryURL & " | sed -e 's/[†]/,/g' -e 's/\\\\x26#215;/*/g' -e 's/\\\\x26#188;/ 1\\/4/g' -e 's/\\\\x26#189;/ 1\\/2/g' -e 's/\\\\x26#190;/ 3\\/4/g' -e 's/\\\\x26#8539;/ 1\\/8/g' -e 's/\\\\x26#8540;/ 3\\/8/g' -e 's/\\\\x26#8541;/ 5\\/8/g' -e 's/\\\\x26#8542;/ 7\\/8/g' -e 's/\\\\x3csup\\\\x3e\\([0-9]*\\)\\\\x3c\\/sup\\\\x3e\\\\x26#8260;\\\\x3csub\\\\x3e\\([0-9]*\\)\\\\x3c\\/sub\\\\x3e/ \\1\\/\\2/g' -e 's/\\\\x3csup\\\\x3e\\([0-9]*\\)\\\\x3c\\/sup\\\\x3e/^\\1/' -e 's/( /(/g'"

在MacRoman集合(Macintosh编码)中,†(dagger)字符是160个十进制字符。在十六进制中,这是0xA0或\xA0,并编码为UTF-8编码中的非中断空格,这是Google正在传递的。因此,在AppleScript中,为了取代UTF-8中的不间断空格,由于Macintosh编码,我们必须使用†(dagger)。

  • http://en.wikipedia.org/wiki/Mac_Roman#Codepage_layout
  • http://en.wikipedia.org/wiki/UTF-8
  • http://en.wikipedia.org/wiki/C1_Controls_and_Latin-1_Supplement

sed行还处理几个特殊的分数符号:http://tlt.its.psu.edu/suggestions/international/bylanguage/mathchart.html#fractions

这个故事的寓意是,在处理JSON时,只需使用好的JSON解析器即可。

一个次要的教训是:不要使用AppleScript来处理JSON。

票数 2
EN

Stack Overflow用户

发布于 2012-10-13 06:33:11

问题Is there an official API for Google calculator?的公认答案是否定的,所以看起来你只需要尝试对其功能进行反向工程。这里,它似乎表示分数47/64,因此分子47在<sup>标记内,分母64在<sub>标记内,然后<>已使用\xnn表示法进行转义,其中nn是字符的十六进制代码。这似乎没有多大意义,因为风格上的上标和下标没有意义,在HTML标记中这样做很奇怪,而且转义标签分隔符也很奇怪。然而,主要的问题是,有时<sup>可能意味着上标来使表达式成为指数,所以仅仅删除这些信息可能会扭曲信息。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12867450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档