1. 程式人生 > >js進行編碼,和golang解碼

js進行編碼,和golang解碼

js 字串進行編碼方法

escape是將字元的unicode編碼轉化為16進位制序列(轉義序列,轉義序列(escape sequences)),其不編碼字元有69個:*,+,-,.,/,@,_,0-9,a-z,A-Z。(不建議使用)

encodeURI是將字元的unicode編碼通過UTF-8來表示,其不編碼字元有82個:!,#,$,&,',(,),*,+,,,-,.,/,:,;,=,?,@,_,~,0-9,a-z,A-Z。

encodeURIComponent也是將字元的unicode編碼通過UTF-8來表示,其與encodeURI的唯一區別就是它們不編碼的字元有所差別,encodeURIComponent不編碼的字元有71個:!, ',(,),*,-,.,_,~,0-9,a-z,A-Z。

16進位制序列和utf-8之間的轉換

<SPAN xmlns="http://www.w3.org/1999/xhtml">// #txt---
   |  Unicode符號範圍      |  UTF-8編碼方式
 n |  (十六進位制)           | (二進位制)
---+-----------------------+------------------------------------------------------
 1 | 0000 0000 - 0000 007F |                                              0xxxxxxx
 2 | 0000 0080 - 0000 07FF |                                     110xxxxx 10xxxxxx
 3 | 0000 0800 - 0000 FFFF |                            1110xxxx 10xxxxxx 10xxxxxx
 4 | 0001 0000 - 0010 FFFF |                   11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
 5 | 0020 0000 - 03FF FFFF |          111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
 6 | 0400 0000 - 7FFF FFFF | 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
 
                    表 1. UTF-8的編碼規則
// #txt---end
</SPAN>

已知""的unicode是4E25(1001110 00100101), 根據上表, 可以發現4E25處在第三行的
範圍內(0000 0800 - 0000 FFFF), 因此""的UTF-8編碼需要三個位元組, 即格式是
"1110xxxx 10xxxxxx 10xxxxxx". 然後, 從""的最後一個二進位制位開始, 依次從後向前
填入格式中的x, 多出的位補0. 這樣就得到了, ""的UTF-8編碼是 "11100100 10111000
10100101", 轉換成十六進位制就是E4B8A5.

golang端編碼和解碼

編碼:url.QueryEscape(str)   解碼:url.QueryUnescape(str) 

QueryEscape方法和js的encodeURI編碼格式一致,都為utf-8;而url.QueryUnescape方法可以解碼escape,encodeURI和encodeURIComponent方法。

如果js端對編碼進行如下加密(使用escape)

function compileStr(code){ //對字串進行加密       
  var c=String.fromCharCode(code.charCodeAt(0)+code.length);
 for(var i=1;i<code.length;i++)
  {      
   c+=String.fromCharCode(code.charCodeAt(i)+code.charCodeAt(i-1));
 }   
 return escape(c);   }

則golang端,則可以直接迴圈解密

func uncode(s string, sign int) string {
	c := string(rune(int(s[0]) - len(s)))
	for i := 1; i < len(s); i++ {
		c += string(rune(int(s[i]) - int(c[i-1])))
	}
	return c
}

如果js端使用encodeURI(或golang端使用QueryEscape進行加密)則以上解密方式,QueryUnescape解密出則會亂碼。。

經過排查,原因是for迴圈次數和加密迴圈次數不對應。(ASCII碼值超過127的,len()長度都會大於1)

func uncompileStr(code string, sign int) (str string) {
	str = string(rune(int([]rune(code)[0]) - sign))
	for i := 1; i < len([]rune(code)); i++ {
		str += string(rune(int([]rune(code)[i] - []rune(str)[i-1])))
	}
	return str
}

相關推薦

js進行編碼golang解碼

js 字串進行編碼方法 escape是將字元的unicode編碼轉化為16進位制序列(轉義序列,轉義序列(escape sequences)),其不編碼字元有69個:*,+,-,.,/,@,_,0-9,a-z,A-Z。(不建議使用) encodeURI是將字元的uni

js前臺編碼java後臺解碼el表示式拼裝param中文引數編碼

