Проблема в 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
д`, и это то, что вы видите в текстовой области.