Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 Flash CS4/AS3:控制台和文本区之间用于打印UTF-16字符的不同行为_Actionscript 3_Flash_Unicode_Cs4 - Fatal编程技术网

Actionscript 3 Flash CS4/AS3:控制台和文本区之间用于打印UTF-16字符的不同行为

Actionscript 3 Flash CS4/AS3:控制台和文本区之间用于打印UTF-16字符的不同行为,actionscript-3,flash,unicode,cs4,Actionscript 3,Flash,Unicode,Cs4,将打印“%D0%B4”,即此字符的正确URL编码(西里尔字母相当于“A”) 然而,如果要我做 trace(escape("д")); 打印的内容是: д´ 这当然是错误的。不过,简单地跟踪上面的unescape将返回正确的西里尔字符!对于该区域,转义“П”返回其unicode代码点“%u0434” 我不确定到底发生了什么事情把事情搞砸了,但是 web编码中的UTF-16д为:%FE%FF%00%D0%00%B4 鉴于 web编码中的UTF-16П为:%00%D0%00%B4 所以它在开始时

将打印“%D0%B4”,即此字符的正确URL编码(西里尔字母相当于“A”)

然而,如果要我做

trace(escape("д"));
打印的内容是:

д´

这当然是错误的。不过,简单地跟踪上面的unescape将返回正确的西里尔字符!对于该区域,转义“П”返回其unicode代码点“%u0434”

我不确定到底发生了什么事情把事情搞砸了,但是

web编码中的UTF-16д为:%FE%FF%00%D0%00%B4

鉴于

web编码中的UTF-16П为:%00%D0%00%B4

所以它在开始时用一些东西填充这个值。为什么跟踪会向(空)文本区域提供与打印不同的文本?发生什么事了


所讨论的textarea没有附加任何奇怪的编码属性,如果可能的话。

问题是
unescape
escape
也可能是一个问题,但在这种情况下它不是罪魁祸首)。这些函数不支持多字节。
escape
的作用是:它在输入字符串中获取一个字节,并返回其十六进制表示形式,前面加了一个
%
unescape
的作用正好相反。这里的关键是,它们使用的是字节,而不是字符

您需要的是
encodeURIComponent
/
decodeURIComponent
。两者都使用utf-8作为字符串编码方案(flash everywhere使用的编码)。请注意,它不是utf-16(只要涉及闪存,您就不应该关心它)

现在,如果您想更深入地挖掘,下面是正在发生的事情(假设您对utf-8的工作原理有基本的了解)

这是回报

escape("д")
为什么?

flash将“П”视为utf-8。此字符的代码点为0x0434

二进制:

%D0%B4
它适合于两个utf-8字节,因此它是这样编码的(其中
e
表示编码位,
p
表示有效负载位):

将其转换为十六进制,我们得到:

1101 0000 1011 0100
eeep pppp eepp pppp 
因此,0xd0,0xb4是一个utf-8编码的“ψ”

这被馈送到
转义
<代码>转义看到两个字节,并提供:

0xd0  0xb4
现在,将其传递给
unescape
。但是
unescape
有点脑死亡,所以它总是认为一个字节和一个字符是一回事。就
unescape
而言,您有两个字节,因此有两个字符。如果查找0xd0和0xb4的代码点,您将看到:

%d0%b4

因此,
unescape
返回一个由两个字符组成的字符串,
。然后,当您指定text属性时,您实际上并不是在传递
д´,而是在传递
д´,这就是您在文本区域中看到的内容。

虽然这回答了上述问题,但我发现encodeURIComponent是问题而不是转义。转义西里尔字母会得到“u0434%”,这是正确打印的。encodeURIComponent为我提供了%d0%b4,它被解释为两个字符,如您所说。如果encodeURIComponent的输出被错误地解释为这样,该怎么办?@Amalgovinus。我不确定该如何处理这种情况(我也不知道是什么程序/服务器/etc在解释这些字符)。我只遇到过与西班牙语字符编码相关的问题。所有西班牙语字符的代码点都低于256,因此它们要么未编码,而是作为单个字节发送(ISO-8859-1),要么编码为utf-8(“ñ”例如为%f1或%c3%b1)。如果接收程序不理解utf-8或iso-8859-1,我不确定您应该如何发送数据。你试过utf-16吗?如果它能工作,也许你必须自己进行编码。结果证明,最终的罪魁祸首是我们如何使用URLLoader远程检索数据,然后在其上使用URLDecode。显然,URLDecode无法处理UTF-16并将其解释为UTF-8。解决方案似乎是使用decodeURI(并改变一些其他东西)。谢谢你抽出时间。另外,我的意思是编辑问题而不是你的答案,很抱歉。。。不是“URLDecode”,而是unescape。XD是的,unescape是双层床。“绕了一圈。”阿马尔戈维纳斯说。没问题。我很高兴你找到了解决办法。由于您使用的是URLLoader,在最坏的情况下,您可以将数据作为二进制文件加载,并自己进行所有必要的解码(但似乎您不需要这样做,因为您已经成功地使其工作了)
1101 0000 1011 0100
eeep pppp eepp pppp 
0xd0  0xb4
%d0%b4
0xd0 -> Ð
0xb4 -> ´