Jadual Kandungan
Set aksara
Pengekodan Penampan Node.js
Kod sumber pengekodan
Rumah hujung hadapan web tutorial js Mari bercakap tentang pengekodan dalam Node.js Buffer

Mari bercakap tentang pengekodan dalam Node.js Buffer

Aug 31, 2021 am 10:28 AM
buffer encoding node.js

Artikel ini akan membawa anda melalui pengekodan dalam Node.js Penampan saya harap ia akan membantu anda.

Mari bercakap tentang pengekodan dalam Node.js Buffer

Unit terkecil komputer ialah sedikit, iaitu 0 dan 1, yang diwakili oleh tahap tinggi dan rendah pada perkakasan. Walau bagaimanapun, hanya satu bit mewakili maklumat yang terlalu sedikit, jadi 8 bit ditetapkan sebagai satu bait Selepas itu, pelbagai maklumat seperti nombor dan rentetan disimpan berdasarkan bait. [Kajian yang disyorkan: "tutorial nodejs"] Bagaimana untuk menyimpan

aksara? Ia bergantung pada pengekodan aksara yang berbeza sepadan dengan pengekodan yang berbeza Kemudian apabila rendering diperlukan, pustaka fon disemak mengikut pengekodan yang sepadan, dan kemudian grafik aksara yang sepadan diberikan.

Set aksara

Set aksara terawal (set aksara) ialah kod ASCII, iaitu abc ABC 123 dan 128 aksara lain, kerana komputer pertama kali dicipta di Amerika Syarikat . Kemudian, Eropah juga membangunkan satu set piawaian set watak yang dipanggil ISO, dan kemudian China juga membangunkan satu set piawaian yang dipanggil GBK.

Organisasi Antarabangsa untuk Standardisasi merasakan bahawa setiap daripada mereka tidak boleh mempunyai set mereka sendiri, jika tidak, kod yang sama akan mempunyai makna yang berbeza dalam set aksara yang berbeza, jadi mereka mencadangkan pengekodan unikod untuk memasukkan kebanyakan kod dunia, jadi bahawa setiap aksara Hanya pengekodan unik.

Tetapi kod ASCII hanya memerlukan 1 bait untuk disimpan, manakala GBK memerlukan 2 bait, dan beberapa set aksara memerlukan 3 bait, dsb. Ada yang hanya memerlukan satu bait untuk menyimpan tetapi menyimpan 2 Bait, yang merupakan pembaziran ruang . Jadi terdapat skema pengekodan yang berbeza seperti utf-8, utf-16, utf-24 dan sebagainya.

utf-8, utf-16 dan utf-24 semuanya pengekodan unikod, tetapi pelan pelaksanaan khusus adalah berbeza.

UTF-8 Untuk menjimatkan ruang, penyelesaian storan panjang berubah-ubah dari 1 hingga 6 bait direka bentuk. UTF-16 ditetapkan pada 2 bait, dan UTF-24 ditetapkan pada 4 bait.

Mari bercakap tentang pengekodan dalam Node.js Buffer

Akhir sekali, UTF-8 digunakan secara meluas kerana ia menggunakan ruang paling sedikit.

Pengekodan Penampan Node.js

Setiap bahasa menyokong pengekodan dan penyahkodan set aksara, dan Node.js melakukan perkara yang sama.

Buffer boleh digunakan untuk menyimpan data binari dalam Node.js Apabila menukar data binari kepada rentetan, anda perlu menentukan set aksara dari, byteLength, lastIndexOf dan kaedah lain yang menyokong pengekodan:

Pengekodan khusus yang disokong ialah:

utf8, ucs2, utf16le, latin1, ascii, base64, hex

Sesetengah pelajar mungkin mendapati bahawa: base64 dan hex bukan set aksara Ah, kenapa awak ada di sini?

Ya, sebagai tambahan kepada set aksara, skema pengekodan bait ke aksara juga termasuk base64 untuk menukar kepada aksara teks biasa dan hex untuk menukar kepada perenambelasan.

