最近、誰かがC で文字列を逆にするアルゴリズムについて尋ねました。提案されたソリューションのほとんどは、非シングルバイト文字列を扱うときに問題がありました。そこで、特に utf-8 文字列を処理するための優れたアルゴリズムは何かと考えていました。
私は答えとして投稿しているコードを思いつきましたが、他の人のアイデアや提案を見てうれしいです. 私は実際のコードを使用することを好んだので、このサイトで最も人気のある言語の 1 つと思われる C# を選択しましたが、コードが別の言語であっても、合理的である限り気にしません。命令型言語に精通している人なら誰でも理解できます。そして、これはそのようなアルゴリズムを低レベルで実装する方法を確認することを目的としているため (低レベルとは単にバイトを処理することを意味します)、コア コードにライブラリを使用しないようにするという考えです。
ノート:
私はアルゴリズム自体、そのパフォーマンス、および最適化方法に興味があります (i++ を ++i などに置き換えるのではなく、アルゴリズムレベルの最適化を意味します。実際のベンチマークにもあまり興味がありません)。
実際に製品コードや「車輪の再発明」で使用するつもりはありません。これは単なる好奇心と練習用です。
私は C# バイト配列を使用しているので、NUL が見つかるまで文字列を実行せずに文字列の長さを取得できると想定しています。つまり、文字列の長さを見つける複雑さを説明していません。ただし、たとえば C を使用している場合は、コア コードを呼び出す前に strlen() を使用することで、それを除外できます。
編集:
Mike F が指摘しているように、私のコード (およびここに投稿された他の人のコード) は合成文字を扱っていません。ここにあるものについての情報。私はその概念に精通していませんが、それが「組み合わせ文字」、つまり他の「ベース」文字/コードポイントとの組み合わせでのみ有効な文字/コードポイントがあることを意味する場合、そのようなルックアップテーブル文字を使用して、反転時に「グローバル」文字 (「ベース」+「結合」文字) の順序を維持できます。