Добавление '.'используя jQuery - PullRequest
2 голосов
/ 23 марта 2011

Длина javascript и функция subString не учитывают символы, отличные от ascii.

У меня есть функция, которая подстрокует вводимые пользователем до 400 символов, если они вводят более 400 символов.

например,

function reduceInput (data) {

 if (data.length > 400)
 {
 var reducedSize = data.substring(0,400);
 }
return reducedSize;
}

Однако, если введены символы не ascii (двухбайтовые символы), это не работает.Он не учитывает типы символов в уравнении.

У меня есть другая функция, которая зацикливает вокруг каждого персонажа, и если это не ascii, он увеличивает счетчик, а затем выясняет, что такое истинный счет.Это работает, но это немного хакерство.

Есть ли более эффективный подход к этому или нет другой альтернативы?

Спасибо

Ответы [ 2 ]

3 голосов
/ 23 марта 2011

Собственный набор символов JavaScript и веб-браузеров в целом - UTF-16. Строки - это последовательности единиц кода UTF-16. Не существует понятия "двухбайтовые" кодировки символов.

Если вы хотите вычислить, сколько байтов строка займет в конкретной двухбайтовой кодировке, вам нужно знать, что это за кодировка и как ее кодировать самостоятельно; эта информация не будет доступна для JavaScript изначально. Так, например, для Shift_JIS вам нужно знать, какие символы являются кана, которые могут быть закодированы в один байт, а какие участвуют в двухбайтовых последовательностях кандзи.

Не существует кодировки, в которой все кодовые единицы, представляющие ASCII, представлены в одном байте, а все кодовые единицы, кроме ASCII, - в двух байтах, поэтому любой вопрос, который вы пытаетесь решить, считая не-ASCII двумя, цикл и -адд, наверное, не правильный ответ.

В любом случае двухбайтовые кодировки старой школы представляют собой ужасный анахронизм, которого следует избегать, когда это возможно. Если вам нужно кодирование байтов с эффективным использованием пространства, вам нужен UTF-8. Легко вычислить длину строки в байтах UTF-8, потому что в JS есть скрытый встроенный кодер UTF-8, который вы можете использовать:

var byten= unescape(encodeURIComponent(chars)).length;

Обрезать строку до 400 байт несколько сложнее, потому что вы хотите избежать прерывания многобайтовой последовательности. Вы получите исключение, если попытаетесь UTF-8-декодировать что-то с прерванной последовательностью в конце, поэтому поймайте это и попробуйте снова:

var bytes= unescape(encodeURIComponent(chars)).slice(0, 400);
while (bytes.length>0) {
    try {
        chars= decodeURIComponent(escape(bytes));
        break
    } catch (e) {
        bytes= bytes.slice(0, -1);
    }
}

Но необычно хотеть ограничить ввод, основанный на количестве байтов, которые он займет в конкретной кодировке. Прямой лимит на количество символов гораздо более типичен. Что ты пытаешься сделать?

1 голос
/ 23 марта 2011

регулярное выражение может сделать работу, я думаю,

var data = /.{0,400}/.exec(originalData)[0];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...