Inilah sebabnya Node.js memanggilnya pengekodan dan bukannya set charset, kerana skim pengekodan dan penyahkodan yang disokong bukan sekadar set aksara.

Jika pengekodan tidak dinyatakan, lalainya ialah utf8.

const buf = Buffer.alloc(11, 'aGVsbG8gd29ybGQ=', 'base64');

console.log(buf.toString());// hello world
Salin selepas log masuk

Kod sumber pengekodan

Saya telah melalui kod sumber Node.js tentang pengekodan:

Bahagian ini melaksanakan pengekodan: https:/ /github.com/nodejs/node/blob/master/lib/buffer.js#L587-L726

Anda boleh melihat bahawa setiap pengekodan melaksanakan pengekodan, pengekodanVal, byteLength, tulis, potong, indexApis ini, kerana apis ini menggunakan skema pengekodan yang berbeza, akan mempunyai hasil yang berbeza Node.js akan mengembalikan objek yang berbeza mengikut pengekodan yang masuk. Ini adalah idea polimorfik.

const encodingOps = {
  utf8: {
    encoding: 'utf8',
    encodingVal: encodingsMap.utf8,
    byteLength: byteLengthUtf8,
    write: (buf, string, offset, len) => buf.utf8Write(string, offset, len),
    slice: (buf, start, end) => buf.utf8Slice(start, end),
    indexOf: (buf, val, byteOffset, dir) =>
      indexOfString(buf, val, byteOffset, encodingsMap.utf8, dir)
  },
  ucs2: {
    encoding: 'ucs2',
    encodingVal: encodingsMap.utf16le,
    byteLength: (string) => string.length * 2,
    write: (buf, string, offset, len) => buf.ucs2Write(string, offset, len),
    slice: (buf, start, end) => buf.ucs2Slice(start, end),
    indexOf: (buf, val, byteOffset, dir) =>
      indexOfString(buf, val, byteOffset, encodingsMap.utf16le, dir)
  },
  utf16le: {
    encoding: 'utf16le',
    encodingVal: encodingsMap.utf16le,
    byteLength: (string) => string.length * 2,
    write: (buf, string, offset, len) => buf.ucs2Write(string, offset, len),
    slice: (buf, start, end) => buf.ucs2Slice(start, end),
    indexOf: (buf, val, byteOffset, dir) =>
      indexOfString(buf, val, byteOffset, encodingsMap.utf16le, dir)
  },
  latin1: {
    encoding: 'latin1',
    encodingVal: encodingsMap.latin1,
    byteLength: (string) => string.length,
    write: (buf, string, offset, len) => buf.latin1Write(string, offset, len),
    slice: (buf, start, end) => buf.latin1Slice(start, end),
    indexOf: (buf, val, byteOffset, dir) =>
      indexOfString(buf, val, byteOffset, encodingsMap.latin1, dir)
  },
  ascii: {
    encoding: 'ascii',
    encodingVal: encodingsMap.ascii,
    byteLength: (string) => string.length,
    write: (buf, string, offset, len) => buf.asciiWrite(string, offset, len),
    slice: (buf, start, end) => buf.asciiSlice(start, end),
    indexOf: (buf, val, byteOffset, dir) =>
      indexOfBuffer(buf,
                    fromStringFast(val, encodingOps.ascii),
                    byteOffset,
                    encodingsMap.ascii,
                    dir)
  },
  base64: {
    encoding: 'base64',
    encodingVal: encodingsMap.base64,
    byteLength: (string) => base64ByteLength(string, string.length),
    write: (buf, string, offset, len) => buf.base64Write(string, offset, len),
    slice: (buf, start, end) => buf.base64Slice(start, end),
    indexOf: (buf, val, byteOffset, dir) =>
      indexOfBuffer(buf,
                    fromStringFast(val, encodingOps.base64),
                    byteOffset,
                    encodingsMap.base64,
                    dir)
  },
  hex: {
    encoding: 'hex',
    encodingVal: encodingsMap.hex,
    byteLength: (string) => string.length >>> 1,
    write: (buf, string, offset, len) => buf.hexWrite(string, offset, len),
    slice: (buf, start, end) => buf.hexSlice(start, end),
    indexOf: (buf, val, byteOffset, dir) =>
      indexOfBuffer(buf,
                    fromStringFast(val, encodingOps.hex),
                    byteOffset,
                    encodingsMap.hex,
                    dir)
  }
};
function getEncodingOps(encoding) {
  encoding += '';
  switch (encoding.length) {
    case 4:
      if (encoding === 'utf8') return encodingOps.utf8;
      if (encoding === 'ucs2') return encodingOps.ucs2;
      encoding = StringPrototypeToLowerCase(encoding);
      if (encoding === 'utf8') return encodingOps.utf8;
      if (encoding === 'ucs2') return encodingOps.ucs2;
      break;
    case 5:
      if (encoding === 'utf-8') return encodingOps.utf8;
      if (encoding === 'ascii') return encodingOps.ascii;
      if (encoding === 'ucs-2') return encodingOps.ucs2;
      encoding = StringPrototypeToLowerCase(encoding);
      if (encoding === 'utf-8') return encodingOps.utf8;
      if (encoding === 'ascii') return encodingOps.ascii;
      if (encoding === 'ucs-2') return encodingOps.ucs2;
      break;
    case 7:
      if (encoding === 'utf16le' ||
          StringPrototypeToLowerCase(encoding) === 'utf16le')
        return encodingOps.utf16le;
      break;
    case 8:
      if (encoding === 'utf-16le' ||
          StringPrototypeToLowerCase(encoding) === 'utf-16le')
        return encodingOps.utf16le;
      break;
    case 6:
      if (encoding === 'latin1' || encoding === 'binary')
        return encodingOps.latin1;
      if (encoding === 'base64') return encodingOps.base64;
      encoding = StringPrototypeToLowerCase(encoding);
      if (encoding === 'latin1' || encoding === 'binary')
        return encodingOps.latin1;
      if (encoding === 'base64') return encodingOps.base64;
      break;
    case 3:
      if (encoding === 'hex' || StringPrototypeToLowerCase(encoding) === 'hex')
        return encodingOps.hex;
      break;
  }
}
Salin selepas log masuk

