最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript中字符串GBK與GB2312的編解碼示例講解

 更新時間:2023年12月19日 11:19:06   投稿:yin  
在瀏覽器JavaScript環(huán)境中,可以使用TextEncoder和TextDecoder?API?來進(jìn)行?GBK?編碼和解碼,也可以使用?encodeURIComponent?函數(shù)對字符串進(jìn)行編碼,最好使用第三方庫,比如iconv-lite來實現(xiàn)

在瀏覽器JavaScript環(huán)境中,可以使用TextEncoder和TextDecoder API 來進(jìn)行 GBK 編碼和解碼。也可以使用 encodeURIComponent 函數(shù)對字符串進(jìn)行編碼。最好使用第三方庫,比如iconv-lite來實現(xiàn)。

前言

charCodeAt() 方法

charCodeAt() 方法可返回指定位置的字符的 Unicode 編碼,返回值是 0 - 65535 之間的整數(shù),表示給定索引處的 UTF-16 代碼單元。

字符串中第一個字符的位置為 0, 第二個字符位置為 1,以此類推。

示例:

let str = "abc"
let unicode = str.charCodeAt(1)
// 98
console.log(unicode);

fromCharCode() 方法

fromCharCode() 可接受一個指定的 Unicode 值,然后返回一個字符串。

注意:該方法是 String 的靜態(tài)方法,字符串中的每個字符都由單獨的 Unicode 數(shù)字編碼指定。使用語法: String.fromCharCode()。

示例:

let result = String.fromCharCode(98)
// b
console.log(result);

iconv庫

由于在實現(xiàn)中使用了iconv庫對編解碼進(jìn)行了轉(zhuǎn)換,所以需要先安裝該庫。即

npm install iconv-lite

然后在使用前引入庫:

var iconv = require("iconv-lite");

可以在瀏覽器端全局引入iconv-lite.js來使用。

字符集概念

1)字符與字節(jié)(Character)

字符是各種文字和符號的總稱,包括亂碼;一個字符對應(yīng)1~n個字節(jié),一字節(jié)對應(yīng)8位,每位用0或1表示。

2)字符集(Character Set)

字符集是多個字符的集合,每個字符集包含的字符個數(shù)不同,常見字符集名稱:ASCII字符集、GB2312字符集、Unicode字符集等。

3)字符集編碼(Character Encoding)

字符集編碼就是將符號轉(zhuǎn)換為計算機(jī)可讀的二進(jìn)制,解碼就是把二進(jìn)制轉(zhuǎn)換為人類可讀的符號。

字符集大多對應(yīng)一種編碼方式(例如GBK對應(yīng)GBK編碼),但Unicode編碼有多種,包括UTF-8、UTF-16、UTF-32和UTF-7。

目前網(wǎng)頁用的最多的就是“UTF-8”,UTF-8使用一至四個字節(jié)為每個字符編碼,是ASCII的一個超集,所以現(xiàn)存的ASCII文本不需要轉(zhuǎn)換

瀏覽器進(jìn)制概念

1)HTML屬性中使用十進(jìn)制和十六進(jìn)制

十進(jìn)制在HTML中可使用“8”,十六進(jìn)制,則使用“Z”,比十進(jìn)制多了個x,進(jìn)制碼中也多了a~f這6個字符來表示10~15。

2)CSS屬性中使用十進(jìn)制和十六進(jìn)制

CSS兼容HTML的進(jìn)制形式,除此之外,十六進(jìn)制還可以使用“\6c”的形式來表示。

3)JavaScript編碼封裝

可以直接通過eval執(zhí)行字符串八進(jìn)制和十六進(jìn)制兩種編碼方式,其中八進(jìn)制用“\56”表示,十六進(jìn)制用“\x5c”表示。

如果代碼中應(yīng)用了漢字并且需要進(jìn)行進(jìn)制編碼,那么只能進(jìn)行十六進(jìn)制Unicode編碼,其表示形式為:“\u4ee3\u7801”。

在“Web前端黑客技術(shù)揭秘”中經(jīng)封裝了兩個方法來做編碼和解碼,主要用到了下面兩個方法,具體代碼可查看此處。

核心代碼是:“str.charCodeAt(char).toString(進(jìn)制)”與“String.fromCharCode(parseInt(code,進(jìn)制))”

charCodeAt() 方法返回0到65535之間的整數(shù),表示給定索引處的UTF-16代碼單元

靜態(tài)String.fromCharCode() 方法返回使用指定的Unicode值序列創(chuàng)建的字符串。

還可以通過一個在線網(wǎng)頁進(jìn)行編碼解碼“MonyerJS”。

4)HTML自動解碼機(jī)制

例如在網(wǎng)頁中輸入16進(jìn)制的“Hello”,自動就會解碼為“hello”。

