Als Interviewfrage wird in der Regel nur nach den technischen Details eines direkten Austauschs von 8-Bit-Elementen gefragt, um deren Reihenfolge umzukehren (unabhängig davon, für welche Zeichen diese möglicherweise tatsächlich stehen).
Gleichzeitig könnten Sie, insbesondere wenn Sie eine relativ hochrangige Person interviewen, auf einige Fragen zur Spezifikation und zur genauen Form der Eingabe hoffen. Selbst wenn Sie sie auf den einfachen Fall des Austauschs von 8-Bit-Elementen zurückführen, ist es möglicherweise wertvoll, zu wissen, ob sie allgemeiner denken oder nicht.
Wenn Sie sich mit einer Vielzahl von Eingaben befassen müssen, müssen Sie in etwa an einen "Stapel" denken, ein bisschen wie an einen Netzwerkstapel. Sie müssen Ihre Software in mehreren Ebenen erstellen, von denen jede eine Reihe von Transformationen in einer bestimmten Reihenfolge ausführt. Auf diese Weise können Sie jeden Teil der Transformation so einfach halten, dass Sie sie unter Kontrolle halten und eine vernünftige Chance haben, dass sie den Anforderungen entspricht.
Ich werde eine Möglichkeit skizzieren, die ich zumindest als etwas praktikabel empfunden habe. Ich gebe als Erster zu, dass es vielleicht andere gibt, die bessere Ideen haben. Zumindest scheint mir das ein bisschen wie Brute-Force-Engineering, mit wenig wirklicher Eleganz.
Normalerweise möchten Sie zunächst eine andere Darstellung in UCS-4 (auch bekannt als UTF-32) konvertieren. In diesem Fall ziehen Sie es im Allgemeinen vor, sich auf die Eingaben des Benutzers zu verlassen, als dies selbst herauszufinden. In einigen Fällen können Sie sicher sein, dass eine bestimmte Folge von Oktetten nicht den Regeln eines bestimmten Codierungsschemas entspricht, Sie können jedoch selten (wenn überhaupt) sicher sein, dass sie einem bestimmten Codierungsschema entspricht.
Der nächste Schritt ist optional. Sie können die Eingabe in eines der vier Unicode-Normalisierungsformulare normalisieren. In diesem Fall möchten Sie wahrscheinlich die "NFKC" -Transformation anwenden: Kompatibilitätszerlegung, gefolgt von kanonischer Komposition. Dies wird (wo möglich) die Kombination diakritischer Formen (wie das von Jon erwähnte U + 301) in einzelne Codepunkte umwandeln (z. B. ein "A" mit einem "U + 301" würde in "lateinisches Kapital A mit Akut" umgewandelt werden. , U + 00C1).
Anschließend durchlaufen Sie alle Zeichen von Anfang bis Ende und teilen die Zeichenfolge in tatsächliche Zeichen auf. Wenn diakritische Zeichen (noch) kombiniert werden, behalten Sie sie mit den Zeichen bei, die sie ändern. Das Ergebnis ist in der Regel ein Index der tatsächlichen Zeichen in der Zeichenfolge, z. B. die Position und Länge der einzelnen Zeichen.
Sie kehren die Reihenfolge dieser vollständigen Zeichen um, indem Sie in der Regel den im vorherigen Schritt erstellten Index verwenden.
Anschließend wenden Sie (optional) einen anderen Unicode-Normalisierungsprozess an, z. B. NFD (Canonical Decomposition). Dadurch wird das oben erwähnte "Latin A mit Akut" wieder in zwei Codepunkte umgewandelt - ein "Latin Capital A" und ein "Combining Acute". Wenn Sie Ihre Eingabe mit einem U + 00C1 zu beginnen, jedoch enthält passiert ist , wäre es auch konvertieren , dass auch in zwei Codepunkte.
Anschließend codieren Sie die Sequenz der UCS-4-Codepunkte in die gewünschte Codierung (UTF-8, UTF-16 usw.).
Beachten Sie, dass die Unicode-Normalisierungsschritte die Anzahl der zum Speichern der Zeichenfolge erforderlichen Codepunkte ändern können / werden. Wenn Sie diese einbeziehen, können Sie die Ergebniszeichenfolge nicht mehr in den ursprünglichen Speicher einplanen. Offensichtlich entsprechen die resultierenden Codepunkte möglicherweise auch nicht direkt den Eingabecodepunkten.