エンコーディングを合わせる

サーバとクライアントでエンコードされた文字(XMLと考えても良い)を使って通信を行う場合、双方でエンコーディングを合わせるのだが、どのようにして合わせるのがベターなのだろう。

1. クライアントとサーバ、双方で取り決めをしておいて同じエンコーディングを使用する
2. クライアントが使用するエンコーディングをなんらかの形でサーバ側に送り、それを使う
3. URL(URI)のように互いのエンドポイントを指すシンボルにエンコーディングを持たせる(?encode=utf-8とか)

一般的なのは1.だが変化に弱いか。2.HTMLのcharsetのようなヘッダを使うか、ストリームを先読みで判定するか。HTTPなら3が使えるがREST原理に反するか。
もっと良い方法は無いかな。