Набор символов JavaScript:
Программы JavaScript написаны с использованием наборов символов Unicode. Unicode-это суперсет ASCII и Латин-1 и поддерживает почти все языки на Земле. Ecmascript3 требует, чтобы JavaScript поддерживал Unicode 2.1 и последующие версии, в то время как Ecmascript5 требует поддержки Unicode 3 и последующих версий. Итак, мы написали это
Все программы JavaScript кодируются с использованием Unicode.
UTF-8
UTF-8 (UTF8-битный формат преобразования Unicode)-это кодирование символов переменной длины для Unicode, а также код префикса.
Его можно использовать для представления любого символа в стандарте Unicode, и первый байт в его кодировании по -прежнему совместим с ASCII, что позволяет программному обеспечению, которое первоначально обрабатывает символы ASCII, чтобы продолжать использовать или требует небольшого объема модификации. Следовательно, он постепенно стал предпочтительным кодированием в электронных письмах, веб -страницах и других приложениях для хранения или отправки текста.
Большинство веб-сайтов в настоящее время используют кодирование UTF-8.
Преобразовать строку, кодируемая Unicode
Как упоминалось в заголовке, сценарий приложения очень распространен. Например, при отправке двоичного файла на сервер сервер утверждает, что кодирование двоичного контента должно быть UTF-8. В этом случае мы должны преобразовать строку Unicode JavaScript в строку, кодируемую UTF-8, через программу.
Метод преобразования
Перед конверсией мы должны понимать, что структура кодирования Юникода исправлена.
Если вы не верите в это, вы можете попробовать метод строки Charcodeat, чтобы увидеть, сколько байтов занимает возвращенное Charcode.
• Английский занимает 1 персонаж, а китайские иероглифы занимают 2 персонажа
Однако длина кодирующей структуры UTF-8 определяется размером одного символа.
Ниже приведен размер одного персонажа, который занимает несколько байтов. Максимальная длина после одного символа Unicode составляет 6 байт.
• 1 байт: код Unicode равен 0 - 127
• 2 байта: код Unicode - 128 - 2047
• 3 байта: код Unicode - 2048 - 0xffff
• 4 байта: код Unicode - 65536 - 0x1fffff
• 5 байтов: код Unicode равен 0x200000 - 0x3ffffff
• 6 байтов: код Unicode равен 0x4000000 - 0x7fffffffff
Для получения подробной информации, пожалуйста, смотрите изображение:
Поскольку коды юникода английских и английских персонажей составляют 0 - 127, длина и байты английского языка в Unicode и UTF -8 одинаковы, и занимают только 1 байт. Вот почему UTF8 - суперсет Unicode!
Теперь давайте обсудим китайские иероглифы, потому что интервал кода Unicode китайских персонажей составляет 0x2e80 - 0x9fff, поэтому длина китайских иероглифов в UTF8 составляет до 3 байтов.
Итак, как китайские иероглифы конвертируются из 2 байтов Unicode в три байта UTF8?
Предположим, мне нужно преобразовать китайский иерог
1. Получите размер значения Unicode китайских иероглифы
var str = 'in'; var charcode = str.charcodeat (0); console.log (charcode); // => 20013
2. Судя по длине UTF8 на основе размера
С предыдущего шага мы получаем Charcode китайского персонажа «IS» 20013 года. Затем мы обнаруживаем, что 20013 год находится в интервале 2048 - 0xffff, поэтому китайский символ «в» должен занимать 3 байта в UTF8.
3. Дополнение
Поскольку мы знаем, что китайский персонаж «я» должен занять 3 байта, как мы можем получить эти 3 байта?
Это требует проектирования кода дополнения. Конкретная логика кода комплемента выглядит следующим образом:
Хорошо, я знаю, что вы не можете понять эту картину, поэтому я просто расскажу об этом!
Конкретный код заполнения следующим образом, «X» указывает на пустое пространство, используемое для заполнения.
• 0xxxxxxx
• 110xxxxx 10xxxxxx
• 1110xxxx 10xxxxxx 10xxxxxx
• 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
• 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
• 1111110x 10xxxxxx 10xxxxx 10xxxxxx 10xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ПРЕДУПРЕЖДЕНИЕ: Вы нашли это? Первый байт кода заполнения указывает, сколько байтов занимает весь код UTF-8! Эта функция используется UTF-8, декодированным в Unicode ~
Давайте сначала приведем простой пример. Преобразовать английское письмо «a» в кодирование UTF8.
1. Чаркод «А» - 65
2. 65 находится в интервале между 0-127, так что «А» занимает один байт
3. Дополнение одного байта в UTF8 - 0xxxxxxx. X представляет собой вакантную позицию и используется для комплемента.
4. Преобразовать 65 в двоичный, чтобы получить 1000001
5. Добавьте 1000001 в вакансии 1xxxxxx в порядке от спереди к спине, и получите 01000001
6. Преобразовать 11000001 в строку, чтобы получить «А»
7. Наконец, «А» кодируется UTF8.
В этом небольшом примере мы снова проверили, что UTF-8 является суперсетом Unicode!
Хорошо, давайте вернемся к китайскому персонажу «среднему». Раньше мы получили Charcode «Средний» в 20013 году, а двоичный файл - 010011100 00101101. Детали заключаются в следующем:
var code = 20013; code.tostring (2); // => 10011100101 эквивалентен 01001110 00101101
Затем мы следуем методу «заполнения» в вышеперечисленном положении.
Дополнение 01001110 00101101 В порядке спереди до спины до 1110xxxxx 10xxxxxx 10xxxxxx. Получить 11100100 10111000 10101101.
4. Получить кодированный контент UTF8
Через вышеуказанные шаги мы получаем три байта UTF8 «in», 11100100 10111000 10101101011.
Мы конвертируем каждый байт в шестнадцатеричный и получаем 0xe4 0xb8 0xad;
Тогда это 0xe4 0xb8 0xad - кодирование UTF8, которое мы наконец получили.
Мы используем буфер Nodejs, чтобы проверить, правильно ли он.
var buffer = new Buffer ('in'); console.log (buffer.length); // => 3console.log (buffer); // => <буфер e4 b8 ad> // Наконец -то получите три байта 0xe4 0xb8 0xadПоскольку шестнадцатеричный не имеет корпуса, это точно так же, как мы рассчитали, что 0xe4 0xb8 0xad?
Напишите вышеупомянутую логику кодирования в функцию.
// Форматируйте строку в UTF8-кодированные байты var writeutf = function (str, isgetbytes) {var Back = []; var bytesize = 0; for (var i = 0; i <str.length; i ++) {var code = str.charcodeat (i); if (0x00 <= code && code <= 0x7f) {bytesize += 1; Back.push (code); } else if (0x80 <= code && code <= 0x7ff) {bytesize += 2; Back.push ((192 | (31 & (Code >> 6))))); back.push ((128 | (63 & code))} else if ((0x800 <= code && code <= 0xd7ff) || (0xe000 <= code && code <= 0xffff)) {bytesize += 3; Back.push ((224 | (15 & (Code >> 12)))); Back.push ((128 | (63 & (Code >> 6)))); back.push ((128 | (63 & code))}} для (i = 0; i <back.length; i ++) {Back [i] & = 0xff; } if (isgetbytes) {return acke} if (bytesize <= 0xff) {return [0, bytesize] .concat (обратно); } else {return [bytesize >> 8, bytesize & 0xff] .concat (назад); }} writeutf ('in-on'); // => [0, 3, 228, 184, 173] // Первые две цифры представляют длину последующих байтов UTF8. Поскольку длина составляет 3, первые два байта составляют `0, 3` // Содержимое` 228, 184, 173`, и преобразован в шестнадцатеричную `0xe4 0xb8 0xad` // Читать utf8-кодированные байты и специально разработано для строки Unicode var readutf = function (arr) {if (typeof arr === 'string') {return arr; } var utf = '', _arr = this.init (arr); for (var i = 0; i <_arr.length; i ++) {var one = _arr [i] .toString (2), v = one.match (/^1+? (? = 0)/); if (v && one.length == 8) {var byteslength = v [0] .length; var store = _arr [i] .toString (2) .slice (7 - Byteslength); for (var st = 1; st <byteslength; st ++) {store += _arr [st +i] .toString (2) .slice (2)} utf += string.fromCharcode (parseint (store, 2)); i += byteslength - 1} else {utf += string.fromCharcode (_arr [i])}} return utf} readutf ([0, 3, 228, 184, 173]); => 'В'Еще один метод для анализа китайцев для получения байт -кода UTF8
Другой относительно простой метод преобразования китайцев в UTF8 Bytecode является относительно прост. Браузер также предоставляет метод, и каждый использует этот метод. Что это такое? Это Encodeuri. Конечно, Encodeuricomponent также в порядке.
Это верно, это метод. Итак, как этот метод преобразует кодируемый юникодом китайский в байт-код UTF8?
var str = ''; var code = encodeuri (str); console.log (code); // =>%e4%b8%ad
Вы обнаружили, что я получил сбежательную строку, и содержимое в этой строке совпадает с байт -кодом, который я получил выше раньше.
Далее мы преобразуем%E4%B8%AD в количество чисел.
var codelist = code.split ('%'); codelist = codelist.map (item => parseint (item, 16)); console.log (codelist); // => [228, 184, 173]Так просто, есть ли ~~~
Каков принцип этого простого метода?
Вот проблема кодирования запроса в URIS. Поскольку в соответствии с правилами, запросы в URI должны передаваться в соответствии с кодированием UTF8, а JavaScript является Unicode, поэтому браузер предоставляет нам метод, то есть метод Encodeuri/Encodeurycomponent. Этот метод будет объяснен
Неанглийские персонажи (это считается, почему не английские персонажи?) Сначала преобразуются в байт-код UTF8, а затем добавляют%спереди, чтобы сплачивать их, поэтому мы избежали китайского символа «中» и получили «%E4%B8%AD».
Ну, это все принципы, ничего больше.
Тем не менее, этот метод имеет еще один недостаток, то есть он будет избежать только неанглийских персонажей, поэтому, когда нам нужно отформатировать английских персонажей в кодирование UTF8, этот метод не может удовлетворить наши потребности, и нам также необходимо избежать английских персонажей.
Итак, что мне делать, когда я хочу проанализировать это? Просто используйте decodeuri/decodeuricomponent.
var codelist = [228, 184, 173]; var code = codelist.map (item => '%'+item.tostring (16)). join (''); decodeuri (code); // =>Хорошо, эта статья представит кодирование UTF8.
Я надеюсь, что это поможет вам понять принципы кодирования UTF-8.
Выше приведено все методы реализации для кодирования UTF-8 через JavaScript, принесенный вам. Я надеюсь, что все будут поддерживать wulin.com больше ~