Ringkasan

Unit terkecil data yang disimpan dalam komputer ialah bit, tetapi unit terkecil maklumat yang disimpan ialah bait Hubungan pemetaan berdasarkan pengekodan dan aksara ialah Pelbagai set aksara telah dilaksanakan, termasuk ascii, iso, gbk, dsb., dan Pertubuhan Standardisasi Antarabangsa telah mencadangkan unicode untuk memasukkan semua aksara Terdapat beberapa penyelesaian pelaksanaan unikod: utf-8, utf-16, utf -24, dan mereka menggunakan bilangan bait yang berbeza untuk menyimpan aksara. Antaranya, utf-8 adalah panjang berubah-ubah dan mempunyai volum simpanan terkecil, jadi ia digunakan secara meluas.

Node.js menyimpan data binari melalui Buffer, dan apabila menukarnya kepada rentetan, anda perlu menentukan skema pengekodan ini bukan sahaja termasuk set aksara (charset), tetapi juga menyokong skema hex dan base64 , termasuk:

utf8, ucs2, utf16le, latin1, ascii, base64, hex

Kami melihat kod sumber pengekodan Node.js dan mendapati setiap skim pengekodan akan digunakan untuk melaksanakan satu siri API Ini adalah pemikiran Polimorfik.

Pengekodan ialah konsep yang sering ditemui semasa mempelajari Node.js, dan pengekodan Node.js bukan sahaja termasuk set aksara. Saya harap artikel ini dapat membantu semua orang memahami pengekodan dan set aksara.

Untuk lebih banyak pengetahuan berkaitan pengaturcaraan, sila lawati:

Pengenalan kepada Pengaturcaraan! !

