Flash CS4 / AS3: различное поведение между консолью и текстовой областью для печати символов UTF-16 - PullRequest
2 голосов
/ 31 марта 2011
trace(escape("д"));

выведет "% D0% B4", правильную кодировку URL для этого символа (кириллический эквивалент "A").

Однако, если бы я это сделал ..

myTextArea.htmlText += unescape("%D0%B4");

Что будет напечатано:

д

, что, конечно, неверно.Простое отслеживание вышеупомянутого unescape возвращает правильный символ кириллицы!Для этого texarea экранирование "д" возвращает свою кодовую точку Юникода "% u0434".

Я не уверен, что именно происходит, чтобы запутаться, но ...

UTF-16 в веб-кодировке:% FE% FF% 00% D0% 00% B4

Принимая во внимание, что

UTF-16 д в веб-кодировании:% 00% D0% 00% B4

Таким образом, в начале это значение дополняется чем-то.Почему трассировка предоставляет текст, отличный от распечатки (пустой) текстовой области?Что происходит?

У рассматриваемой текстовой области нет никаких странных свойств кодирования, если это вообще возможно.

1 Ответ

4 голосов
/ 31 марта 2011

Проблема в unescape (escape также может быть проблемой, но в данном случае это не преступник).Эти функции не являются многобайтовыми.escape делает следующее: он берет байт во входной строке и возвращает его шестнадцатеричное представление с добавлением %.unescape делает наоборот.Ключевым моментом здесь является то, что они работают с байтами , а не символами .

. То, что вы хотите, это encodeURIComponent / decodeURIComponent.Оба используют utf-8 в качестве схемы строкового кодирования (кодирование везде используется flash).Обратите внимание, что это не utf-16 (что вас не должно волновать, если речь идет о вспышке).

encodeURIComponent("д"); //%D0%B4
decodeURIComponent("%D0%B4"); // д

Теперь, если вы хотите копнуть немного глубже, вот что происходит (это предполагаетбазовые знания о том, как работает utf-8).

escape("д")

Это возвращает

%D0%B4

Почему?

«д» обрабатывается вспышкой как 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).Затем, когда вы присваиваете текстовое свойство, вы на самом деле не передаете д´ but д`, и это то, что вы видите в текстовой области.

...