元のコード:
//テキストを 16 進数に変換します
function textToSix(str) {
returnscape(str).replace(/%/g, function () {
return "\";
}).toLowerCase(); }
改善:
//テキストを 16 進数に変換します
function textToHex(str) {
//0 ~ 255 以外の Unicode 値をエンコードする場合、エスケープは %u**** 形式を出力します。例: % u6267% u624b%u6cea%u773c
//% を 16 進数に置き換えます
if (typeof str == "string") {
returnscape(str).replace(/ %/g, function () {
return "\";
}).toLowerCase();
} else {
return
}
}
主に検証を追加します文字列かどうかを確認します。
このメソッドを完成させた後、次のメソッドを改善する必要があると考えました:
//16 進数をテキストとして表現します。
function sixToText(str) {
return unescape(str);
元の目的は、「unnn」などの文字をテキストに変換することです。実際、unescape メソッドの原理を見てください (動作原理: %xx および %uxxxx (x は 16 進数を表します) の形式の文字シーケンスを検索し、そのような文字シーケンスを Unicode 文字 u00xx および uxxxx デコードに置き換えます。百度百科事典より)。私がまったく不要であることがわかるでしょう。ブラウザは 16 進文字を解析できるためです。例:
IE9 の場合:
Chrome の場合:
さらに少しゲインを加えてみましょう。実際、置換した文字を解析するときの最初のアイデアは、「」文字を「%」に置き換えてから、エスケープ デコード関数を使用して文字を解析することでした。ところが、"" を "%" に置き換えたいと思ったとき、次のような興味深い現象を発見しました。文字 "" の後に "t" が続かない場合、エスケープを形成するために "n" を t と組み合わせることができます。文字を含む場合、ブラウザでは無視されます。私の結論を実験で検証してみましょう:
IE9 でのデバッグ:
Chrome でのデバッグ:
ここでは変数が定義されています。変数には、通常ではまれに表示される文字「」が含まれています。ブラウザは、特別な位置にある文字をインテリジェントに無視します。そのため、一見普通に見える文字(ファイルパスなど)をjs変数に入れると、期待通りの出力結果が得られない場合があります。