Atas ialah kandungan terperinci Mari bercakap tentang pengekodan dalam Node.js Buffer. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Penjelasan grafik terperinci tentang memori dan GC enjin Node V8 Penjelasan grafik terperinci tentang memori dan GC enjin Node V8 Mar 29, 2023 pm 06:02 PM

Artikel ini akan memberi anda pemahaman yang mendalam tentang memori dan pengumpul sampah (GC) enjin NodeJS V8 saya harap ia akan membantu anda!

Artikel tentang kawalan memori dalam Node Artikel tentang kawalan memori dalam Node Apr 26, 2023 pm 05:37 PM

Perkhidmatan Node yang dibina berdasarkan bukan sekatan dan dipacu peristiwa mempunyai kelebihan penggunaan memori yang rendah dan sangat sesuai untuk mengendalikan permintaan rangkaian besar-besaran. Di bawah premis permintaan besar-besaran, isu yang berkaitan dengan "kawalan memori" perlu dipertimbangkan. 1. Mekanisme kutipan sampah V8 dan had ingatan Js dikawal oleh mesin kutipan sampah

Mari kita bincangkan tentang cara memilih imej Node.js Docker terbaik? Mari kita bincangkan tentang cara memilih imej Node.js Docker terbaik? Dec 13, 2022 pm 08:00 PM

Memilih imej Docker untuk Node mungkin kelihatan seperti perkara remeh, tetapi saiz dan potensi kelemahan imej itu boleh memberi kesan yang ketara pada proses dan keselamatan CI/CD anda. Jadi bagaimana kita memilih imej Node.js Docker yang terbaik?

Mari bercakap secara mendalam tentang modul Fail dalam Node Mari bercakap secara mendalam tentang modul Fail dalam Node Apr 24, 2023 pm 05:49 PM

Modul fail ialah enkapsulasi operasi fail asas, seperti membaca/menulis/membuka/menutup/memadam fail, dsb. Ciri terbesar modul fail ialah semua kaedah menyediakan dua versi **segerak** dan ** asynchronous**, dengan Kaedah dengan akhiran penyegerakan adalah semua kaedah penyegerakan, dan kaedah yang tidak semuanya adalah kaedah heterogen.

Node.js 19 dikeluarkan secara rasmi, mari bercakap tentang 6 ciri utamanya! Node.js 19 dikeluarkan secara rasmi, mari bercakap tentang 6 ciri utamanya! Nov 16, 2022 pm 08:34 PM

Node 19 telah dikeluarkan secara rasmi Artikel ini akan memberi anda penjelasan terperinci tentang 6 ciri utama Node.js 19. Saya harap ia akan membantu anda!

Mari bercakap tentang mekanisme GC (pengumpulan sampah) dalam Node.js Mari bercakap tentang mekanisme GC (pengumpulan sampah) dalam Node.js Nov 29, 2022 pm 08:44 PM

Bagaimanakah Node.js melakukan GC (pengumpulan sampah)? Artikel berikut akan membawa anda melaluinya.

Mari kita bincangkan tentang gelung acara dalam Node Mari kita bincangkan tentang gelung acara dalam Node Apr 11, 2023 pm 07:08 PM

Gelung peristiwa ialah bahagian asas Node.js dan mendayakan pengaturcaraan tak segerak dengan memastikan bahawa utas utama tidak disekat Memahami gelung peristiwa adalah penting untuk membina aplikasi yang cekap. Artikel berikut akan memberi anda pemahaman yang mendalam tentang gelung acara dalam Node.

Ketahui lebih lanjut tentang Penampan dalam Node Ketahui lebih lanjut tentang Penampan dalam Node Apr 25, 2023 pm 07:49 PM

Pada mulanya, JS hanya berjalan pada bahagian penyemak imbas Mudah untuk memproses rentetan berkod Unikod, tetapi sukar untuk memproses rentetan binari dan bukan berkod Unikod. Dan binari ialah format data peringkat terendah komputer, video/audio/program/pakej rangkaian

See all articles