
CString型の文字列に格納されている文字を1文字ずつ取り出したいです。
ただし半角なら1バイト単位で、全角なら2バイト単位で、という風に分離したいです。
半角だけなら、str[0] str[1]...という風に取り出せますが、
全角が混じっていると、1バイト目、2バイト目と分離されてしまいます。
その文字が半角か全角かを判断して、半角なら1バイト、全角なら2バイト同時に取り出すロジックを、下記のような感じの関数として作りたいです。
CString ripString(CString str,int index){ //ソースとなる文字列、n文字目
/*~処理~*/
return 文字列;
}
たとえば"あaいbうcえdおe"という文字列を入れると、
CString str="あaいbうcえdおe";
ripString(str,0) →結果 "あ"
ripString(str,1) →結果 "a"
ripString(str,2) →結果 "い"
ripString(str,3) →結果 "b"
・
・
・
こういうことをするのに良い方法はありますか?
1バイトごとのそれぞれの文字自身が、
・半角文字なのか
・全角文字の前1バイトなのか
・全角文字の後1バイトなのか
これをプログラム的に判別する方法があればいいのですが・・・悩んでいます。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
VC++6.0 をインストールするとき
種々の選択肢が出てきますが そのとき
UNICODEを選択します
そうするとCStringにたいする操作は自動的にバイト単位ではなくて
文字単位になります
特別な関数は必要としません
ただしOSがUNICODEを持っていることが必要です
たとえばWindowsXPだとデフォールトでOKですが
Windows98ではそのままではだめです
No.2
- 回答日時:
単にキャストすればいいですよ。
_ismbbleadでも可能だと思いますが。
次の文字へポインタを進める関数_tcsinc(CharNext)を使った例です。
CString ripString(CString str, int index)
{
LPCTSTR pStart = str;
for (int i = 0; i < index; ++i) {
pStart = _tcsinc(pStart); // CharNextでも同様
}
LPCTSTR pEnd = _tcsinc(pStart); // CharNextでも同様
TCHAR result[3];
const int len = pEnd - pStart;
memcpy(result, pStart, len);
result[len] = _T('\0');
return result;
}
No.1
- 回答日時:
CStringって言ってるからVC++だと仮定するなら
_ismbsleadと_ismbstrail
参考URL:http://msdn.microsoft.com/ja-jp/library/scab1bx7 …
この回答への補足
ありがとうございます。VC6にてです。
教えていただいた_ismbslead()を使おうとしてみましたが引数がよく分からず、
調べていたところ見つけた「_ismbblead()」を使ってみたところ、
目的としていたことが8割がたできたようですが、一部取り逃がすようです。
(2バイトの先頭なのにそう判断してくれない)
やはり、教えていただいた_ismbsleadを使うしか無いようです・・・
引数が「const unsigned char*」となっていて、どのように入れれば良いかが分かりません。
int _ismbslead(
const unsigned char *str,
const unsigned char *current
);
(ismbblead()のほうですと、単純に単体文字へのポインタ(char*型)を入れれば機能はしたのですが。)
同じように入れようとすると、
「char* をconst unsigned char*に変換できない」
という内容のコンパイルエラーが出ます。
詳細な使い方を教えていただけると幸いです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
CStringのFindで文字列検索を行いたいのですが
C言語・C++・C#
-
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
CString から LPCTSTRの型に変換
C言語・C++・C#
-
-
4
CStringの文字列検索&抜き出しについて
C言語・C++・C#
-
5
【C言語】全角文字の配列を、全角のまま1文字ずつ出力する方法
C言語・C++・C#
-
6
エディットボックスで改行
その他(プログラミング・Web制作)
-
7
CStringについて
C言語・C++・C#
-
8
CFileDialogの最初のディレクトリ設定
C言語・C++・C#
-
9
C++でのCRLFについて
C言語・C++・C#
-
10
エディットコントロールのイベントハンドラ
Microsoft ASP
-
11
適切な変換関数が存在しない???
C言語・C++・C#
-
12
CString型の文字列連結について
C言語・C++・C#
-
13
ダイアログの上のテキストボックスの、初期値を設定する方法が分かりません・・・・
C言語・C++・C#
-
14
文字列の置換をCStringで(C++)
C言語・C++・C#
-
15
エディットボックスの入力制限について
C言語・C++・C#
-
16
CStringをwchar_tに変換したい
C言語・C++・C#
-
17
CStringの中から数字だけの場合と、その他が含まれる場合を識別する方法
C言語・C++・C#
-
18
VC++で文字列から任意の文字を削除するにはどうしたらいいですか?
C言語・C++・C#
-
19
画面を強制的に再描画させる方法
C言語・C++・C#
-
20
ボタンの表示の色、フォントを変更したい
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ファイル名の一部削除について
-
一番右のスペース以降の文字列...
-
CString型 全角半角を意識せず...
-
機種依存文字と特殊文字について
-
StrConvでUnicodeに変換出来な...
-
VB6.0 文字列のファイル書...
-
TextFieldParserの固定長桁数を...
-
エクセルで13,410円を数値の134...
-
[CakePHP]複数テーブルのアソシ...
-
C#でbyte配列から画像を表示さ...
-
VBA 変数名に変数を使用したい。
-
【VB.NET】Excelの最終行までの...
-
【ExcelVBA】値を変更しながら...
-
NULLを含む文字列の結合で...
-
SQLを発行とは?クエリの作成と...
-
ACCESSで視覚的タイムテーブル...
-
手動または分散トランザクショ...
-
C# DataTableに最後に追加した...
-
VB.NETの配列にExcelから読み込...
-
ワークテーブルの作成について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
EXCELのVBAでLenB関数について
-
ファイル名の一部削除について
-
StrConvでUnicodeに変換出来な...
-
CString型 全角半角を意識せず...
-
一番右のスペース以降の文字列...
-
エンコード・デコードの仕方
-
「シフトJIS X 0213」形式の文...
-
文字列から、null値を除去する方法
-
TextFieldParserの固定長桁数を...
-
VB6のテキストボックスに入力し...
-
VBからID3タグをいじる方法
-
【Excel VBA】セル内テキストの...
-
C#文字コードについて
-
HEX
-
文字列の中に半角文字があるか...
-
ASC関数
-
機種依存文字と特殊文字について
-
Err.Number
-
chrをintに変換すると…
-
C言語とWin32APIで全角かなの...
おすすめ情報