trace(escape("д"));将打印"%D0%B4",这是该字符的正确URL编码(西里尔文相当于"A")。
然而,如果我要做..
myTextArea.htmlText += unescape("%D0%B4");打印的内容是:
--
这当然是不正确的。不过,简单地跟踪上面的未转义将返回正确的西里尔文字符!对于这个文本区域,转义"д“将返回其unicode代码点"%u0434”。
我不知道到底发生了什么把事情搞砸了,但是...
web编码中的UTF-16为:%FE%FF%00%D0%00%B4
鉴于
web编码中的UTF-16д为:%00%D0%00%B4
所以它在开始的时候填充了这个值。为什么跟踪提供的文本与打印到(空)文本区域的文本不同?怎么回事?
有问题的文本区域没有附加任何奇怪的编码属性,如果这种事情是可能的话。
发布于 2011-03-31 10:42:45
问题出在unescape (escape也可能是一个问题,但在本例中它不是罪魁祸首)。这些函数不支持多字节。escape所做的是这样的:它接受输入字符串中的一个字节,并返回其十六进制表示形式,并在前面加上一个%。unescape做了相反的事情。这里的关键点是它们使用字节,而不是字符。
您需要的是encodeURIComponent / decodeURIComponent。两者都使用utf-8作为字符串编码方案(由flash everywhere使用的编码)。请注意,它不是utf-16 (只要涉及到flash,您就不应该关心它)。
encodeURIComponent("д"); //%D0%B4
decodeURIComponent("%D0%B4"); // д现在,如果您想更深入地研究,这里是正在发生的事情(这假设您对utf-8的工作原理有基本的了解)。
escape("д")这将返回
%D0%B4为什么?
flash将"д“视为utf-8。此字符的代码点是0x0434。
以二进制表示:
0000 0100 0011 0100它适合两个utf-8字节,所以它是这样编码的(其中e表示编码位,p表示有效载荷位):
1101 0000 1011 0100
eeep pppp eepp pppp 将其转换为十六进制,我们得到:
0xd0 0xb4因此,0xd0,0xb4是一个utf-8编码的"д“。
这是提供给escape的。escape会看到两个字节,并提供给您:
%d0%b4现在,将这个传递给unescape。但是unescape有点脑死亡,所以它总是认为一个字节和一个字符是一回事。就unescape而言,您有两个字节,因此,您有两个字符。如果您查找0xd0和0xb4的代码点,您将看到:
0xd0 -> Ð
0xb4 -> ´因此,unescape返回一个由两个字符组成的字符串,Ð和´ (而不是计算出它得到的两个字节实际上只有一个字符,utf-8编码)。然后,当您分配text属性时,您实际上并没有传递д´ but-`,这是您在文本区域中看到的内容。
https://stackoverflow.com/questions/5494011
复制相似问题