js前臺編碼: 1.使用兩次encode function query(nameObj,brandnameObj){   var namevalue = window.encodeURI(window.encodeURI(nameObj.value));   var bra

PHP編碼gzdeflate與Golang解碼DEFLATE

gzdeflate golang deflate 解碼 編碼[email protected]/* */:“數據存到redis是gzdeflate壓縮過的數據,golang從redis取出來,解壓縮失敗”。很多從PHP轉Golang的業務經常會遇到,所以寫下這篇博文,希望可以幫助更多人。想要使用g

HttpClient 請求傳參時如何優雅的進行編碼拒絕url人工拼接

我們在利用HttpClient進行遠端呼叫時,第三方提供的介面如下: 這種介面我們用get、post請求都能呼叫,但是會有一個問題,傳參,@RequestParam 註解表示,傳參非body體,我們只能接在 /updateUserPhoto這個url後面,就是/updateUserPh

sql自動獲取有格式的編碼欄位新增值

1、根據時間和特殊的字元加自增數獲取值,每天自動更新 SELECT CONCAT('${applyType}',DATE_FORMAT(NOW(),'%Y%m%d'), LPAD(RIGHT((CASE WHEN MAX(a.apply_no) IS NULL THEN '0

用Python 的一些用法與 JS 進行類比看有什麼相似?

  Python 是一門運用很廣泛的語言,自動化指令碼、爬蟲,甚至在深度學習領域也都有 Python 的身影。作為一名前端開發者,也瞭解 ES6 中的很多特性借鑑自 Python (比如預設引數、解構賦值、Decorator等),同時本文會對 Python 的一些用法與 JS 進

對 移動端響應式框架 pageResponse.js 進行擴充套件完成自己的需求

GITHUB:https://github.com/peunzhang/pageResponse 我需要用的是他的Contain模式,然而就像他介紹的,有一個缺點:頁面水平垂直居中,左右或上下可能出現空白,頁面背景使用純色或可複製背景可解決此類問題。 他也介紹了,這個框架

如何用mysql 建資料庫並設定為utf-8編碼general_utf8_ci編碼格式

create database Herodefault character set utf8default collate utf8_general_ci;Query OK, 1 row affected (0.00 sec)utf8_general_ci;表示編碼格式,此編

CKEDITOR的內容js轉碼C#控制器解碼接收

1 <script type="text/javascript" src="<%=Url.Content("~/Resource/ckeditor/ckeditor.js") %>"&

java list按物件的某個屬性進行排序判斷相等

import java.io.Serializable; public class ContactItem implements Comparable<ContactItem>,Serializable { private String name; pr

URL引數中如果有+(加號)要對引數進行編碼後臺取到的加號才不會變為空格。

後臺對引數進行編碼的方法:URLEncoder.encode(str); 後臺取引數值時直接寫:String strFileCode = request.getParameter("filecode");即可取得編碼後的值。 附: java沒有方法對應javascript

js對base64編碼的字串進行 編碼 解碼

//1.加密解密方法使用: //1.加密 var str = '124中文內容'; var base = new Base64(); var result = base.encode(str); //document.write(result); //2.解密 var result2

a標籤跳頁傳參以及擷取URL引數 js編碼(encode)解碼(decode)的三種方法

<a href="dd.index?aa=1&&bb=2"></a> //擷取URL引數 // console.log(window.location.search); function GetQueryString(name) { var reg = new Re

詳談js對url進行編碼解碼(三種方式的區別)

今天在專案中發現一個bug,原作者本意是提取url中的某段資訊與一已知資訊進行比較,如果成立則執行相應程式碼。找來找去發現邏輯並沒有問題,但是前段樣式並沒有改變,通過控制檯列印提取出來的結果,發現是一段UTF8加密的文字,最後進行相應的解碼程式碼才生效。 J

js對url進行編碼解碼(三種方式區別)

*** 只有 0-9[a-Z] $ - _ . + ! * ' ( ) , 以及某些保留字,才能不經過編碼直接用於 URL。 ***例如:搜尋的中文關鍵字,複製網址之後再貼上就會發現該URL已經被轉碼。 1、escape 和 unescape 原理:對除ASCII字母、數字、標點符號 @  *  _  +

將圖片檔案轉化為位元組陣列字串並對其進行Base64編碼處理 對位元組陣列字串進行Base64解碼並生成圖片

public static String imageToBase64(String path) { // 將圖片檔案轉化為位元組陣列字串,並對其進行Base64編碼處理 byte[] data = null; // 讀取圖片位元組

URL傳遞中文引數亂碼----js對url進行編碼解碼

*** 只有 0-9[a-Z] $ - _ . + ! * ' ( ) , 以及某些保留字,才能不經過編碼直接用於 URL。 ***例如:搜尋的中文關鍵字,複製網址之後再貼上就會發現該URL已經被轉碼。 1、escape 和 unescape 原理:對除ASCII字母、數字、標點符號 @  *  _  +

JS對URL字符串進行編碼/解碼分析

rdquo 說明 cbe 字符值 name ide 就會 aca img 雖然escape()、encodeURI()、encodeURIComponent()三種方法都能對一些影響URL完整性的特殊 字符進行過濾。但後兩者是將字符串轉換為UTF-8的方式來傳輸,解決了頁面

python將圖片進行base64編碼 解碼

一、將圖片進行base64編碼 import base64 img_path = 'D:xxx/file/img/juwan.jpg' with open(img_path, 'rb') as f: image_data = f.read() base64_data