Problems with javaScript special characters

2

I'm using the script below and working almost perfectly was not a though, it's a search script, when the user types "?" (query) appears in the search the following expression "% 3F" (percentage, three and F), some other characters like!, @, # also present error

How can I resolve this?

Website where I use: link

As this is a question and answer site, it would be very difficult to solve this, because if the user types a "?" would hinder the search. remembering that the page is already with charsetUTF-8 meta. Thank you.

Follow the javaScript code:

function removeAcento(text){
    text = text.toLowerCase();
    text = text.replace(new RegExp('[ÁÀÂÃ]', 'gi'), 'a');
    text = text.replace(new RegExp('[ÉÈÊ]', 'gi'), 'e');
    text = text.replace(new RegExp('[ÍÌÎ]', 'gi'), 'i');
    text = text.replace(new RegExp('[ÓÒÔÕ]', 'gi'), 'o');
    text = text.replace(new RegExp('[ÚÙÛ]', 'gi'), 'u');
    text = text.replace(new RegExp('[Ç]', 'gi'), 'c');
    return text;
}

function kw_list(){
    this.keywords = new Array();
    this.num_words = 0;
    this.query = '';
    this.original_query = '';
    this.query_length = 0;
    this.possible_points = 0;
    this.multiple = points_title + points_keywords + points_description;
    this.get_words = get_query;
    this.no_query = no_query_found;
}
function get_query(){
    this.query = top.location.search.substring(top.location.search.indexOf('=') + 1);
    while ((the_plus = this.query.indexOf('+', 0)) != -1){
        this.query_length = this.query.length;
        this.query = this.query.substring(0, the_plus) + ' ' + this.query.substring(the_plus + 1);
    }
    this.original_query = decodeURI(this.query);
    this.query = removeAcento(this.original_query);
    this.query_length = this.query.length;
    if (this.query != ''){
        var query_pointer = 0;
        var end_word = 0;
        var at_end = 0;
        while (this.num_words <= max_keywords - 1 && !at_end){
            end_word = this.query.indexOf(' ', query_pointer);
            if (end_word == query_pointer) query_pointer++;
            else {
                if (end_word >= this.query_length - 1) at_end = 1;
                if (end_word != -1){
                    this.keywords[this.num_words] = removeAcento(this.query.substring(query_pointer, end_word));
                } else {
                    this.keywords[this.num_words] = this.query.substring(query_pointer, this.query_length);
                    at_end = 1;
                }
                this.num_words++;
                if (query_pointer != -1) query_pointer = end_word + 1;
                if (query_pointer > this.query_length - 1) at_end = 1;
            }
        }
        if (this.num_words == 0) return 0;
        else {
            this.possible_points = this.multiple * this.num_words;
            return 1;
        }
    } else return 0;
}

function no_query_found(){
    document.writeln('<link rel="stylesheet" href="gp.css">');
    document.writeln('<CENTER><P>Pesquisa em branco.</P></CENTER>');
}

function entry(url, title, keywords, description){
    this.url = url;
    this.title = title;
    this.keywords = keywords;
    this.description = description;
    this.points = 0;
    this.search_entry = find_keyword;
    this.print_entry = print_result;
}

function find_keyword(the_word){
    var the_title = removeAcento(this.title);
    var the_keywords = removeAcento(this.keywords);
    var the_description = removeAcento(this.description);
    if (the_title.indexOf(the_word) != -1) this.points += points_title;
    if (the_keywords.indexOf(the_word) != -1) this.points += points_keywords;
    if (the_description.indexOf(the_word) != -1) this.points += points_description;
}

function print_result(possible_points){
    document.writeln('<CENTER><P>' + this.title + '' + this.description + '</P></CENTER>');
}

function no_entry_printed(the_query){
    document.writeln('<link rel="stylesheet" href="gp.css">');
    document.writeln('<CENTER><P> Não há ocorrências para <U><B>' + the_query + '</B></U>.</P></CENTER>');
}

function print_intro(the_query){
    document.writeln('<CENTER><P>Pesquisando por <U><B>' + the_query + '</B></U>:</P></CENTER>');
}

function begin_search(){
    var key_list = new kw_list();
    var entry_printed = 0;
    if (!key_list.get_words()) key_list.no_query();
    else {
        var counter = 0;
        var counter2 = 0;
        for (counter = 0; counter < entry_num; counter++){
            for (counter2 = 0; counter2 <= key_list.num_words - 1; counter2++){
                the_entries[counter].search_entry(key_list.keywords[counter2]);
            }
        }
        for (counter = key_list.possible_points; counter > 0; counter--){
            for (counter2 = 0; counter2 < entry_num; counter2++){
                if (counter == the_entries[counter2].points){
                    if (entry_printed != 1){
                        entry_printed = 1;
                        print_intro(key_list.original_query);
                    }
                    the_entries[counter2].print_entry(key_list.possible_points);
                }
            }
        }
        if (!entry_printed) no_entry_printed(key_list.original_query);
    }
}

the_entries = new Array();
    
asked by anonymous 22.09.2017 / 21:18

1 answer

3

DecodeURI does not decrypt characters like ; / ? : @ & = + $ , # , you must use decodeURIComponent .

console.log(
  decodeURI("%3F"), // vai dar "%3F"
  decodeURIComponent("%3F") // vai dar "?"
);
    
22.09.2017 / 21:41