简体   繁体   English

在Javascript中使用单引号和双引号转义和转义字符串

[英]Escaping and unescaping a string with single and double quotes in Javascript

I have a search box that a user can search for any string including single AND double quotes, once they have searched, the backend is passing the keyword back to me so I can put it back in the box. 我有一个搜索框,用户可以搜索任何字符串,包括单引号和双引号,一旦搜索到,后端将关键字传回给我,所以我可以把它放回到框中。 I don't know what the string is so I can't escape quotes myself, below is an example: 我不知道字符串是什么,所以我自己无法逃避引用,下面是一个例子:

var keyword = "hello";
$("#selectionkeywords").val();

The issue I am having is that if the user enters "hello" the keyword becomes ""hello"" and I get this error: 我遇到的问题是,如果用户输入“hello”,关键字变为“”hello“”,我收到此错误:

missing ) after argument list
[Break On This Error]   
jQuery("#selectionkeywords").val(""hello"");

The user could also enter single quotes so that rules it out as well. 用户也可以输入单引号,以便将其排除在外。 I tried using escape unescape but I still have the same issue eg escape(""hello"") I could get the value in an unescaped format eg "hello" but I don't know what to do with it, escape doesn't work on it I end up with this %26%23034%3Bhello%26%23034%3B 我尝试使用escape unescape但我仍然有同样的问题,例如escape(“”hello“”)我可以获得非转义格式的值,例如“你好”但我不知道该怎么做,逃避不我最终得到了这个%26%23034%3Bhello%26%23034%3B

So I'm pretty much stuck at the moment as I can't do anything to the string, any ideas? 所以我现在几乎陷入困境,因为我无法对字符串,任何想法做任何事情?

You have to escape the string server side, so javascript receives it already escaped, in the case of PHP you could do: 你必须逃避字符串服务器端,所以javascript接收它已经被转义,在PHP的情况下,你可以做:

$var = str_replace('"', '\"', $var);

and then in javascript make sure you read it between double quotes, as you escaped for that: 然后在javascript中确保你在双引号之间读取它,因为你为此进行了转义:

//use double quotes, as you escaped for them
jQuery("#selectionkeywords").val("<?php echo $var ?>"); 

When you exchange data from server to client and viceversa, you want to use base64 encoding and decoding, in order to avoid this and other kinds of problems. 当您从服务器向客户端交换数据时,您希望使用base64编码和解码,以避免此类和其他类型的问题。

Java side: Java方面:

import javax.xml.bind.DatatypeConverter;

/* ... */

/* Decode input from client */
String input = DatatypeConverter.printBase64Binary(inputFromClient);

/* Encode output for client */
String output = DatatypeConverter.printBase64Binary(encodedOutput);

Javascript side: Javascript方面:

// Encode data for the server
var dataForServer = Base64.encode(data);

// Decode data coming from the server
var data = Base64.decode(dataFromServer);

using this class 使用这个课程

var Base64 = {

    // private property
    _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",

    // public method for encoding
    encode : function (input) {
        var output = "";
        var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
        var i = 0;

        input = Base64._utf8_encode(input);

        while (i < input.length) {

            chr1 = input.charCodeAt(i++);
            chr2 = input.charCodeAt(i++);
            chr3 = input.charCodeAt(i++);

            enc1 = chr1 >> 2;
            enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
            enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
            enc4 = chr3 & 63;

            if (isNaN(chr2)) {
                enc3 = enc4 = 64;
            } else if (isNaN(chr3)) {
                enc4 = 64;
            }

            output = output +
            this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
            this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);

        }

        return output;
    },

    // public method for decoding
    decode : function (input) {
        var output = "";
        var chr1, chr2, chr3;
        var enc1, enc2, enc3, enc4;
        var i = 0;

        input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");

        while (i < input.length) {

            enc1 = this._keyStr.indexOf(input.charAt(i++));
            enc2 = this._keyStr.indexOf(input.charAt(i++));
            enc3 = this._keyStr.indexOf(input.charAt(i++));
            enc4 = this._keyStr.indexOf(input.charAt(i++));

            chr1 = (enc1 << 2) | (enc2 >> 4);
            chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
            chr3 = ((enc3 & 3) << 6) | enc4;

            output = output + String.fromCharCode(chr1);

            if (enc3 != 64) {
                output = output + String.fromCharCode(chr2);
            }
            if (enc4 != 64) {
                output = output + String.fromCharCode(chr3);
            }

        }

        output = Base64._utf8_decode(output);

        return output;

    },

    // private method for UTF-8 encoding
    _utf8_encode : function (string) {
        string = string.replace(/\r\n/g,"\n");
        var utftext = "";

        for (var n = 0; n < string.length; n++) {

            var c = string.charCodeAt(n);

            if (c < 128) {
                utftext += String.fromCharCode(c);
            }
            else if((c > 127) && (c < 2048)) {
                utftext += String.fromCharCode((c >> 6) | 192);
                utftext += String.fromCharCode((c & 63) | 128);
            }
            else {
                utftext += String.fromCharCode((c >> 12) | 224);
                utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                utftext += String.fromCharCode((c & 63) | 128);
            }

        }

        return utftext;
    },

    // private method for UTF-8 decoding
    _utf8_decode : function (utftext) {
        var string = "";
        var i = 0;
        var c = c1 = c2 = 0;

        while ( i < utftext.length ) {

            c = utftext.charCodeAt(i);

            if (c < 128) {
                string += String.fromCharCode(c);
                i++;
            }
            else if((c > 191) && (c < 224)) {
                c2 = utftext.charCodeAt(i+1);
                string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
                i += 2;
            }
            else {
                c2 = utftext.charCodeAt(i+1);
                c3 = utftext.charCodeAt(i+2);
                string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
                i += 3;
            }

        }

        return string;
    }

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM