|
KOZ さま 魔界の仮面弁士 さま アドバイスありがとうございます。
>日本語 Windows だと希望の並びになると思うんですが、カルチャを変更していないですか? Windowsエクスプローラの表示順をみるとわかるのですが、カルチャを使用すると「同じ音の文字をまずまとめる」方法をとっています。 こんな感じになります。 ア あ イ い シフトJISの並びにしたい以上、もうこんなのは論外なので、ソートの判定ではstring.CompareOrdinal()を使用していました。 これだとカルチャは使用せずに純粋にコード順で判定してくれるのですが、コード順の文字並び自体がシフトJISとUTFでは 違っていたため困っております。
>a-JP カルチャでのテキスト比較や、UTF-16 でのバイナリ比較でも無く、UTF-8 出の並びだったのですね? (自分は確認していません) もしかしたらUTF8ではないのかもしれません。 が、シフトJISではないことは確実でした。 コード値でみると、 シフトJIS UTF 亜 889F U+4E9C 世 90A2 U+4E16 と若い値がシフトJISとUTFとで逆転しています。
>ListView でカスタムソートを行うには、こんな感じでできるはず。 カスタムソート自体は既に実装済みで問題なく動作しているのですが、肝心の比較結果が上記の問題で逆転してしまっており、 期待順と違ってしまっているのです。
>System.Text.Encoding.GetEncoding(932).GetBytes でテキストをバイナリ化してから サンプルコードをいろんなサイトを参考にしたのですが、肝心のバイナリ化した値を比較する方法がわかりません。 こんなコードを書いて確認してみたのですが、 System.Text.Encoding src = System.Text.Encoding.ASCII; System.Text.Encoding dest = System.Text.Encoding.GetEncoding("Shift_JIS"); string str1 = "亜"; string str2 = "世"; byte[] temp1 = src.GetBytes(str1); byte[] temp2 = src.GetBytes(str2); byte[] sjis_temp1 = System.Text.Encoding.Convert(src, dest, temp1); byte[] sjis_temp2 = System.Text.Encoding.Convert(src, dest, temp2); string sjis_str1 = dest.GetString(sjis_temp1); string sjis_str2 = dest.GetString(sjis_temp2);
Debug.WriteLine("UTF :" + string.CompareOrdinal(str1, str2)); Debug.WriteLine("SJIS:" + string.CompareOrdinal(sjis_str1, sjis_str2)); 結果は UTF :134 SJIS:0 でした。 バイナリ化したのだから文字列比較すること自体おかしい気がするのですが、バイナリでは一致不一致を返す関数しかないみたいです。 (それに並び替えにしようするのでカスタムソート関数内にこんな重そうな処理を書いちゃよくない気も致します…)
なにかよい方法をご存じないでしょうか?
|