Ответ 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).