Confusing encoding variation in binary characters \f and 0x0c are the same?

I’m performing an :erlang.binary_to_term encoding (the term is {:entitlements, 1396429}). As a result, this comes out to be <<131, 104, 2, 100, 0, 12, 101, 110, 116, 105, 116, 108, 101, 109, 101, 110, 116, 115, 98, 0, 21, 78, 205>>.

If I put this into something like redis, it is encoded to look like (what I think is) an ASCII string: "\x83h\x02d\x00\x0centitlementsb\x00\x15N\xcd". I can get something similar by using IO.inspect(binaries: :as_strings). But it’s not exactly the same as what redis has. IO inspect returns: "\x83h\x02d\0\fentitlementsb\0\x15N\xCD".

One difference, is the \f vs redis having \x0c. These are both <<12>>. If you start iex and put in <<12>> it returns \f. And ?\f is 12, and 0x0c is also 12.

So, I guess my questions:

  1. How does elixir pick which format \f vs \x0c to print out?
  2. How can I pick which format to use, if at all?
  3. For bonus points: How do I get the value that IO.inspect prints without sending it to stdio?

Any information is help, thank you!

  1. It picks shorter format.
  2. AFAIK you cannot.
  3. inspect/1