- 締切済み
文字の並び替え
今、全角文字と半角文字が混在した文字列の並び替えをしています。 また、皆様のお力をおかしください。 例:CBABD → ABBCD 色々調べて以下の関数を使うことはわかったのですが、これをどう使えば、並び替えることが出来るのかがわかりません。教えてください。 例があれば、とてもうれしいのですが・・・ int ZenkakuHantei(unsigned char c) { return (((c >= 0x81) && (c <= 0x9f)) || ((c >= 0xe0) && (c <= 0xfc))); }
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- noocyte
- ベストアンサー率58% (171/291)
えーと,まず問題が不明確です. > 今、全角文字と半角文字が混在した文字列の並び替えをしています。 > 例:CBABD → ABBCD (1) 文字コードは何ですか? シフトJIS? EUC-JP? ISO2022-JP? UTF-8/16/32? … まあ,ZenkakuHantei() の中身から判断すると シフトJISのはずですが,その点は合ってますか? (もしシフトJISじゃなかったら,ZenkakuHantei() を持ってきたことは大ハズレですよ.) (2) 例には全半角の英大文字しか書かれていませんが, それ以外の文字はどういう順番に並べますか? 文字コードの昇順? また,半角は全角より先に並べるということでいいですか? > 色々調べて以下の関数を使うことはわかったのですが、 > これをどう使えば、並び替えることが出来るのかがわかりません。 > 教えてください。 うーん,ハードルがいくつもありますねぇ…. 一応,シフトJISを前提とします.シフトJISの文字は1~2バイトの 可変長なので,これをそのまま並べ替えるのは結構面倒です. 一つの方法は,各文字を同じ長さ (2バイト(以上)) の整数値に変換し, その配列をソートすることです. (1) シフトJIS文字列から1文字 (1~2バイト可変長) ずつ取り出す. (2) 各文字を固定長整数に変換し,配列に格納する. ただしこの変換は,整数値の大小が文字のソート順に一致するよう に考える必要がある. (3) その配列をソートする. (4) 各整数値を文字に戻す.((2) の逆変換) 今の hatenan114 さんには (1)~(4) のそれぞれが難問だと思いますので, まずは (1),(2)と(4),(3) を別々に解いてみてください. 例えば (1) については,"CBABD" という文字列から1文字ずつ読み取り, 次のように出力できますか? 'C' = 0x82 0x62 'B' = 0x82 0x61 'A' = 0x41 'B' = 0x42 'D' = 0x82 0x63 あ,それからついでに一言. ZenkakuHantei() をどこから持ってきたのか知りませんが, 関数名の付け方がアレですね…. その情報源は,文字コードの理解度に疑問符が付くので, あまりアテにしないほうがよさそう…. ZenkakuHantei(c) の処理内容自体は正しいのですが, 関数名の付け方が間違いとまでは言えないものの, 本質から外れていて誤解を招くおそれがあります. この関数の本当の意味は,cがシフトJISの2バイト文字 (事実上全角文字には違いない) の第1バイトか否かを判定することです. (cは1「文字」ではなく2バイト文字の1バイトにすぎない.) Windows であれば,ZenkakuHantei() に相当する関数として _ismbblead() や isleadbyte() などが標準で使えるので, これらの名前で検索すれば使い方が見つかるでしょう.