[erlang-questions] io module encoding

Camille Troillard <>
Thu Jun 26 12:29:31 CEST 2014


Fantastic, thank you José!


On 26 Jun 2014, at 11:51, José Valim <> wrote:

> Camille,
> 
> I have reported two bugs related to this area as I was expecting this behaviour to change on 17.0:
> 
> http://erlang.org/pipermail/erlang-bugs/2014-April/004309.html
> http://erlang.org/pipermail/erlang-bugs/2014-April/004310.html
> 
> Only the erlang shell, the one started via the erl command, respects LC_CTYPE and the +fnu flags. If you pass -noshell, use the "dumb terminal" (triggered when you set TERM to something else), use stderr, or an escript, the encoding will remain as latin1.
> 
> You can change the encoding in those situations by calling:
> 
> io:setopts(standard_io, [{encoding,utf8}]);
> 
> I hope this helps,
> 
> PS: In case you want to call the line above in your application callback, you may notice a slow down when starting the application along side the shell with something like: erl -s my_app start. That's because the group_leader sends a message to the shell to change the encoding but the shell is not yet ready. I was able to work around this particular scenario by using:
> 
> case init:get_argument(noshell) of
>   {ok, _} -> io:setopts(standard_io, [{encoding,utf8}]);
>   error   -> ok
> end
> 
> A patch was sent to OTP to fix this particular issue: https://github.com/erlang/otp/pull/351
> 
> 
> 
> 
> José Valim
> www.plataformatec.com.br
> Skype: jv.ptec
> Founder and Lead Developer
> 
> 
> On Thu, Jun 26, 2014 at 11:28 AM, Camille Troillard <> wrote:
> Hello,
> 
> 
> On Mac OS X, when I start an Erlang shell from the command-line the io module encoding is set to unicode:
> 
> 
> > Erlang R16B03-1 (erts-5.10.4) [source] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false]
> >
> > Eshell V5.10.4  (abort with ^G)
> > 1> os:getenv("LC_CTYPE").
> > "UTF-8"
> > 2> lists:keyfind(encoding, 1, io:getopts()).
> > {encoding,unicode}
> 
> 
> 
> So that’s great.
> 
> Now, I have a GUI application that launches the Erlang shell. At first I thought the LC_CTYPE environment variable was not set (which was the case), but even when set to UTF-8, this does not work as expected:
> 
> Here's the output of the shell launched by the GUI application:
> 
> > 1> os:getenv("LC_CTYPE").
> > "UTF-8"
> > 2> lists:keyfind(encoding, 1, io:getopts()).
> > {encoding,latin1}
> 
> 
> I want {encoding, unicode}, and don’t understand why it defaults to latin1.
> How can it be?
> 
> 
> The documentation of io says:
> 
> (http://erlang.org/doc/man/io.html)
> > The standard shell will be set for either Unicode or latin1 encoding when the system is started. The actual encoding is set with the help of the LANG or LC_CTYPE environment variables on Unix-like system or by other means on other systems.
> 
> Does Mac OS X applies to “other systems”? If so, what are the “other means”?
> 
> Thanks!
> 
> 
> Best,
> Cam
> 
> _______________________________________________
> erlang-questions mailing list
> 
> http://erlang.org/mailman/listinfo/erlang-questions
> 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20140626/1126fe39/attachment.html>


More information about the erlang-questions mailing list