還有一些比較熟知的空格“ ”也是這種機(jī)制。

使用第三方庫iconv-lite

可以使用一些第三方庫來進(jìn)行 GBK 編碼和解碼,例如 iconv-liteiconv-lite 是一個流行的字符集轉(zhuǎn)換庫,可以在 Node.js 和瀏覽器中使用。

實現(xiàn)字符串GBK編碼

首先,我們需要將每個漢字轉(zhuǎn)成其表示的十六進(jìn)制碼,然后將十六進(jìn)制碼轉(zhuǎn)成對應(yīng)的二進(jìn)制碼,在轉(zhuǎn)換為字節(jié)碼(即2個16進(jìn)制數(shù)構(gòu)成的字節(jié))。

下面是一個完整的GBK編碼實現(xiàn)的JavaScript函數(shù),并有一個實例:

function gbkEncode(str) {
  var buf = new ArrayBuffer(str.length * 2); // ArrayBuffer是一個字節(jié)數(shù)組,字節(jié)長度為字符串長度的兩倍
  var bufView = new Uint8Array(buf); // 把字節(jié)數(shù)組轉(zhuǎn)換為整型數(shù)組

  for (var i = 0, offset = 0, len = str.length; i < len; ++i) {
    var charcode = str.charCodeAt(i);

    if (charcode <= 0x007f) {
      bufView[offset++] = charcode;
    } else {
      var gbchar = iconv.encode(str[i], "gbk"); // 使用iconv庫進(jìn)行編碼轉(zhuǎn)換
      bufView[offset++] = gbchar[0];
      bufView[offset++] = gbchar[1];
    }
  }

  return buf;
}

// 示例
gbkEncode("測試"); // ArrayBuffer(6) [196, 227, 186, 195, 192, 178]

實現(xiàn)字符串GBK解碼

和編碼的過程相反,我們首先需要將字節(jié)數(shù)組轉(zhuǎn)換成二進(jìn)制碼,再將二進(jìn)制碼轉(zhuǎn)換為十六進(jìn)制碼,最后再將十六進(jìn)制碼轉(zhuǎn)換為對應(yīng)的漢字。

下面是一個完整的GBK解碼實現(xiàn)的JavaScript函數(shù),并有一個實例:

function gbkDecode(bytes) {
  var str = "";
  var pos = 0;
  var len = bytes.length;

  while (pos < len) {
    var byte1 = bytes[pos++];

    if (byte1 < 0x80) {
      str += String.fromCharCode(byte1); // byte1小于0x80就是ASCII
    } else {
      var byte2 = bytes[pos++];

      if (byte1 >= 0xa1 && byte1 <= 0xf7 && byte2 >= 0xa1 && byte2 <= 0xfe) {
        // GBK漢字范圍
        str += iconv.decode(new Buffer([byte1, byte2]), "gbk"); // 使用iconv庫進(jìn)行解碼轉(zhuǎn)換
      } else {
        str += "?";
        pos--;
      }
    }
  }

  return str;
}

// 示例
gbkDecode(new Uint8Array([196, 227, 186, 195, 192, 178]).buffer); // 測試

使用瀏覽器原生API

在瀏覽器環(huán)境中,可以使用 TextEncoder 和 TextDecoder API 來進(jìn)行 GBK 編碼和解碼。下面是使用 TextEncoder 進(jìn)行 GBK 編碼的代碼:

const str = "知乎";
const encoder = new TextEncoder("gbk");
const buf = encoder.encode(str);
console.log(buf); // Uint8Array [ 231, 159, 165, 228, 185,142 ]

const uint8Array = new Uint8Array([231, 159, 165, 228, 185, 142]);
console.log(new TextDecoder().decode(uint8Array)); // 知乎
TextEncoder 和 TextDecoder API 不是所有瀏覽器都支持。在不支持這些 API 的瀏覽器中,可以使用第三方庫或其他方式實現(xiàn) GBK 編碼和解碼。

使用 encodeURIComponent

使用 encodeURIComponent 函數(shù)對字符串進(jìn)行編碼。encodeURIComponent 函數(shù)可以將字符串中的非 ASCII 字符編碼為 URI 可以接受的格式,其中也包括 GBK 編碼。如下:

const str = "知乎";
const encodedStr = encodeURIComponent(str);
console.log(encodedStr); // %E7%9F%A5%E4%B9%8E
encodeURIComponent 函數(shù)雖然可以對字符串進(jìn)行 GBK 編碼,但它并不是一個專門用于字符集轉(zhuǎn)換的函數(shù)。如果需要進(jìn)行復(fù)雜的字符集轉(zhuǎn)換,最好使用專門的字符集轉(zhuǎn)換庫或瀏覽器原生 API。

 總結(jié)

