Проблема в unescape
(escape
тоже может быть проблемой, но в данном случае она не виновата). Эти функции не поддерживают многобайтность. Что делает escape
, так это: он берет байт во входной строке и возвращает его шестнадцатеричное представление с добавленным %
. unescape
делает наоборот. Ключевым моментом здесь является то, что они работают с байтами, а не с символами.
Вам нужно encodeURIComponent
/ decodeURIComponent
. Оба используют utf-8 в качестве схемы кодирования строк (кодировка, используемая flash везде). Обратите внимание, что это не utf-16 (на что вам не следует обращать внимание, если речь идет о флэш-памяти).
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
д`, и это то, что вы видите в текстовой области.
person
Juan Pablo Califano
schedule
31.03.2011