使用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个原因:
任何帮助/想法将不胜感激。 谢谢。
答案 0 :(得分:1)
管理以找到问题和解决方案,希望这将在未来帮助其他任何人。
使用HTTPService自动将结果转换为String,这可能会将某些字节对压缩为单个字符。这就是为什么我得到第一个结果(见上)而不是第三个结果。我需要做的是以二进制形式获取结果,而HTTPService没有这种类型的 resultFormat ;但是URLLoader会这样做。
所以你可以使用“gbk”字符集从这个bytearray中读取字符串:
byteArray.readMultyByte(byteArray.length,“gbk”);
这将返回正确的字符串,浏览器也会显示该字符串。