Die Nummerierung gleicher Zeichen in US-ASCII und Unicode ist identisch, ebenso jene in ISO-8859-1 und Unicode
Das dachte ich auch, bis ich bei einigen geladenen utf-8 codierten Quelltexten auf Probleme mit Umlauten stieß. Den Seitenquelltext lege ich in einem AnsiString-Objekt ab (also ISO-8859-1), trotzdem wird z.B. ä zu ä, ü zu ü, ö zu ö und ß zu ß. Woran kann das liegen?
Martin hat das schon angesprochen: Der Witz (bzw. einer von zweien) an utf-8 ist, dass nirgends in einer utf-8-kodierten Kette ein Null-Byte erscheint, wo keines hingehört. Dieses Null-Byte würde als Zeichenkettenendeanzeiger alte Programme, die utf-8 noch nicht kennen, völlig aus dem Tritt bringen. Stattdessen werden bei Zeichenwerten, die mehr als 7 Bit benötigen, die Bits auf mehrere Bytes aufgeteilt, sozusagen ein paar ins erste Körbchen, ein paar ins zweite Körbchen und wenn's noch mehr sind, legen wir noch ein paar ins dritte Körbchen. An die Körbchen wird dann noch eine große 1 gemalt (achtes Bit wird gesetzt), damit man beim Auslesen auch erkennt, dass diese Körbchen bzw. ihr Inhalt zusammengehören.
utf-8 ist also so ausgelegt, dass jedes Programm, das herkömmliche 8-bittige Zeichenketten verarbeiten kann, unfallfrei und ohne Änderungen auch mit utf-8-Ketten zurecht kommt. Es kommt wegen der Bitverteilung zwar zu Darstellungsfehlern in der Art, wie du sie oben beschrieben hast, aber es geht wenigstens nichts verloren.
Wegen dieser speziellen Kodierung kannst Du zwar die nummerischen HTML-Masken 1:1 in eine iso-8859-1-Zeichenkette übernehmen (so Wert kleiner als 256), aber nicht 1:1 in eine utf-8-Zeichenkette.
Lege sie stattdessen 1:1 in einer wchar-Kette ab, du hättest dann sozusagen Unicode roh, utf-32 (ist wchar 32 Bit breit?). Diese kannst du dann vom ganz breiten Unicode ins abgesicherte und kompaktere utf-8-Unicode konvertieren.
Es wäre ratsam, […] Unicode zu nutzen
In diese Richtung gingen meine ersten Versuche, leider fand ich 1.) keine geeigneten Klassen oder Methoden, mit C++ utf-8 codierte Dateien zu erstellen, und 2.) bietet der verwendete (und mit zunehmender Einsicht ungenügende) Borland C++ Builder 4 keine grafischen Komponenten an, die utf-8 darstellen könnten.
Die Antwort mag blöd klingen, nimms mir nicht übel, aber dann programmiere halt mal ein wenig. Besagte iconv-Bibliothek erledigt die Konvertierung wie schon geschrieben mit nur einem Funktionsaufruf und die weitere Behandlung von utf-8-Zeichenketten unterscheidet sich in fast nichts von der Behandlung herkömmlicher Zeichenketten. Dafür braucht es keine großartigen Klassen, geschweige denn Bauklötze für die IDE. Die iconv-Bibliothek läuft auch unter Windows, vermutlich ist sie sogar schon bei dir installiert. Die Dateien für Compiler und Linker müsstest du dir allerdings suchen, falls es sie nicht bei den Gnus gibt.