到此這篇關(guān)于JavaScript中字符串GBK與GB2312的編解碼示例講解的文章就介紹到這了,更多相關(guān)JavaScript中字符串GBK與GB2312的編解碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JavaScript中判斷字符串不為空的5種常見方法總結(jié)

    JavaScript中判斷字符串不為空的5種常見方法總結(jié)

    在JavaScript編程中,判斷字符串是否為空是一個常見的任務(wù),這篇文章主要介紹了JavaScript中判斷字符串不為空的5種常見方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-08-08
  • 使用js實現(xiàn)html標(biāo)簽、文本的隱藏、顯示、刪除及添加

    使用js實現(xiàn)html標(biāo)簽、文本的隱藏、顯示、刪除及添加

    在設(shè)計網(wǎng)頁時,有時需要靜態(tài)或動態(tài)地隱藏標(biāo)簽或顯示被隱藏的標(biāo)簽,那該怎么實現(xiàn)呢?這篇文章主要給大家介紹了關(guān)于使用js實現(xiàn)html標(biāo)簽、文本的隱藏、顯示、刪除及添加的相關(guān)資料,需要的朋友可以參考下
    2023-06-06
  • JS實現(xiàn)簡單省市二級聯(lián)動

    JS實現(xiàn)簡單省市二級聯(lián)動

    這篇文章主要為大家詳細(xì)介紹了JS實現(xiàn)簡單的省市二級聯(lián)動,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • H5微信公眾號授權(quán)的簡單實現(xiàn)步驟

    H5微信公眾號授權(quán)的簡單實現(xiàn)步驟

    如果用戶在微信客戶端中訪問第三方網(wǎng)頁,公眾號可以通過微信網(wǎng)頁授權(quán)機(jī)制,來獲取用戶基本信息,進(jìn)而實現(xiàn)業(yè)務(wù)邏輯,這篇文章主要給大家介紹了關(guān)于微信公眾號授權(quán)的相關(guān)資料,需要的朋友可以參考下
    2021-07-07
  • 總結(jié)一些js自定義的函數(shù)

    總結(jié)一些js自定義的函數(shù)

    總結(jié)一些js自定義的函數(shù)...
    2006-08-08
  • 詳解JavaScript實現(xiàn)繼承的五種經(jīng)典方式(附圖解)

    詳解JavaScript實現(xiàn)繼承的五種經(jīng)典方式(附圖解)

    JavaScript中的繼承是一種機(jī)制,通過它可以創(chuàng)建一個對象,該對象可以享有另一個對象的屬性和方法,本文將詳細(xì)的為大家介紹實現(xiàn)繼承的五種經(jīng)典方式,感興趣的小伙伴跟著小編一起來看看吧
    2023-08-08
  • 用js實現(xiàn)簡單的tab選項卡

    用js實現(xiàn)簡單的tab選項卡

    這篇文章主要為大家詳細(xì)介紹了用js實現(xiàn)簡單的tab選項卡,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • JS+CSS實現(xiàn)Div彈出窗口同時背景變暗的方法

    JS+CSS實現(xiàn)Div彈出窗口同時背景變暗的方法

    這篇文章主要介紹了JS+CSS實現(xiàn)Div彈出窗口同時背景變暗的方法,是一款比較典型的javascript操作彈出窗口的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • Html+CSS+JS輪播圖實現(xiàn)源碼(手動輪播,自動輪播)

    Html+CSS+JS輪播圖實現(xiàn)源碼(手動輪播,自動輪播)

    今天做網(wǎng)站的時候需要用上JS輪播圖代碼,而且還要求是原生的JS代碼,下面這篇文章主要給大家介紹了關(guān)于Html+CSS+JS輪播圖實現(xiàn)的相關(guān)資料,文中介紹的方法包括手動輪播和自動輪播,需要的朋友可以參考下
    2023-06-06
  • JS.findElementById()使用介紹

    JS.findElementById()使用介紹

    JS.findElementById()想必大家并不陌生吧,下面有個不錯的示例,感興趣的朋友可以參考下
    2013-09-09

最新評論

循化| 清苑县| 旌德县| 嘉善县| 正镶白旗| 湖口县| 阿拉善左旗| 舒兰市| 罗江县| 阳曲县| 理塘县| 盈江县| 左权县| 乐平市| 潞西市| 江孜县| 专栏| 清苑县| 德安县| 南城县| 子洲县| 彰武县| 和林格尔县| 德阳市| 宁乡县| 张家港市| 陆丰市| 包头市| 化州市| 吉隆县| 丰城市| 岱山县| 霍邱县| 大港区| 吉首市| 广平县| 拉萨市| 鄂尔多斯市| 东乡| 安溪县| 固始县|