• ベストアンサー

シフトJIS文字列の中から

(string str;) pos=str.find_last_of("「"); で2バイトさがそうとしても文字化けと同じように間違った文字を見つけてしまいます このシフト文字列対策はどうすればいいのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

> 後ろのインデックスがほしいのでfind_last_ofのほうがいいのです find_last_of は引数に与えられた文字(この場合マルチバイトなので2文字)の'いずれか'を末尾から探します。 rfind は与えられた文字列の現れる位置を末尾から探します。 両者の違いはご理解いただけますか?

keyguy
質問者

お礼

ありがとうございます まさかと思ってテストプログラムで確かめてみたらそうでした 不適切なサイトの説明をまにうけて思い込んでいたみたいです

その他の回答 (2)

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.2

>なにか回避策は有りませんか? ワイド文字列(UNICODE)で使ってはどうですか? std::wstringというものがあります。 (wstring str;) pos=str.find_last_of(L"「"); http://www.doumo.jp/postgretips/tips.jsp?tips=18 ANSI→UNICODEに変換するには Windowsの場合は MultiByteToWideChar APIで変換できます。 http://www.doumo.jp/postgretips/tips.jsp?tips=67 gccの場合は setlocaleとmbtowcを使います。 http://f1.aaa.livedoor.jp/~pointc/log243.html

参考URL:
http://www.doumo.jp/postgretips/tips.jsp?tips=18,http://www.doumo.jp/postgretips/tips.jsp?tips=67,http://f1.aaa.livedoor
keyguy
質問者

お礼

ありがとうございます おおがかりな改変になりますね 少し手を抜くならば 例えば"「"の後に必ず半角ブランクをいれる事にすれば検索ミスは無くなりますね?

回答No.1

ドキュメントを読んでください。 find_last_of はあなたの望む振舞いではありません。 rfind はいかがですか? # いずれにせよ、std::stringはマルチバイト文字列の扱いは苦手です。

keyguy
質問者

補足

ありがとうございます 後ろのインデックスがほしいのでfind_last_ofのほうがいいのです いずれにしても違う文字を見つけてしまうので困ってます バイト単位の並びが同じなので手のうち用がありません なにか回避策は有りませんか?

関連するQ&A