The spacing is already inserted by \og and \fg, so you shouldn't type the ~. You can consider changing the definition of the Unicode character as

\DeclareUnicodeCharacter{AB}{\og\ignorespaces}
\DeclareUnicodeCharacter{BB}{\unskip\fg}


so that inputting

Ces simulations «directes» sont ainsi

Ces simulations « directes » sont ainsi


will be equivalent.



Notice that \xspace does nothing.

If you insist to type «~directes~», then the definition for the open guillemets character could be

\makeatletter
\DeclareUnicodeCharacter{AB}{%
  \og\@ifnextchar~{\@gobble}{}}
\makeatother


Say what you want, but I find this spacing awful. ;-)

Wrong spacing around guillemets
I was reading the untap step rule and got confused a bit. It says:


  502.2. Second, the active player determines which permanents he or she controls will untap. Then he or she untaps them all simultaneously.
  This turn-based action doesn't use the stack. Normally, all of a
  player's permanents untap, but effects can keep one or more of a
  player's permanents from untapping.


If "a player determines", can I determine not to untap all my permanents?
