Je vais essayer de mettre un peu d'ordre dans une discussion qui me parait pédaler dans le yogourt !
Tout d'abord, Unicode (contrairement à ce que son nom pourrait laisser penser) n'est pas un code. C'est la définition d'un jeu de caractères standards universel (Universal Character Set, UCS). UCS est défini par les normes ISO 10646 et 10646-2 comme étant un jeu de 2.147.483.648 caractères (il y a de quoi faire , y compris pour les langues actuelles, anciennes ou futures, alphabétiques, idéographiques ou hiéroglyphiques !).
La définition est organisée hiérarchiquement: 128 groupes composés chacun de 256 plans, eux-même composés de 256 rangées de 256 caractères chacune. Chaque caractère défini reçoit un numéro (allant de 0 à 2.147.483.647). Actuellement, tous les caractères possibles ne sont pas définis (de loin s'en faut ), seul le groupe 0 (65536 caractères possibles) contient des caractères, et encore, le groupe est plein de vide, malgré la présence des idéogrammes chinois et des hiéroglyphes égyptiens ! Ce groupe 0 est appelé BMP (Basic Multilingual Plan).
C'est ainsi que les caractères vietnamiens sont dans le BMP (groupe 0), plan 0, rangée 30, rangée dite "Latin Extended Additional" allant du caractère 7680 au caractère 7935. Plus spécifiquement, les caractères vietnamiens sont les caractères allant de 7840 à 7929.
Le fait de définir un jeu de caractères n'en fait pas pour autant quelque chose de directement utilisable sur un ordinateur. Il faut coder ce jeu de caractères.
Le code le plus simple est, sans aucun doute, d'utiliser directement le numéro associé au caractère pour le codage, c'est le codage UCS-4 sur 4 octets (32 bits*). Solution simple en théorie, mais, en pratique, à ma connaissance, il n'existe pas de périphérique d'entrée-sortie (clavier, écran, etc) acceptant des caractères de 32 bits, pas plus que de logiciels implémentant directement UCS-4 (encore que les librairies disponibles sous Linux permettent d'implémenter directement UCS-4 ).
Il existe une autre solution, ne coder que le BMP (puisque les seuls caractères définis actuellement sont dans le BMP) sur 2 octets (16 bits), c'est le codage UCS-2. De nouveau, à ma connaissance, pas de périphérique d'entrée-sortie, mais, quelques logiciels (surtout des logiciels libre ;D) supportent UCS-2.
Pour finir, il existe un système de codage d'UCS assez largement répandu: UTF-8. C'est un codage d'UCS sur un nombre variable (de 1 à 6) de caractères de 8 bits. Les 128 premiers caractères d'UCS sont totalement compatibles avec les caractères ASCII (ISO 646), UTF-8 va donc coder ces caractères sur un seul caractère et ainsi la compatibilité est totale avec des logiciels n'utilisant que le code ASCII. Pour les 128 caractères suivants, UTF-8 les code sur 2 caractères de 8 bits. Mais les choses sont un peu plus complexes. Les anciennes normes (actuelles pour certains retardés comme Microsoft), ISO 8859-x n'assurent pas une correspondance totalement univoque entre caractère et codage, tout dépend du -x utilisé (quel est le malade qui a imaginé un tel truc ). Et c'est là que réside tout le problème posé par les langues accentuées !
La conversion UCS <-> UTF8 est loin d'être triviale**.
Microsoft, qui n'a jamais été connu pour la qualité de sa programmation, a pondu sa version d'UTF-8 totalement délirante et qui, en plus, fonctionne de façon très imparfaite.
À l'opposé, les fonctions proposée par la FSF (Freee Software Foundation), utilisés par Linux implémentent de façon tout à fait correcte UTF-8 (je parle en connaissance de cause, j'ai travaillé dessus ).
Et, en plus du codage d'UCS, il faut disposer de représentations graphiques des caractères sur imprimantes et écrans, c'est ce que l'on appelle les polices de caractères. Là encore, Microsoft a des années de retard sur l'état de l'art.
CONCLUSION:
Utilisez des logiciels libres, je ne dis pas que vous n'aurez plus de problème, mais vous en aurez infiniment moins qu'avec des produits dont on ne sait pas trop comment ils sont fabriqués. Ou, plutôt, on le sait trop bien: à la va-vite, pour les sortir le plus rapidement possible (vite fait, mal fait) et pouvoir ainsi ouvrir en grand son tiroir-caisse.
Voilà, c'était la page du matin d'un prof qui reprend du poil de la bête.
* bit: chiffre binaire.
**pour les connaisseurs:
Il s'agit de modules séquentiels à mémoire, l'état de sortie dépend de la combinaison des entrées ET de l'état antérieur du module, ce qui pose des problèmes relativement délicats en cas de réentrance. Contrairement à une transcodification simple, purement combinatoire.