Mich würde nun interessieren, wieso TString.SetTextStr komplett umgeschrieben wurde und die #0 Zeichen nicht mehr behandelt. Ist das Absicht oder eine Bug?
Das ist offenbar Absicht:
https://quality.embarcadero.com/brow...#comment-94090
Insbesondere wird hier wohl das vorige Verhalten als ungewollt betrachtet. Da es nicht dokumentiert ist, kann die Implementierung auch entsprechend angepasst werden. Ich fürchte, du wirst dir deinen eigenen #0-Bereiniger davor schalten müssen. Das würde auch die bisher verborgene Intention klarer machen. Offenbar rechnen die meisten Entwickler nicht damit, dass eine TStringList #0-Zeichen ausfiltert.
Unabhängig davon kenne ich aber auch Fälle, in denen #0-Zeichen in Strings als Separatoren zu weiteren Informationen missbraucht werden, nur um eine korrekte Datenstruktur (z.B. Array, Record) zu vermeiden. Dann wird der erste Part einfach über PChar(S) ausgelesen. Bei den folgenden wird es dann halt komplexer. Sowas kommt meistens durch irgendwelche Quick'n'Dirty Erweiterungen rein und sollte schleunigst refactored werden. Konkret für deinen Fall würde ich eine Art StripZeroChars Funktion empfehlen. Dann ist das Problem ein für alle Mal gebannt.