AS3:转换为GBK字符集

时间:2014-12-08 04:18:33

标签: actionscript-3 flex character-encoding

使用Flex(和HTTPService),我正在从URL加载数据,这些数据是用GBK字符集编码的。这种URL的一个很好的例子是this one

浏览器获取数据在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方法相同但接近但不完全的结果。同样在NP ++中,当转换正确/期望的字符串,从gbk转换为iso-8859-1时,我得到的字符串与Flex从URL中获得的字符串略有不同:

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

在我看来,这个字符串是Flex 应该获取的字符串,让ByteArray方法创建正确的结果(在浏览器中可见)。所以我认为可能有3个原因:

  1. 从URL到Flex的数据发生了变化,导致它略有不同(不太可能)
  2. 收到的charset实际上不是iso-8859-1,而是另一个类似的charset
  3. 我没有完全掌握编码和字符集之间的区别,所以这可能让我无法理解这个问题。
  4. 任何帮助/想法将不胜感激。 谢谢。

1 个答案:

答案 0 :(得分:1)

管理以找到问题和解决方案,希望这将在未来帮助其他任何人。

使用HTTPService自动将结果转换为String,这可能会将某些字节对压缩为单个字符。这就是为什么我得到第一个结果(见上)而不是第三个结果。我需要做的是以二进制形式获取结果,而HTTPService没有这种类型的 resultFormat ;但是URLLoader会这样做。

  1. 将HTTPService替换为URLLoader
  2. 将URLLoader的 dataFormat 属性设置为URLLoaderDataFormat.BINARY
  3. 加载后,data属性将作为ByteArray返回。跟踪此字节数组(或将其转换为字符串)将显示与HTTPService获得的结果相同的结果,这仍然是错误的,但实际上字节数组实际上保存了字节的正确数据字节(字节数组的长度属性)将比转换后的字符串的大小略大一些。)
  4. 所以你可以使用“gbk”字符集从这个bytearray中读取字符串:

    byteArray.readMultyByte(byteArray.length,“gbk”);

  5. 这将返回正确的字符串,浏览器也会显示该字符串。