Oooh, this is a complex question to answer! Text processing for most* special characters happens long after the XML parsing process is through; it happens right before the text is displayed or used, so that script actions in the same scene, conversation, or even the same dialogue branch can alter the values that certain special characters stand in for.
The order of special character swapping, as it now stands, is basically: (1)
-NL-, (2) values reflecting the general game state that cannot affect, but which can be used to set or check custom variables (
-SCENE-,
-DAYSPASSED-,
-AURA-, etc.), (3) number-getters (
LASTINLIST[] and
RANGE[]), (4)
ID[], (5) custom variables (
-VAL:-, then
-STR:-, then
LIST{}), (6)
PICK{}, (7)
BRANCH[], (8) all the triggering unit properties (
-ARMY-,
-Y-,
-X-,
-NAME-,
-CLASS-,
heshe/himer/hiser, etc.), (9) all the "CHAR2" secondary unit properties (for dialogue that triggers relative to a second character), and finally (10) basic character substitutions (
**,
--, and
;;).
Based on my testing, that order tends to work quite well. (Having the double-hyphen last is particularly important in order to avoid problems processing multiple special characters in a row, like
-NL--NL-.) There's no cycling at the moment; it just does a single pass-through. I have yet to encounter a situation that requires more than one pass-through to work, though I'm sure one must exist. I'll make the necessary changes if I ever run into it.
...oh, and about Unicode: getting Unicode characters to work in Unity at all is kind of a process, unfortunately, so probably not. However, your question has inspired me to add support for a couple more ASCII characters I can foresee people wanting to use, so hopefully that'll do.

* procedurally generated dialogue in the engine has its own, largely distinct set of special characters, swapped at the time the dialogue is generated. This occurs much earlier on than swapping for special characters elsewhere in the engine, as proc gen special characters refer to values internal to the character being generated rather than current game state or custom variable values. I mostly haven't discussed proc gen special characters, so if you see me talking about special characters, 99% chance is that it's the normal kind.