首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Flash CS4/AS3:控制台和文本区域之间打印UTF-16字符的不同行为

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

Stack Overflow用户
提问于 2011-03-31 08:21:27
回答 1查看 1.2K关注 0票数 2
代码语言:javascript
复制
trace(escape("д"));

将打印"%D0%B4",这是该字符的正确URL编码(西里尔文相当于"A")。

然而,如果我要做..

代码语言:javascript
复制
myTextArea.htmlText += unescape("%D0%B4");

打印的内容是:

--

这当然是不正确的。不过,简单地跟踪上面的未转义将返回正确的西里尔文字符!对于这个文本区域,转义"д“将返回其unicode代码点"%u0434”。

我不知道到底发生了什么把事情搞砸了,但是...

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

鉴于

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

所以它在开始的时候填充了这个值。为什么跟踪提供的文本与打印到(空)文本区域的文本不同?怎么回事?

有问题的文本区域没有附加任何奇怪的编码属性,如果这种事情是可能的话。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-03-31 10:42:45

问题出在unescape (escape也可能是一个问题,但在本例中它不是罪魁祸首)。这些函数不支持多字节。escape所做的是这样的:它接受输入字符串中的一个字节,并返回其十六进制表示形式,并在前面加上一个%unescape做了相反的事情。这里的关键点是它们使用字节,而不是字符。

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

代码语言:javascript
复制
encodeURIComponent("д"); //%D0%B4
decodeURIComponent("%D0%B4"); // д

现在,如果您想更深入地研究,这里是正在发生的事情(这假设您对utf-8的工作原理有基本的了解)。

代码语言:javascript
复制
escape("д")

这将返回

代码语言:javascript
复制
%D0%B4

为什么?

flash将"д“视为utf-8。此字符的代码点是0x0434。

以二进制表示:

代码语言:javascript
复制
0000 0100 0011 0100

它适合两个utf-8字节,所以它是这样编码的(其中e表示编码位,p表示有效载荷位):

代码语言:javascript
复制
1101 0000 1011 0100
eeep pppp eepp pppp 

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

代码语言:javascript
复制
0xd0  0xb4

因此,0xd0,0xb4是一个utf-8编码的"д“。

这是提供给escape的。escape会看到两个字节,并提供给您:

代码语言:javascript
复制
%d0%b4

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

代码语言:javascript
复制
0xd0 -> Ð
0xb4 -> ´

因此,unescape返回一个由两个字符组成的字符串,д (而不是计算出它得到的两个字节实际上只有一个字符,utf-8编码)。然后,当您分配text属性时,您实际上并没有传递д´ but-`,这是您在文本区域中看到的内容。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5494011

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档