FWIW I've have a collection of coding system settings, which is largely copy/paste from elsewhere (and thus I could not say with certainty that they are all required), but may be of interest:
(prefer-coding-system 'utf-8)
(set-default-coding-systems 'utf-8)
(set-terminal-coding-system 'utf-8) ;; also see `my-frame-config'
(set-keyboard-coding-system 'utf-8)
(set-locale-environment "en_NZ.UTF-8")
(setq-default buffer-file-coding-system 'utf-8)
(when (boundp 'default-buffer-file-coding-system) ;; obsolete since 23.2
(setq default-buffer-file-coding-system 'utf-8))
;; Treat clipboard input as UTF-8 string first; compound text next, etc.
(setq x-select-request-type '(UTF8_STRING COMPOUND_TEXT TEXT STRING))
Of particular note to this question, however, is that you set the terminal coding system on a per-terminal basis, which means you should be reacting to new frames.
(e.g. With Emacs running as a server, set the terminal coding system, then in a completely separate terminal connect to the server and inspect the terminal coding system, and you'll note that it's the default value.)
More generally, various Emacs variables are terminal-local, such that setting them in one terminal does not affect their value in other terminals. See C-hig (elisp) Multiple Terminals
RET for more details.
If you are certain that you can reliably use a particular coding system in all of your terminals, you can do something like this:
;; Per-frame/terminal configuration.
(defun my-frame-config (frame)
"Custom behaviours for new frames."
(with-selected-frame frame
;; do things
(unless window-system
;; Terminal configuration
(set-terminal-coding-system 'utf-8))
))
;; Run now, for non-daemon Emacs...
(my-frame-config (selected-frame))
;; ...and later, for new frames / emacsclient
(add-hook 'after-make-frame-functions 'my-frame-config)