62

I'm trying to encode a string that's pretty complex, so that I can include it in a mailto:

Component:

<a href="mailto:test@example.com?subject='Hello'&{{body}}">

TS:

import { HttpParameterCodec } from "@angular/common/http";

let body = encodeValue('This is the example body\nIt has line breaks and bullets\n\u2022bullet one\n\u2022bullet two\n\u2022bullet three')

When I try to use encodeValue, I get "cannot find name encodeValue.

How would be best to url-encode body?

user749798
  • 5,210
  • 10
  • 51
  • 85
  • 2
    For a start, you can use JavaScript's [`encodeURI`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURI) function which should encode your text. (If you're using one of the characters - `;,/?:@&=+$#`, please use the [`encodeURIComponent`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent) function instead.) – Edric Mar 29 '19 at 15:14
  • That didn't work on bullets or line breaks though – user749798 Mar 29 '19 at 15:15
  • 2
    It's meant to be used for URIs – Edric Mar 29 '19 at 15:16

2 Answers2

73

HttpParameterCodec : is a codec for encoding and decoding parameters in URLs( Used by HttpParams).

If you need to encode Url you can use the below:

encodeURI assumes that the input is a complete URI that might have some characters which need encoding in it.

encodeURIComponent will encode everything with special meaning, so you use it for components of URIs, such as:

var textSample= "A sentence with symbols & characters that have special meaning?";
var uri = 'http://example.com/foo?hello=' + encodeURIComponent(textSample);
nircraft
  • 8,242
  • 5
  • 30
  • 46
65

Both encodeURI() and encodeURIComponent() will work, while there are some differences:

var set1 = ";,/?:@&=+$";  // Reserved Characters
var set2 = "-_.!~*'()";   // Unescaped Characters
var set3 = "#";           // Number Sign
var set4 = "ABC abc 123"; // Alphanumeric Characters + Space

console.log(encodeURI(set1)); // ;,/?:@&=+$
console.log(encodeURI(set2)); // -_.!~*'()
console.log(encodeURI(set3)); // #
console.log(encodeURI(set4)); // ABC%20abc%20123 (the space gets encoded as %20)

console.log(encodeURIComponent(set1)); // %3B%2C%2F%3F%3A%40%26%3D%2B%24
console.log(encodeURIComponent(set2)); // -_.!~*'()
console.log(encodeURIComponent(set3)); // %23
console.log(encodeURIComponent(set4)); // ABC%20abc%20123 (the space gets encoded as %20)

Reference: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent

fishstick
  • 2,144
  • 1
  • 19
  • 14