I just started using zsh, and love it. However, I've stumbled upon an annoyance when it comes to international characters:

➜  ~  touch åäö.txt               
➜  ~  ls                          
Desktop       Dropbox       Music         Sites
Documents     Library       Pictures      a??a??o??.txt
Downloads     Movies        Public
➜  ~  rm -v a<030a>a<0308>o<0308>.txt
➜  ~  

With bash it looks like this (the filename in rm -v is auto completed by pressing TAB in both cases).

johan@retina ~ $ touch åäö.txt
johan@retina ~ $ ls
Desktop       Dropbox       Music         Sites
Documents     Library       Pictures      åäö.txt
Downloads     Movies        Public
johan@retina ~ $ rm -v åäö.txt 
johan@retina ~ $ 

How can I fix this with zsh?


Setting export LANG=en_US:UTF-8 fixes the output of e.g. ls and also shows it properly on the line below current input when there are multiple matches on TAB-completion. However, selecting the file from TAB-completion it shows the wrong way on the input line, the same goes for when there is only one match.

The above example now looks like this with zsh:

➜  ~  touch åäö.txt               
➜  ~  ls                          
➜  ~  rm -v a<030a>a<0308>o<0308>.txt
➜  ~  

If I have two files matching on TAB-completion it looks like this:

➜  ~  touch åäö.txt               
➜  ~  touch öäå.txt                          
➜  ~  rm 
öäå.txt    åäö.txt

Selecting one of the above by pressing TAB again and using arrow keys, or pressing either a or o to only make one match before completion generates this:

➜  ~  rm o<0308>a<0308>a<030a>.txt
➜  ~  rm a<030a>a<0308>o<0308>.txt

Any suggestions on what's wrong?

  • 2
    What's the output of echo $LANG in bash resp. zsh? – mpy Apr 15 '13 at 14:08
  • It's blank for both. I'm on OS X 10.8.3 by the way. – Morgan Apr 15 '13 at 14:30
  • Ok, then I'm out (OS X), sorry. But try nevertheless e.g. LANG=en_US.UTF-8. zsh should offer you all possibilities with LANG=<TAB>, but en_US.UTF-8 works perfect with german umlauts. – mpy Apr 15 '13 at 14:36
  • export LANG=en_US.UTF-8 fixed the ls output, however, the auto completion still shows a<030a>a<0308>o<0308>.txt – Morgan Apr 15 '13 at 14:47
  • Just another idea: Did you compile zsh yourself? If not, grab latest source (zsh.sourceforge.net/Arc/source.html) and be sure to use ./configure --enable-multibyte. After make just try by starting ./Src/zsh prior installing that version. – mpy Apr 15 '13 at 14:56

Thanks @mpy for solving the LANG problem. The answer is to use:

export LANG=en_US.UTF-8

in your .zshrc.

The remaining problem is caused by the completion system. Unfortunately completion is a monster feature. It involves shell functions or perhaps even scripts being called and somewhere in that process possibly LANG is again set to a wrong value. If you have root privileges you can debug this shell script code). Good luck with the completion guide.

| improve this answer | |


  1. Having a Powerline compatible font installed https://github.com/powerline/fonts
  2. Setting these ENV vars in .zshrc:
| improve this answer | |
  • This fixed my locale issue both on Debian 10 and macOS Mojave. I didn't install any powerline fonts though. zsh were installed with apt and brew accordingly. – Arda Aug 19 '19 at 13:23

The problem is still the same on the last versions of zsh which come with Mac OS X 10.8 (aka Mountain Lion), 10.9 (aka Mavericks) & 10.10 (aka Yosemite) (I am still beta testing 10.11 and can't disclose information about it). The completion of zsh is failing.

The port version is working correctly at least with version 5.1.1:

/usr/bin/sudo port install zsh



% touch hølé
% ls -l htab
→ ls -l hølé
% -rw-r--r-- 1 bob wheel 0 Apr 2 18:49 hølé

| improve this answer | |

I had the same problem in Arch Linux using zsh.

Using bash everything works just fine, but when I switch to zsh some characters were displayed wrong (e.g. ñ,°).

I've added export LANG="en_US.UTF-8" to my .zshrc and nothing happened.

I did everything to set LANG inside zsh and nothing fixes.

Then I changed my shell back to bash with chsh -s /bin/bash and I noticed my env var LANG was wrong with printenv LANG it showed me LANG=C.

This is a new installation so I forget to create /etc/locale.conf file and set my LANG="en_US.UTF-8" and after restarting everything work perfect.

Hope this helps.

| improve this answer | |

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.