2012-10-10 104 views
2

注:對於與此相關的更多答案,請參閱 Special Characters in Google Calculator谷歌計算器千位分隔符特殊字符

抓住了谷歌計算器計算的返回值時,我注意到,千位是由一個相當奇怪的字符分隔。這不僅僅是一個空間。

讓我們以4000美元兌換GBP爲例。

如果您訪問以下鏈接谷歌:

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.

任何人都可以讓我洞察谷歌傳遞給我的東西嗎?

回答

3

這是一個非換空間,U + 00A0。這是爲了確保該號碼不會在行末結束。

谷歌返回正確的編碼(UTF-8),但是:

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

所以......

  • 如果它出來作爲一個正常的空間(U + 0020),而不是(Firefox沒有當足夠愚蠢地進行復制時),那麼應用程序會執行某些字符轉換爲lookalikes,或許適合某種受限制的代碼頁(可能是ASCII)。
  • 如果存在問號,則它被正確讀取爲Unicode,但處理中的某些部分使用遺留字符集,該字符集不包含該字符以便轉換。
  • 如果存在替換字符U(U + FFFD),那麼它很可能被讀爲UTF-8,轉換爲包含該字符的舊字符集(例如Latin 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 
... 

又一個快速瀏覽一下響應頭顯示,該編碼的設置是否正確。

+0

謝謝。你是如何確定這一點的? – spex

+0

我添加了一個關於如何的說明。但實際上這是相當基本的東西。 – Joey

+0

我真的很感謝徹底的迴應。我學到了很多。 – spex

0

嘗試

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

這工作就好「固定」在AppleScript的性格,雖然還沒有知道Google爲什麼要返回這個特殊字符或者究竟是什麼。 – spex

2

根據我與curl在OSX的終端測試,通過改變終端喜好的國際字符編碼:編碼是ISO拉丁文1

當我的編碼設置爲UTF-8:我得到 「2 498.28243?」

當我的編碼設置爲macroman:我得到 「2†498.28243」

首先解決方法:使用用戶代理從任何瀏覽器(Safari瀏覽器上OSX 10.6.8在這個例子中)

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 
+0

我試圖使用inconv,但只輸入-t(to)而不是正確的-f(從)。謝謝。您的電子數據交換解決方案比我嘗試的解決方案更好,是我目前的解決方案。 – spex

+0

我發現以下輸出JSON答案部分中的有效HTML:'echo -en $(curl -s'http://www.google.com/ig/calculator?hl=zh-CN&q=QUERY')> 〜/溫度。其中-e用於echo解釋轉義,-n禁止echo換行符,QUERY表示url編碼查詢。 – spex