Original code:
//Convert text to hexadecimal
function textToSix(str) {
return escape(str).replace(/%/g, function () {
return "\";
}).toLowerCase();
}
Improved:
//Convert text to hexadecimal
function textToHex(str) {
//Escape outputs %u**** format when encoding unicode values other than 0-255, for example: % u6267%u624b%u6cea%u773c
//Replace the % with hexadecimal
if (typeof str == "string") {
return escape(str).replace(/ %/g, function () {
return "\";
}).toLowerCase();
} else {
return null;
}
}
Mainly adds a verification to verify whether it is a string.
After perfecting this method, I thought I should improve the following method:
//Represent hexadecimal as text
function sixToText(str) {
return unescape(str);
}
The original intention is to convert characters such as "unnn" back to text. In fact, just look at the principle of the unescape method (working principle: by finding character sequences in the form %xx and %uxxxx (x represents a hexadecimal number), and replacing such character sequences with Unicode characters u00xx and uxxxx Decoding. Explanation from Baidu Encyclopedia). You will know that I am completely unnecessary. Because the browser can parse hexadecimal characters. For example:
In IE9:
In Chrome:
Let’s add another little gain. In fact, when parsing the characters I replaced, my initial idea was to replace the "" character back with "%", and then use the unescape decoding function to parse the characters. However, when I wanted to replace "" with "%", I discovered the following interesting phenomenon: if the character "" is not followed by "t", "n" can be combined with t. If they are combined to form escape characters, they will be ignored by the browser. Let’s verify my conclusion with experiments:
Debugging in IE9:
Debug under Chrome:
A variable is defined here. The variable contains some characters "" that may rarely appear in normal times. When debugging, did you check the above prompt? The browser intelligently ignores characters in special positions. Therefore, when you put some seemingly ordinary characters (such as file paths, etc.) in js variables, the output results may not be expected.