What you are seeing are ansi escape sequences. Most terminal emulators will interpret these as different text properties, such as bold, various colours etc.
Emacs is usually pretty good at handling this and by default, there should be an output filter which is able to handle these control codes. Either your running an old version of emacs or for some reason, the output filters in eshell have been changed.
Try running emacs with the -q switch and open eshell and run your compilation. If you still see the control characters, then you need to try setting the eshell output filter functions to add ansi-colour support. If you don't see the control codes, then something in your init file is either removing or breaking the output filters.
This is vary unlikely to be related to zsh. In fact, you will probably find that emacs is using sh or bash 'under the ood' anyway. Note also that emacs has more sophisticated support for building programs. Have a look at Compiling and Testing Programs in the Emacs info manual. Depending on your language, you can streamline your compilation process to make compiling programs more interactive with easy ways to trigger re-compile and jump between compiler errors and your code etc. It can take a little bit of work initially, especially if your compiler or language is soemthing emacs does not understand 'out of the box', but it is well worth it. You can even do some really funky things like edit code locally and compile the changes on remote servers etc.
Finally, if you just want to get going and not spend more time tweaking emacs right now, you can look at the compiler options. Most compilers will have a way to disable the control codes. Look for things like 'turn off colours' or error message formatting etc.