生のバイトだけを操作したい場合は、ASCII-8BIT/BINARY としてエンコードしてみてください。
str.force_encoding("BINARY").split("n")
ただし、この場合のソース文字列は ISO-8859-1 (またはそのようなもの) であるため、これは ü を取り戻すことはありません。
"- Men\xFC -".force_encoding("ISO-8859-1").encode("UTF-8")
=> "- Menü -"
マルチバイト文字を取得したい場合は、ソース文字セットが何であるかを知る必要があります。BINARYにforce_encoding
すると、文字通り生のバイトだけが得られるため、マルチバイト文字はそれに応じて解釈されません。
データがデータベースからのものである場合は、ASCII-8BIT または BINARY エンコーディングを使用するように接続メカニズムを変更できます。その場合、 Rubyはそれに応じてフラグを立てる必要があります。または、データベース ドライバーにモンキー パッチを適用して、読み取ったすべての文字列を強制的にエンコードすることもできます。ただし、これは大きなハンマーであり、絶対に間違ったことをする可能性があります.
正しい答えは、文字列エンコーディングを修正することです。これには、データベースの修正、データベース ドライバ接続エンコーディングの修正、またはそれらの組み合わせが必要になる場合があります。すべてのバイトはまだそこにありますが、特定の文字セットを扱っている場合は、可能であれば、データがそのエンコーディングであると予想されることを Ruby に知らせる必要があります。よくある間違いは、mysql2 ドライバーを使用して、latin1 エンコーディングのデータを持つ MySQL データベースに接続するのに、接続に utf-8 文字セットを指定することです。これにより、Rails は DB から latin1 データを取得し、UTF-8 に変換できる latin1 として解釈するのではなく、utf-8 として解釈します。
文字列がどこから来ているかを詳しく説明できれば、より完全な答えが得られる可能性があります。デフォルトの文字列エンコーディングに対する可能なグローバル(-ish)Railsソリューションについては、この回答を確認することもできます。