トップページ⇒tech
21コメント6KB

C/C++でマルチバイト文字

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。NGNG
を使うとき皆さんはどうしていますか?
0002名無しさん@お腹いっぱい。NGNG
中身がマルチバイト文字のstringクラスでは、
find_first_ofなどのメンバ関数はきちんと動いてくれるのでしょうか?
運がいいのか、今のところ問題は起きていないのですが、
気になって夜も眠れません。
0003名無しさん@お腹いっぱい。NGNG
basic_string<whchar_t>でも使ったら?
00042NGNG
wstringのことですか?
う〜ん、うにコードはちょっと・・・。
と思ってしまうので、マルチバイトでがんばりたいのですが・・・。
0005名無しさん@お腹いっぱい。NGNG
>>2
そんなこと考慮されてない。

SJISとかEUCで使うんだろ?
それなら、第一バイト、第二バイトとかの判定するだけじゃん。
自分で拡張しよう。

力業では、UNICODE-マルチバイトの変換テーブルもって、
必要なときだけUNICODEになおして処理するとか。

つーか、CStringとかAnsiStringなら、ロケールを考慮して
くれるんだから、素直にそういうの使えば?
00062>5NGNG
やっぱそうですか・・・。
頑張って自分でアトリビュート書くか、拡張するかしてみます。
"AnsiString"は使える環境にないし、
"CString"は"operator LPCSTR ()"あたりが嫌いなので。
0007名無しさん@お腹いっぱい。NGNG
isDBCSLeadByteExは?
0008名無しさん@お腹いっぱい。NGNG
CString はMBCSに就いてはかなりバカです。
使えません。
00092NGNG
>7
できれば標準basic_stringから離れたくないもので・・・。

自分的には、
  �@あきらめてwstringを使う。
  �Aがんばってアトリビュートを書く。
  �Bアトリビュートにダミーをかましてテンプレートを特化する。
あたりかなぁと思っているんですが、
�Aに関しては自分の現在のスキルではとても無理だし、
�Bに関してはなんかすごく気持ち悪いのです。
どうなんでしょう?

もう少し、うにコードの規格がしっかりしてくれていればなぁ・・・。
0010名無しさん@お腹いっぱい。NGNG
>string
>typedef basic_string<char> string;
>この型は、char 型の要素に対してテンプレート クラス basic_string を専用化したクラスを定義します。
>
>wstring
>typedef basic_string<wchar_t> wstring;
>この型は、wchar_t 型の要素のためにテンプレート クラス basic_string を専用化したものです。

stringも、wstringともにbasic_stringなんだけど。。。
0011>10NGNG
言いたいことがよくわからないんですけど・・・。

stringはマルチバイト文字の先導バイトを気にしなきゃいけないけど、
wstringはUNICODEなので、先導バイトを気にする必要がありません。
ただし、UNICODEは漢字の字体がいまいちなのです。
0012名無しさん@お腹いっぱい。NGNG
>ただし、UNICODEは漢字の字体がいまいちなのです。
が意味が良く分からないんだけど、まさかフォントのことを言ってるんじゃないよね?
0013これでも使っとけNGNG
#define isjis(c) (((c)>=0x21 && (c)<=0x7e))
#define iseuc(c) (((c)>=0xa1 && (c)<=0xfe))
#define issjis1(c) (((c)>=0x81 && (c)<=0x9f) || ((c)>=0xe0 && (c)<=0xef))
#define issjis2(c) ((c)>=0x40 && (c)<=0xfc && (c)!=0x7f)
#define ishankana(c) ((c)>=0xa0 && (c)<=0xdf)
0014>13NGNG
ちょっといいヤツだな。
00152NGNG
>12
UNICODEでは漢字の符号空間が狭いから、
似たような漢字がひとまとめにされるというのがいやだなぁ、ということです。

>13
どうもです。
ただ、そういうことではなくbasic_stringでマルチバイトを扱いたいなぁと思って。
0016名無しさん@お腹いっぱい。NGNG
2は逝ってよし!
00172NGNG
実はUNICODEなんて実際に使ったことはありませんでした。
雑誌のなんかの読みかじりの知識で知ったかぶりをしてました。
ごめんなさい。
0018名無しさん@お腹いっぱい。 NGNG
どっちにしてもbasic_stringを継承して
日本語を意識するようにしたクラスを作るしかないな。
0019名無しさん@お腹いっぱい。 NGNG
ちなみにUNICODEの変換は、自分でテーブルを作らなくても
Winならsprintf系で出来るよ
0020名無しさん@お腹いっぱい。 NGNG
Linux系でもmbtowcで出来ます。
ただ、それが「UNICODEだ」とは
書きたくないらしく、
「ワイド」と表現してます(−−;)。

#白状しろというツッコミは禁止
0021本物の2 NGNG
>18
まともなレスをどうも。
find系のメンバ関数が仮想関数なら迷わず継承するんですが、
非仮想なのでそれは見送りました。

とりあえず、この板ではこれ以上の情報は得られそうにないので、
このスレは終了でいいです。
皆さん意外と原始的な方法を使っているんだということが判っただけでも収穫でした。
まともなレスをつけてくれた皆さんどうもありがとうございました。
最終的にbasic_stringを特化していくことにしました。

********************終了********************
■ このスレッドは過去ログ倉庫に格納されています