Как я могу преобразовать непечатаемые символы ascii в читаемую строку для флэш-памяти

У меня проблемы с чтением текста из внешнего XML. У Flash нет проблем с символами ascii из (32-127), но он не может отображать расширенные символы (128-255). В этом XML у меня есть, например, " (DEC: 132) и " (DEC: 147). В XML эти символы не видны, но все же есть. Flash не может их показать. Мой подход состоял в том, чтобы получить каждый charCode и преобразовать его в строку, но это работает только для печатных символов.

var textToConvert:String = xml.parameters.text[1].value;
            trace("LENGTH = "+textToConvert.length);
            var test:String="";
            for(var i:int=1;i<textToConvert.length;i++){
                trace(textToConvert.charCodeAt(i));
                //OCT
                trace(textToConvert.charCodeAt(i).toString(8));
                //HEX
                trace(textToConvert.charCodeAt(i).toString(16));
                //HEX
                test += textToConvert.charCodeAt(i).toString(16);
                trace("SYMBOL : " +String.fromCharCode(textToConvert.charCodeAt(i)))
            }
            trace("TEST: "+test);

Результат:

76

114

4c

СИМВОЛ : Л

132

204

84

СИМВОЛ: (не виден)

Следующее, что я делал, это прикреплять escape-последовательность к каждому символу "\x" в HEX-значении, а затем преобразовывать его в строку, но это тоже не работает:

s = "\x93\x93\x84\x93\x84";

            ba.writeMultiByte(s,"ASCII");
            trace(s);

Это был мой первый подход (не работает):

var byteArray:ByteArray = new ByteArray();
byteArray.writeMultiByte(textToConvert,"iso-8859-1");
trace("HIER: "+byteArray.readUTFBytes(byteArray.bytesAvailable));

Что было бы универсальным подходом к решению этой проблемы?

Это xml, в нем есть скрытые символы ascii (кавычки). Я хочу проанализировать значения узлов, включая эти символы:

XML-DL


person Alex    schedule 06.12.2013    source источник


Ответы (1)


Строки AS3 внутри кодируются как 16-битный Unicode. Они поддерживают ваших персонажей. Он также правильно расшифровал его, поскольку прочитал правильный код символа.

Есть ли в шрифте, используемом для вывода, глиф, способный его отобразить? Это относится даже к консоли AS3. Ваш символ не «пустой», он просто не может его нарисовать. Если вы изменили свою трассировку, чтобы включить кавычки по обе стороны от символа, вы увидите, что он все еще записывает пустое место.

Если вы выгружаете его в TextField вместо того, чтобы использовать шрифт, который, как вы знаете, имеет правильную поддержку, он должен работать так, как ожидалось.

Если это не соответствует вашим потребностям, вам нужно будет сделать какое-то преобразование. Для этого не существует общепринятой библиотеки, поскольку это зависит от ваших потребностей. Что делать с отдельными символами, которым обычно требуется несколько для их представления? ø обычно переводится как «oe», но это может не подходить для строки фиксированной длины. Для большинства букв иврита, кириллицы, арабского языка и т. д. не существует эквивалента. Какие правила вы хотите применить к ним? Вам нужно решить, что вам нужно, а затем выполнить преобразование, соответствующее этим требованиям (или выбрать библиотеку, которая им соответствует).

person AndySavage    schedule 06.12.2013
comment
Все, что я хочу, это вывести это значение узла в текстовое поле. Я не знаю, какое преобразование я должен сделать. Текстовое поле должно отображать все символы. Например, String.fromCharCode(132) должен отображать „, но это не так. Шрифты встроены, для тестов я использую Verdana и Times New Roman. Другой пример: со строкой Hello: „„„ END я получаю Hello: END в текстовом поле. Строка в xml выглядит похоже, кавычки как-то закодированы (есть, но не видны). - person Alex; 06.12.2013
comment
132 — это элемент управления в приложении Latin 1, он не будет отображаться , это не предназначено. Символ „ — 8222 (201E). Я также не вижу этого символа нигде в загруженном XML-файле при просмотре в формате UTF8. Я не уверен, что это проблема Flash. - person AndySavage; 07.12.2013
comment
Если вы используете клавиши со стрелками в узле значений, вы увидите, что курсор не двигается совсем немного. Это символы, закодированные в XML. Однако, если я наберу его непосредственно в XML (ALT+132) и запущу файл .fla, я получу код char 8222, который закодирован в формате latin1 и правильно отображается в текстовом поле. Вопрос теперь будет заключаться в том, как я могу преобразовать расширенные символы ascii в latin1? byteArray.writeMultiByte (textToConvert, iso-8859-1); не работает. - person Alex; 07.12.2013
comment
Как объяснено, полного перевода UTF8 в ASCII не существует, есть только приближения, которые различаются по эффективности в зависимости от ваших потребностей. Однако я не думаю, что это имеет значение в данном случае. Если контент неправильно представляет то, что вы ожидаете, ДО того, как он попадет во Flash, то, конечно, это та часть, которую вы должны исправить? Ваш XML помечен как UTF8, и при декодировании я получаю тот же контент, который Flash (правильно) читает. - person AndySavage; 07.12.2013