- ベストアンサー
漢字のソートについて
住所録ソフトを作っています。 名字を漢字のままあいうえお順にソートしたいのですが、 常套手段があるのでしょうか?
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
> strcmpだとどうしてまったく並び変わらないのでしょう? strcmp の場合でも,まったく並び変わらないということはないと思うのですが。 状況がよく分からないのでとりあえず, 実験用に作ったコードと実行結果を載せときます。 試してみてください。 #include <stdio.h> #include <stdlib.h> #include <mbstring.h> #include <string.h> int comp(const void *x, const void *y) { // return _mbscmp(*(unsigned char**)x, *(unsigned char**)y); return strcmp(*(char**)x, *(char**)y); } int main(int argc, char* argv[]) { char *list[] = { "東京", "大阪", "神奈川", "愛知", "埼玉", }; const int n = sizeof(list) / sizeof(list[0]); /* ソート */ qsort(list, n, sizeof(list[0]), comp); /* 表示 */ for (int i=0 ; i<n ; i++) { puts(list[i]); } return 0; } /* 実行結果 */ 愛知 埼玉 神奈川 大阪 東京 /* 環境 */ Windows 2000 SP4, VC++ 6.0 SP5 > IMEの入力時に読みを取ることをVC++で実現するにはどうすれば良いのでしょうね? や,だから #6 で示した URL に, http://www.geocities.co.jp/SiliconValley-Oakland/1865/visualc/NoryImm.html すぐに動かせるサンプルがあるのにぃ。
その他の回答 (7)
Excel(2000以降) のふりがな機能も IME での入力時に読みをとってきてるみたいですね。 へぇ~。 http://www.okweb.ne.jp/kotaeru.php3?q=710444 の #5
お礼
IMEの入力時に読みを取ることをVC++で実現するにはどうすれば良いのでしょうね?
以前の投稿から,Windows + VC++ での話として書きます。 マルチバイト文字列対応を謳った文字列比較関数として _mbscmp というのがあります。 試しに _mbscmp を使って, "東京", "大阪", "神奈川", "愛知" ,"埼玉" をシフトJISコードで昇順にソートしてみると, "愛知", "埼玉", "神奈川", "大阪", "東京" となります。 一見ソートされていないように見えますが,一文字目の読みが, "アイ","サイ","シン","ダイ","トウ" と考えれば妥当でしょう。 上記のようになるのは, JIS 第一水準漢字に限っていえば読みの順にコードが振ってあるからです。 # 複数ある読みの中からどういう基準でその読みを選んだかは知りません。 # また,第二水準になると読みの順には並んでません。 これで使い物になるかどうかは mk1234 さん次第です。 やはり私も「住所録なら,ユーザに「読み」を入力させたらいいと思います」が。 #4 で少し書いたのですが, ユーザーが「鈴木」という姓を入力する際に, すずき[変換] と入力したとします。 このとき,「すずき」という読みを取得することは可能です。 Outlook Express 6 のアドレス帳の「姓」「名」を入力する欄がこの方式です。 IME 関連の API を使います。 http://www.geocities.co.jp/SiliconValley-Oakland/1865/visualc/NoryImm.html ただ,読みの難しい漢字を別の読みで入力する可能性もあるので, 読みだけを編集できるようにしておく必要があるでしょう。
お礼
回答ありがとうございます。 strcmpだとどうしてまったく並び変わらないのでしょう?
- hazenoki
- ベストアンサー率33% (21/62)
どのC言語を使用しているかによって、 strcmp の日本語(正確には2バイト文字)の 処理は変わるので、お使いのコンパイラの マニュアルなどで確認する必要があります。 日本語用に別の関数を用意されているのが 普通だと思います。 文字コードは、WindowsだとSJISという 漢字コードを使用しています。 (OSによって変わります。) 「漢字コード」なんかで検索すると順序などは わかると思います。 ただ、文字コードでのソートはやはり使えないと 思います。どういう用途で使用するか分かりませんが、 カナを別途持つのが、常套手段だと思います。 (というか住所録ソフトには必須だと思いますが。。。) ちなみに、エクセルでも、裏でカナを持っています。 「書式」→「ふりがな」で表示できます。
お礼
回答ありがとうございます。 環境はWIN98 VC++6.0 MFCです。 自分用のソフトなので漢字でソートしてある程度バラバラでも構わないのですが、一応ふりがなでソートすることにしました。 只、振り仮名だとちゃんとソートできているのに、漢字だとまったくソートされません。 疑問1.こんなことがあるのでしょうか? >ちなみに、エクセルでも、裏でカナを持っています。 >「書式」→「ふりがな」で表示できます。 疑問2.これをC言語で実現したいのですが、どうすれば良いのでしょうか?
「それなり」でよければ,文字コードでソートしておけば十分でしょう。 エクセルもたぶんそうしてます。 しかし住所録なら, ユーザに「読み」を入力させたらいいと思いますよ。 # Windows ならユーザが漢字の氏名を入力するときに, # ユーザーが入力した読みを取得することも可能ではありますが。 # これとて完璧ではないです。
お礼
回答ありがとうございます。 文字コードでのソートはどうするのでしょう? 今はstrcmp(aaa, bbb)>0でソートしていますが、このことでしょうか? ひらがなはソートできますが、漢字はまったくソートされませんがどうしてなのでしょう?
- ChM
- ベストアンサー率56% (875/1559)
#2です。WORDはよく使いますが、EXCELはほとんど使った経験がありませんので、その要領のいい使い方についての自信はありませんが、次のようにできるのではないでしょうか。なお例示では、#721671の回答に私が例示した片仮名を人名とみなし、4人の女性名をこれに追加しました。 1)列Aに、上から、キャサ、キャン、キヤモ、ギア、章子、章子、英子、英子 と入力。 2)列Bに(出身地を想定)上から、アメリカ、イギリス、ロシア、中国、東京、鹿児島、宮城、鳥取 と入力。 3)列Cに、上から、きやさ、きやん、きやも、きあ、しようこ、あきこ、ひてこ、えいこ と入力。 4)列ABCを上から8行(セルの個数で24)選択して、データ→並べ替え で、「最優先されるキー」を「列C」として、OK。 5)これで、上記8人が上から五十音順にならびます。 6)列Cのみ8行を選択して、編集→削除 する。ただし、今後も「花子」などの新たな人名を追加する可能性があったら、削除でなく、この8行を「フォントの色(白)」としたほうがいいでしょう。 これでご希望は達せられませんでしょうか?
お礼
回答ありがとうございます。 私の勘違いでしたら申し訳ありませんが、 C/c++のカテゴリーということが分かって回答されていますでしょうか? 質問の意図と回答が合っていないと思うのですが。
- ChM
- ベストアンサー率56% (875/1559)
↓の私の回答(WORDにおけるソートを前提とした回答ですが)を参考にしてください。
お礼
エクセルのようにセルには漢字しか入っていないのに、プログラム上は背後でふりがなデータを持っていて?ソート出来るようにするにはどうすれば良いのでしょうか?
- love3factory
- ベストアンサー率31% (24/76)
漢字のままだと、同じ字で読み方がちがうものもあり、 それをプログラムで実現するのはほぼ無理でしょう。 やはり、漢字氏名とはべつにカナ氏名も入力させて ソートにはそちらを使うのが常套手段でしょう。
お礼
回答ありがとうございます。 完璧でなくてもそれなりに並んでくれれば良いのですが、エクセルなんかは漢字のみでも並べ替えてくれますよね。 それを実現するにはどうすれば良いのでしょうか? 環境 WIN98 VC++6.0 MFC にて
お礼
回答ありがとうございます。 自作プログラムでも"東京", "大阪", "神奈川", "愛知", "埼玉", はちゃんと並び変わりました。 しかし、南、南、角、南、南だとまったく並び変わりません。 yoppiiさんのコードだと当然並び変わります。 当然のことながらcmpstrでも並び変わることが分かったので、コードのどこかがおかしいか調べてみます。 >すぐに動かせるサンプルがあるのにぃ。 すみません。ごめんなさい。あやまります。 完全に見落としていました。
補足
解決しました。 同じ文字の場合の並べ替えがうまくいっていませんでした。 >0を>=0に変更して解決しました。