2014-12-08 67 views
0

使用Flex(和HTTPService),我從URL加載數據,使用GBK字符集編碼數據。這種URL的一個很好的例子是this oneAS3:轉換爲GBK字符集

瀏覽器得到數據在GBK字符集中,並正確顯示使用中文字符的文本出現的位置。然而,Flex的將持有的數據在不同的字符集,這恰好是這樣的:

({"q":"tes","p":false,"bs":"","s":["ÌØ˹À­","ÌØÊâ·ûºÅ","test","ÌØÊâÉí·Ý","tesco","ÌØ˹À­Æû³µ","ÌØÊÓÍø","ÌØÊâ·ûºÅͼ°¸´óȫ","testin","ÌØ˹À­Æ۸ñ"]}); 

我需要正確地更改文本,以相同的字符串,該瀏覽器中顯示。 什麼我已經用做的是使用ByteArray的,最好的結果又「ISO-8859-1」:

var convert:String; 
var byte:ByteArray = new ByteArray(); 
byte.writeMultiByte(event.result as String, "iso-8859-1"); 
byte.position = 0; 
convert = byte.readMultiByte(byte.bytesAvailable, "gbk"); 

這產生了下面的字符串,這是非常接近的瀏覽器的結果,但不完全:

({"q":"tes","p":false,"bs":"","s":["特?拉","特殊符號","test","特殊身份","tesco","特?拉汽車","特視網","特殊符號?案大?","testin","特?拉????]}); 

某些字符仍然被「?」替換。分數。當我將瀏覽器結果複製到Flex並打印出來時,它會正確顯示,因此它不是Flash跟蹤中不支持的字符或類似的東西。

有趣的事實:Notepad ++提供了與Flex中的bytearray方法相同的close-but-not-quite結果。此外,在NP ++,將正確/預期的字符串時,從GBK到ISO-8859-1,我得到一個稍微不同的字符串比一個Flex是從網址獲得:

({"q":"tes","p":false,"bs":"","s":["ÌØ˹À­","ÌØÊâ·ûºÅ","test","ÌØÊâÉí·Ý","tesco","ÌØ˹À­Æû³µ","ÌØÊÓÍø","ÌØÊâ·ûºÅͼ°¸´óÈ«","testin","ÌØ˹À­Æû³µ¼Û¸ñ"]}); 

在我看來,這字符串是Flex 應該得到的字符串,以使ByteArray方法創建正確的結果(在瀏覽器中可見)。因此,我認爲可能3個原因是:

  1. 又出事了從URL到Flex的未來數據,使其略有不同(不太可能)
  2. 接收到的字符集是不實際ISO-8859- 1,但另一個類似的字符集
  3. 我沒有完全掌握編碼和字符集之間的區別,所以也許這讓我無法理解問題。

任何幫助/想法將不勝感激。 謝謝。

回答

1

管理找到問題和解決方案,希望這將有助於其他人在未來。

使用HTTPService自動將結果轉換爲字符串,該字符串可能會將某些字節對壓縮爲單個字符。這就是爲什麼我得到第一個結果(查看)而不是第三個結果。我需要做的是以二進制形式獲得結果,並且HTTPService沒有這種類型的resultFormat;但是URLLoader可以。

  1. 和使用URLLoader
  2. 的的URLLoader的DATAFORMAT屬性設置爲URLLoaderDataFormat.BINARY
  3. 裝載後,數據屬性將返回爲ByteArray更換的HTTPService。跟蹤這個字節數組(或將其轉換爲字符串)將顯示與HTTPService獲得的結果相同的結果,但仍然是錯誤的,但實際上字節數組實際上保存了字節的正確數據字節(字節數組的length屬性會比轉換字符串的大小大一些)。
  4. 所以你可以從這個字節組讀取字符串,使用 「GBK」 字符集:

    byteArray.readMultyByte(byteArray.length, 「GBK」);

這將返回瀏覽器正在顯示的正確字符串。