2012-10-12 2 views
2

previous question에서 나는 Google이 UTF-8로 인코딩 된 응답을 쿼리에 전달한다고 들었습니다. 이것은 컬 (curl)로 터미널에 전달 된 후 비 분리 공간 (A0)이 혼란스럽게되는 문제를 해결했습니다. 이것은 curl 출력을 inconv로 파이프하고 UTF-8로 변환하여 해결되었습니다. 그러나이 솔루션을 사용해도 여전히 이상한 결과를 얻고 있습니다.Google 계산기의 특수 문자

{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} 

예상 출력은 다음과 같습니다 :

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

이것은 내가 다른 곳에서 내 브라우저에서보고 있어요 출력은 다음과 같습니다

는 피트 2m의 다음 변환을 고려

{lhs: "2 meters",rhs: "6.56167979 feet (6 feet 6 47/64 inches)",error: "",icc: false} 

텍스트를 정규 표현이나 다른 해결책을 찾았지만 여기서 어떤 일이 일어나고 있는지 알고 싶습니다. 어떤 통찰력?

나는 당신이 바로 그 기능을 리버스 엔지니어링을 시도 할 것으로 보인다 있도록 맥 OS X 마운틴 라이온 10.8.2

답변

2

Google 캘린더는 curl을 통해 액세스하여 JSON을 반환합니다. Google은 JSON의 표준 인 \ xHH 표기법을 사용하고 있습니다. 출력이 표준 출력 대신 브라우저 (또는 HTML을 구문 분석하는 다른 것)로 보내지는 경우 좋은 JSON 디코더 만 필요합니다.

JSON을 구문 분석하기 위해 명령 줄에서 수행 할 수있는 작업을 살펴 ​​보겠습니다.

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

이 우리에게 우리가 브라우저를 통해 볼 수있는 유효한 HTML을 얻을 수 있지만, 우리는 표준 출력을 통해 표시 할 수있는 일에 모든 것을 줄일 필요가있다. 을 -n은 것 에코 개행을 억제하면서, 에코 명령

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

은 -e, 예컨대 \의 X3E \의 x3c 및 \의 X26 (<>, 각각 &)로서 탈출 해석 일반적으로 추가합니다.

sed에 대한 파이프는 모든 (위 첨자) 태그 앞에 공백을 추가 한 다음 모든 HTML 태그를 제거합니다.

그런 다음 perl 로의 파이프는 ⁄과 같은 모든 HTML 엔티티를/(분수 슬래시)로 디코딩합니다. 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은 위 첨자 태그로 래핑 됨)를 구별하는 데 여전히 문제가 있습니다.

우리는 슈퍼 바보 얻을 모든 특수 문자를 구문 분석하는 정말로 긴 나오지 라인을 만들 수 있습니다 (당신이 구문이 도착 얼마나 터무니 볼 수 있도록 애플 스크립트에 다음) :

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 인코딩)에서 십진수 160입니다. 16 진수로 이것은 0xA0 또는 \ xA0이며 UTF-8 인코딩으로 비 차단 공간으로 인코딩됩니다. 이는 Google이 통과 한 것입니다. 따라서 AppleScript에서 UTF-8의 비보안 영역을 대체하려면 Macintosh 인코딩으로 인해 † (단검)을 사용해야합니다. http://tlt.its.psu.edu/suggestions/international/bylanguage/mathchart.html#fractions

이야기의 도덕적를 처리 할 때 즉 :

도 나오지 라인이 다루는 몇 가지 특별한 분수 기호가 있습니다 JSON으로, 좋은 JSON 파서 만 사용하면된다.

하위 도덕은 다음과 같습니다. AppleScript를 사용하여 JSON을 처리하지 마십시오.

+0

우수 답변, 감사합니다. 나는 같은 문제로 고군분투하고 있지만 자바에서는 어려움을 겪고있다. '\ xnn' 문자를 다루는 방법에 대한 제안이 있습니까? – Alp

+0

@Alp 어딘가에 질문을 시작하셨습니까? 문제를 이해하고 도움을 얻으려면 자세한 내용이 필요합니다. – spex

+0

감사합니다. 나는 질문이 이미 작동하도록 요청했다. http://stackoverflow.com/questions/15518340/json-returned-by-google-maps-query-contains-encoded-characters-like-x26-how-to – Alp

1

허용 된 대답은, Is there an official API for Google calculator?가 부정적인 질문을 실행하고 있습니다. 여기에서 분자 47이 <sup> 마크 업 안에 있고 분모 64가 <sub> 마크 업 내에 있고 <>\xnn 표기법을 사용하여 이스케이프 처리되었으며 문자의 16 진 코드가되도록 분수 47/64를 나타내는 것으로 보입니다. 스타일 상 위 첨자와 아래 첨자가 무의미하기 때문에 HTML 마크 업에서이를 수행하는 것이 이상하고 태그 구분 기호를 이스케이프 처리하는 것은 이상한 일이므로별로 의미가없는 것처럼 보입니다. 그러나 주된 문제는 때로는 <sup>이 표현식을 지수로 만들기 위해 위 첨자를 의미 할 수 있으므로 이러한 정보를 제거하면 정보가 왜곡 될 수 있습니다.

+0

Google 계산기 용 공식 API가 있는지 묻는 질문이 없습니다. 제 질문은 전적으로 리버스 엔지니어링에 관한 것입니다. – spex

+0

나는 내 자신의 질문에 대답했다. – spex