Как получить код ASCII из строки в JavaScript? - PullRequest
3 голосов
/ 29 января 2011

( Подобные вопросы к этому были заданы в StackOverflow, но не совсем так. Ближайший, вероятно, " javascript, как преобразовать строку Unicode в ascii ", где уже есть замечание «это должно быть дубликат [лицензировать]». Я прочитал несколько похожих постов, но они не отвечают на мой конкретный вопрос. Я посмотрел на очень хорошем W3Schools сайте и имею также Гуглил это, но так и не нашел ответа. Так что любые намеки здесь будут очень благодарны.)


У меня есть массив байтов, передаваемых в кусок JavaScript. В JavaScript данные поступают в виде строки. Я не знаю механизм переноса, так как это из стороннего приложения. Я даже не знаю, является ли строка "широкой" или "узкой".

В моем JavaScript у меня есть код вроде b = str.charCodeAt(pos);.

Моя проблема заключается в том, что значение байта, такое как 0x86 = 134, передается как символ 0x2020 = 8224. Это происходит потому, что мой оригинальный байт интерпретируется как латинский-1 (возможно) символ «кинжал», а затем переведено в эквивалентную кодовую точку Unicode. (Проблема может быть или не быть «ошибкой» JavaScript.) Подобные проблемы возникают с другими значениями, хотя диапазоны 0x00..0x7F и 0xA0..0xFF кажутся хорошими, но большинство значений от 0x80..0x9F затрагиваются, в в каждом случае значением представляется Unicode для оригинального Latin-1.

Другое наблюдение состоит в том, что длина строки - это то, что я ожидал бы для узкой строки, если бы длина была измерена в байтах. (С другой стороны, если length возвращает значение в абстрактных символах, это ничего мне не говорит.)

Таким образом, в JavaScript есть способ получить «сырые» байты в строке или получить код символа Latin-1 или ASCII напрямую, или преобразовать кодировки символов, или определить значение по умолчанию кодирование

Я мог бы написать свое собственное отображение, но я бы не хотел. Я ожидаю, что это то, что я в конечном итоге сделаю, но это похоже на клудж на клудж.

Я также выясняю, можно ли что-либо изменить в вызывающем приложении (поскольку это может быть передача данных в виде широкой строки, хотя я сомневаюсь в этом).

В любом случае, мне было бы интересно узнать, существует ли простое решение JavaScript или понять, почему его нет.

(Если бы входящие данные были символьными данными, было бы здорово иметь дело с Unicode. Но это не так, это просто поток двоичных данных.)

Спасибо.

Ответы [ 2 ]

6 голосов
/ 29 января 2011

Нет такой вещи как необработанные байты в строке.Спецификация EcmaScript определяет строку как последовательность кодовых единиц UTF-16.Это самое детальное представление, которое когда-либо встречал любой интерпретатор.

В браузере нет библиотек кодирования.Вы должны свернуть свой собственный, если вы пытаетесь представить байтовый массив в виде строки и хотите перекодировать его.

Если ваша строка уже оказалась действительной ASCII, то вы можете получить числовое значение кодаединица измерения с использованием метода charCodeAt.

"\n".charCodeAt(0) === 10
3 голосов
/ 29 января 2011

Начните со спецификаций Javascript (Ecmascript): http://www.ecma -international.org / публикации / файлы / ECMA-ST / ECMA-262.pdf . Это говорит:

8.4 Тип String Тип String - это множество всех конечных упорядоченных последовательности из 0 или более 16-разрядных целых чисел без знака ценности («элементы»). Тип String обычно используется для представления текстовых данных в работающем ECMAScript программа, в этом случае каждый элемент в строке рассматривается как значение единицы кода (см. раздел 6). каждый элемент считается занимающим положение в последовательность. Эти позиции индексируются с неотрицательные целые числа. Первый элемент (если есть) в позиции 0, следующий элемент (если есть) в позиции 1 и так далее. Длина строки - это число элементов (т.е. 16-битных значений) внутри него. пустая строка имеет нулевую длину и поэтому содержит нет элементов.

Когда строка содержит фактические текстовые данные, каждый Элемент считается единым кодовым блоком UTF-16. Является ли это фактическим форматом хранения String, символы в String нумеруются их начальная позиция элемента кода, как будто они были представлены с использованием UTF-16. Все операции со строками (если не указано иное) рассматривать их как последовательности недифференцированные 16-разрядные целые числа без знака; они не убедитесь, что полученная строка находится в нормализованной форме, или они обеспечивают чувствительные к языку результаты.

ПРИМЕЧАНИЕ. Обоснованием этого проекта было сохранение реализация Strings как простая и высокопроизводительная насколько это возможно. Цель состоит в том, чтобы текстовые данные поступали в среда выполнения извне (например, пользовательский ввод, текст, прочитанный из файла или полученный по сети и т. д.) преобразовать в нормализованную форму Юникод C до запущенная программа видит это. Обычно это происходит на в то же время входящий текст конвертируется из исходного кодировка символов в Unicode (и не будет навязывать дополнительные накладные расходы). Так как рекомендуется, чтобы источник ECMAScript код должен быть в нормализованной форме C, строковые литералы гарантированы нормализуется (если исходный текст гарантированно будет нормализовано), если они не содержат Unicode escape последовательности

Что charCodeAt( p ) дает вам значение UTF-16 (16-битное число) символа с индексом p в строке. Поскольку UTF-16 непосредственно представляет базовую многоязычную плоскость Unicode (это были бы кодовые точки U+0000 - U+D7FF и U+E000 - U+FFFF, ваши символы Latin-1 должны быть теми значениями, которые вы ожидаете от них.

Тот факт, что они не указывают мне, что у вас есть проблема с кодированием входящего потока 3-го октета & mdash; если выполняется преобразование в UTF-16 и неправильное кодирование входящего потока октетов, вы получите странные результаты.

Возможно, это трактуется как ванильный ASCII, тогда как на самом деле это UTF-8 (или наоборот). UTF-8 представляет кодовые точки выше 0x7F как 2-, 3- или 4-октетные "орграфы".

...