ajax, setRequestHeader(), Content-Type, application/x-www-form-urlencoded and charset

61,528

The application/x-www-form-urlencoded mime type does not support parameters (such as charset). If you look at this section of the HTML5 spec, you will see how charset is determined (it's complicated). In particular, there is a note at the bottom of the section mentioning how charset cannot be specified as a parameter to the mime type.

Share:
61,528
Fernando Basso
Author by

Fernando Basso

Updated on August 16, 2022

Comments

  • Fernando Basso
    Fernando Basso over 1 year

    I am having trouble understanding how to set the charset when the content type is not text/html, text/plain, or text/xml, but is application/x-www-form-urlencoded content type instead.

    Given this (simplified) javascript code:

    var xhr = new XMLHttpRequest();
    

    If I do not explicitly set the encoding,

    xhr.open('POST', 'serv.php', true);
    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    

    firebug tells me that the content type is "application/x-www-form-urlencoded; charset=UTF-8."

    If I set the charset to ISO-8859-1 for instance,

    xhr.open('POST', 'serv.php', true);
    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=ISO-8859-1');
    

    firebug still tells me "application/x-www-form-urlencoded; charset=UTF-8."

    If I try something like

    xhr.setRequestHeader('Content-Type', 'text/plain; charset=ISO-8859-1');
    

    then it respects the charset.

    In all the cases the send() method goes like this:

    xhr.send('id=9&name=Yoda');
    

    Why doesn't it honor the charset I specify if the Content-Type is x-www-form-urlencoded?

    NOTE: I am using ISO-8859-1 just as an example. My goal is to understand what is going on.

  • oldboy
    oldboy over 5 years
    interesting, so how do we ensure a particular collation is used/enforce a particular collation?! do we have to use a form to do this?