Подтвердить что ты не робот

Как обеспечить, чтобы текст, закодированный в форме, был utf8

У меня есть html-окно, с помощью которого пользователи могут вводить текст. Я хотел бы, чтобы весь текст, введенный в поле, был либо закодирован в UTF-8, либо преобразован в UTF-8, когда пользователь заканчивает печатать. Кроме того, я не совсем понимаю, как различные кодировки UTF выбираются при вводе в текстовое поле.

В общем, мне интересно узнать следующее:

  • Как браузер определяет, какие кодировки использовать, когда пользователь вводит текстовое поле?
  • Как javascript определяет кодировку строкового значения в текстовом поле html?
  • Могу ли я заставить браузер использовать кодировку UTF-8?
  • Как я могу кодировать произвольные кодировки для UTF-8? Я предполагаю, что для этого есть библиотека JavaScript?

** Изменить **

Убрали некоторые вопросы, не нужные для моих целей.

Этот учебник помог мне лучше понять коды символов JavaScript, но он багги и на самом деле не переводит коды символов в utf-8 во всех случаях. http://www.webtoolkit.info/javascript-base64.html

4b9b3361

Ответ 1

  • Как браузер определяет, какие кодировки использовать, когда пользователь вводит текстовое поле?

Используется кодировка, по которой эта страница была декодирована по умолчанию. В соответствии с спецификацией вы можете переопределить это с помощью атрибута accept-charset элемента <form>, но IE не работает, поэтому вы не должны полагаться на это (я видел, что несколько разных источников описывают несколько разных ошибок, и у меня нет всех соответствующих версий IE для проверки, поэтому я оставлю это на этом).

  • Как javascript определяет кодировку строкового значения в текстовом поле html?

Все строки в JavaScript закодированы в UTF-16. Браузер будет отображать все в UTF-16 для JavaScript, а также из UTF-16 в любую кодировку страницы.

UTF-16 является кодировкой, которая выросла из UCS-2. Первоначально считалось, что для всего Юникода будет достаточно 65 536 кодовых точек, и поэтому будет достаточно 16-битного кодирования символов. Оказалось, что это не так, и поэтому набор символов был расширен до 1114 112 пунктов кода. Чтобы поддерживать обратную совместимость, несколько неиспользуемых диапазонов 16-разрядного набора символов были отложены для суррогатных пар, в которых для кодирования одного символа использовались два 16-разрядных кодовых блока. Подробнее читайте в UTF-16 и UCS-2 в Википедии.

Результат заключается в том, что когда в JavaScript есть строка str, str.length не дает вам количества символов, она дает вам количество блоков кода, где два кодовых блока могут использоваться для кодирования одного символ, если этот символ не входит в базовую многоязычную плоскость. Например, "abc".length дает вам 3, но "𐤀𐤁𐤂".length дает вам 6; и "𐤀𐤁𐤂".substring(0,1) дает то, что выглядит как пустая строка, так как половина суррогатной пары не может быть отображена, но строка все еще содержит этот недопустимый символ (я не буду гарантировать, что это работает с перекрестным браузером, я считаю, что допустимо сбросить сломанные символы). Чтобы получить действительный символ, вы должны использовать "𐤀𐤁𐤂".substring(0,2).

  • Могу ли я заставить браузер использовать только кодировку UTF-8?

Лучший способ сделать это - доставить вашу страницу в UTF-8. Убедитесь, что ваш веб-сервер отправляет соответствующие заголовки Content-type: text/html; charset=UTF-8. Вы также можете вставить элемент <meta charset="UTF-8"> в свой элемент <head>, для случаев, когда Content-Type не устанавливается правильно (например, если ваша страница загружена с локального диска).

  • Как я могу кодировать произвольные кодировки для UTF-8? Я предполагаю, что для этого есть библиотека JavaScript?

В JavaScript нет необходимости кодировать текст в определенных кодировках. Если вы просто пишете DOM или читаете или заполняете элементы управления формой, вы должны просто использовать строки JavaScript, которые рассматриваются как последовательности блоков кода UTF-16. XMLHTTPRequest, когда используется send(data) через POST, будет использовать UTF-8 (если вы передадите ему документ с другой кодировкой, объявленной в объявлении <?xml ...>, он может или не может преобразовать это в UTF-8, поэтому для совместимости вы вообще не должны использовать ничего, кроме UTF-8).

Ответ 2

Я хочу, чтобы весь текст, введенный в поле, был либо закодирован в UTF-8

Текст в HTML DOM, включая поля ввода, не имеет встроенной байтовой кодировки; он хранится в виде символов Unicode (в частности, на стандартном уровне DOM и ECMAScript, кодовых единицах UTF-16; в редком случае вы используете символы за пределами базовой многоязычной плоскости, можно увидеть разницу, например. '𝅘𝅥𝅯'.length равно 2).

Только при отправке формы текст сериализуется в байты с использованием конкретной кодировки, по умолчанию ту же кодировку, которая использовалась для анализа страницы. Таким образом, вы должны обслуживать страницу, содержащую форму, как UTF-8 (через Content-Type header charset и/или эквивалентный тег <meta>).

В принципе, для атрибута accept-charset элемента <form> есть переопределение для него, оно не работает корректно (и во многих случаях активно вредно) в IE. Поэтому избегать.

В JavaScript не существует явных функций обработки кодировки. Вы можете взломать кодировщик Unicode-to-UTF-8-байтов, привязав unescape(encodeURIComponent(str)) (и аналогичным образом наоборот с обратной функцией), но об этом.

Ответ 3

Текст в текстовом поле не закодирован каким-либо образом; это "текст", абстрактная серия символов. Почти во всех современных приложениях этот текст выражается в виде последовательности кодов Unicode, которые представляют собой целые числа, сопоставленные определенным абстрактным символам. Текст не получает "закодированный", пока он не превратится в последовательность байтов, как при отправке формы. В то время кодировка определяется кодировкой HTML-страницы, в которой отображается форма, или атрибутом accept-charset элемента формы.