C++で新しい文字列ク ..
[2ch|▼Menu]
166:デフォルトの名無しさん
07/11/22 23:26:35
>>164
チゲーよバカ

167:デフォルトの名無しさん
07/11/24 13:04:15
あれ?
あぁ、後者って書き忘れたなぁ。
エンコーディングはよぉーしらん。

168:デフォルトの名無しさん
07/12/07 16:13:34
目的のものを作っちゃった俺がきましたよ

169:デフォルトの名無しさん
07/12/07 20:25:38
>>168
公開!公開!

170:デフォルトの名無しさん
07/12/07 20:54:18
オプソ化きぼんぬ

171:デフォルトの名無しさん
07/12/07 22:21:14
オプソしたってめこめこに叩かれるだけじゃないのか?
前の方にあったiteratorが文字コードみなきゃいけないっていうのは
その通りだと思う。
だからiteratorは抽象文字を返す感じにしてるね。ope++で各文字コードに
応じたiterateをして*iteで抽象文字クラス参照を返す感じ。
ここ絶対速くないといけないから全部inline
統一iteratorさえできれば、アルゴリズムは結構全文字コードで共有化
できるから負担はだいぶ減ったかな。
wstring,stringみたいに文字コードによってクラスがちがうのは絶対やだから
UTF-16,8,sisとかも統一的に扱える感じにしてる。
なので文字端末は文字コードによって0が1つになったり2つになったり。
jisはシフトイン見たり、sjis,euc,utf-8は各バイト見たり。
結合時のbom削除とかコードの変換とか、検索時にネイティブAPI使ったり、
ほんと死ぬほど大変だった気がする。
でも誰かもうそういうのオプソでやってそうじゃね?てか需要なし?
CString使えボケ?std::wstringでいいじゃん?
力作のレスだぜ。さあ叩いてくれ

172:デフォルトの名無しさん
07/12/07 22:36:15
文字コードを知っている必要があるのはコンテナではなくイテレータだってアイデアはいいと思うよ。

173:デフォルトの名無しさん
07/12/19 19:34:33
双方向イテレータとランダムアクセスイテレータを作るのは
難しそうだけど。

174:デフォルトの名無しさん
07/12/19 23:07:33
文字単位でランダムアクセスできる機能は
大部分の用途に対してオーバースペックだから捨てるのが前提だ。
必要に応じて、途中のイテレータを保存しとくとか、
32bit文字オブジェクトのベクタに変換したりしてどうにかする。

175:デフォルトの名無しさん
07/12/19 23:21:31
内部表現がUTF-16なら双方向は楽でしょ。
マルチバイトとはいえ下位サロゲートが出現したら、その前を頭にすればいい。
ランダムアクセスは内部で結局はイテレートするしかないよね。

176:デフォルトの名無しさん
07/12/19 23:48:11
内部表現がUTF-16(UCS2)かUTF-8で、UCS4を取り出すようなイテレータだったら、
boostのicuで使われてるはず。

177:デフォルトの名無しさん
07/12/20 04:20:58
>>174
可変長ならランダムアクセスはそもそも実装不可能だろう

178:デフォルトの名無しさん
07/12/20 13:10:06
ランダムアクセスあきらめたら、
「与えられたテキストファイルで使われているすべての文字の一覧を求めろ」
と言われたときどうするの?
STLでsort() → unique()、という手が真っ先に思い浮かぶんだけど、
sort()はランダムアクセスイテレータがいるんだよね。

179:デフォルトの名無しさん
07/12/20 14:20:33
コピーするほかない
コピーするのかビューなのかを
場合により選べるのがイテレータの良いところ

180:デフォルトの名無しさん
07/12/20 17:34:43
どうせWin32APIの文字受け渡しが癌

181:デフォルトの名無しさん
07/12/20 17:49:42
癌は受け渡しより受け取りの方だと思うが。

GetBuffer→API呼ぶ(→ReleaseBuffer) の流れからは逃れられない

182:デフォルトの名無しさん
07/12/20 17:59:40
>>33を使えばAPIからの受け取りもそれほど面倒ではないけど、文字コードが違う場合には
自動で変換できるようにしないとな。

183:デフォルトの名無しさん
07/12/20 18:25:18
>>33がリッチなのはわかる。
でも、ただGetBuffer/ReleaseBufferが面倒なだけだったら、単純なユーティリティクラスでいいんじゃない?

class GR {
 CString str;
 size_t siz;
 LPTSTR p;
public:
 ~GR() {
  str.ReleaseBuffer();
 }
 GR(CString &str_, size_t size_) : str(str_), p(NULL), siz(0) {
  p = str.GetBuffer(size);
  siz = size_;
 }
 operator LPTSTR() { return p; }
 size_t size() const { return siz; }
};

多分こんな風に使えるはず。

CString s;
{ GR buf(s, 1000); GetCurrentDirectory(buf, buf.size()); }

思いつきで書いただけで、コンパイルもテストもしてないけど。

184:デフォルトの名無しさん
07/12/20 19:01:05
何文字返ってくるか分からないがね〜

185:デフォルトの名無しさん
07/12/20 19:27:31
受け取ったらそのまま、普通に持ち運びしたいよな、何も考えずに。

186:デフォルトの名無しさん
07/12/20 21:56:39
>>184
MSのプログラマですらオーバーフロー度々起こすってことはやっぱ問題があるんだよな。

187:デフォルトの名無しさん
07/12/20 22:02:05
safeiteratorを実装するしか

188:デフォルトの名無しさん
07/12/21 11:37:49
>>33のcapture_stringをパクればいいんでね?

class CaptureString {
public:
 typedef char value_type;
private:
 CString *target;
 size_t size;
 value_type *buffer;
public:
 CaptureString(CString *target_, size_t size_ = DEFAULT_SIZE)
  : target(target_), size(size_), buffer(NULL) {
 }
 ~CaptureString() {
  if (buffer != NULL) {
   target->ReleaseBuffer();
  }
 }
 operator value_type *() {
  if (buffer == NULL) {
   buffer = target->GetBuffer(size);
  }
  return buffer;
 }
};

// 使用例
CString str;
fgets(stdin, CaptureString(&str, BUF_SIZE), BUF_SIZE);

189:デフォルトの名無しさん
07/12/21 14:43:07
>>184,185

>>183のやつだったら、
for (GR buf(s); ! buf.enough(GetCurrentDirectory(buf, buf.size())); buf.grow());
みたいに書けるようにメソッド追加すればいいし、

>>188のやつだったら、
size_t BUF_SIZE = 100;
while (GetCurrentDirectory(CaptureString(&str, BUF_SIZE), BUF_SIZE) >= BUF_SIZE)
BUF_SIZE *= 2;
とか書けばいい。

190:デフォルトの名無しさん
07/12/21 16:36:16
結局、固定長バッファで長さ不明のもの受け取る時点で…
リトライすると結果が変わる場合もあるし。

191:デフォルトの名無しさん
08/01/07 15:18:41
既出かもしれないけど
URLリンク(ast.qt-space.com)
結構使いやすいと思った

192:デフォルトの名無しさん
08/01/07 15:41:17
>>191
意図しているのかしていないのか、コードはバグっているしドキュメントには不備があるし、windows.h必須だし……

193:デフォルトの名無しさん
08/01/07 15:53:14
Win32APIで可変長文字列が扱えて置換できるっていうの探してたら
ようやく見つかったから貼ってみた。
このスレ的にはナシなのか。
それでも、どこがバグってるか分からず使ってる幸せ脳なオレ

URLリンク(ayusya.hp.infoseek.co.jp)
これは可変長文字列が使えないし、置換の処理が間違ってた。

194:デフォルトの名無しさん
08/01/07 15:53:35
const性を全く考慮していない辺り、アイタタタなのだが。
つまり、const SJStringを作ってしまうと殆ど(或いは全部か?)のメソッドが使えなくなる罠。
const SJStringから何かを検索することも、SJStringの検索文字列をconst SJStringで与えることもできやしない。

195:デフォルトの名無しさん
08/01/07 16:03:18
>>193
>191のメソッドの、parseInt()かisOnlyNumber()辺りを2バイト数字で試してみて。
>193のクラスも、>194の問題があるね。windows.hに依存しない分だけ使えそうだけど。

196:デフォルトの名無しさん
08/01/07 16:12:09
ずれてる…
100→211
999→333
になった。

197:デフォルトの名無しさん
08/01/07 16:18:41
書き方が悪かった。parseIntでの結果
0 1 2 3 4 5 6 8 9
1  2 4  5  6 7  8  9 3
7が出てくると0になる。(678→0)
・・・変だね。

198:デフォルトの名無しさん
08/01/07 16:20:50
このスレに触発されて文字列クラス作ってるけど、疲れてきたよ。
char awstr[] = "あいaうえbおc";
typedef fixedstring<traits_SJIS> mystring;
mystring fs(awstr);
std::sort(fs.begin(), fs.end());
fs[3] = "字";
fs += 'Z';
std::string tmpstr = fs;
traits_SJIS::char_type dd("そ");
if (dd == "そ");
out_iterator<sys2_to_ucs2> oi("てすとabc文字列");
wcout << with_nul(*oi)() << endl;
fs.assign(oi);
fs *= 3;
wcout << fs;

199:デフォルトの名無しさん
08/01/07 16:55:55
>>197
parseInt()の実装を見てご覧。意図的なら兎も角、こんなバグを作りこむ香具師が信用できる?

200:デフォルトの名無しさん
08/01/07 17:01:25
>>199
どうやら数字を1から9まで数えられない人が作ったようです。
parseInt()だけ直して使おうかなと。
どうせ置換と可変文字列が使えればいいし。
そこだけならwindows.hもいらないみたいだし。
(一番大きな理由は自分では作れないという事)

201:デフォルトの名無しさん
08/01/07 17:06:08
>>200
バグっているのはそこだけじゃないから、充分注意してね。
# つーか、MBCSなら置換も楽なんだけど……

202:デフォルトの名無しさん
08/01/07 17:08:00
なんだろう。この無駄な中括弧の多さは…

文字列を修正して
CString strNumber = __TEXT("-0123456789−0123456789");

その下のif文にコレ追加して
else if (p == 11)
{
str += "-";
}

if文の終わりのところを11にすればいいのかな。
str += strNumber.charAt(p - 11);

203:デフォルトの名無しさん
08/01/07 17:14:18
parseInt()が有るのにparseDouble()なんかが無いのも不思議。
ここらへん全部作ってあるクラスがあっても良さそう。
というか探せばありそう。また探してくるわ

204:デフォルトの名無しさん
08/02/09 12:36:32
結局良いのは存在しないのか・・・

205:デフォルトの名無しさん
08/02/10 13:40:06
ほんとに「完璧」な文字列クラスを作ろうとすると、

・各種エンコーディングの相互変換
・各種エンコーディングの自動判別
・文字列←→整数、小数への変換
・検索、置き換え(正規表現対応で)
・マルチバイト、ワイド文字(2バイト、4バイト両方)に対応

最低でもこれくらいは必要になるからめちゃくちゃ大変。

206:デフォルトの名無しさん
08/02/10 14:21:47
ヘッダーファイル一つインクルードするだけで使えるようなのがいいんだけどなぁ。
正規表現まで対応するとなるとかなりの量になるよね。

207:デフォルトの名無しさん
08/02/10 14:51:45
当然イテレータで要素巡回できるようにしてほしいし、
ついでに、レンジやコンテナの要件も満たしていてほしい。

208:デフォルトの名無しさん
08/02/10 15:23:45
wstringのサロゲートなんとかするだけでもいいっすよ

209:デフォルトの名無しさん
08/02/10 15:29:08
そうするとchar_traitsだけじゃ足りないんだよな。

210:デフォルトの名無しさん
08/02/13 00:13:40
海外のプログラマーはどうしてるんかね?
マルチバイトカンケーネーであまり気にしないんだろうか。

普段はstd::stringでも構わないんだけど
GetWindowTextとか使うときに不便だから
ここらへんを一まとめにしたようなのどこかにないかね。

211:デフォルトの名無しさん
08/02/13 14:07:59
中国人とかも困ってるだろうにね。

212:デフォルトの名無しさん
08/02/13 18:58:13
>>210
今度の改定でstd::basic_string<>も
vector同様に要素がメモリ上で連続されることが保証されるようになるらしい。

213:デフォルトの名無しさん
08/02/13 21:50:47
中国人は字が読めるヤツは英語も読めて
英語出来ないヤツは字も読めないから問題ないんだよ

214:デフォルトの名無しさん
08/02/13 21:52:32
国内向けアプリは普通中国語で作るんだろ?

215:デフォルトの名無しさん
08/02/13 22:24:57
それはどうかな

216:デフォルトの名無しさん
08/02/14 05:32:36
仕事でパソコンを使う奴は英語でいいし、英語を読めない奴にパソコンを教えても使えないから問題ない。

217:デフォルトの名無しさん
08/02/14 12:28:31
ワープロやエディタのように英語が読めてもデータとして中国語を扱う必要もあるだろうに。

218:デフォルトの名無しさん
08/02/14 19:21:56
その場合は、中国語だけを扱えばいいから何の問題もない

219:デフォルトの名無しさん
08/02/18 08:04:42
アニメ「さよなら絶望先生」には

 糸色 望(いとしき のぞむ) → 絶望
 糸色 命(いとしき みこと) → 絶命
 糸色 交(いとしき まじる) → 絶交

こういったネタが出てくるのですが、これって文字コードの正規化の一種ですよね?
人気アニメでも使われるくらいなので、かなりニーズのある処理だと思うのですが、
残念ながらこういった「文字の結合」ができるライブラリを寡黙にして知りません。
そこでお願いなのですが、是非新たな文字列クラスにはこういった機能をデフォルトで組み込んでもらえませんか?

220:デフォルトの名無しさん
08/02/18 08:40:08
>こういったネタが出てくるのですが、これって文字コードの正規化の一種ですよね?
いいえ。

>残念ながらこういった「文字の結合」ができるライブラリを寡黙にして知りません。
それを言うなら、「寡聞にして存じ上げません」でしょう。

221:デフォルトの名無しさん
08/02/18 12:41:52
 雲
雲雲
 龍   ←これで一字
龍龍

>>これって文字コードの正規化の一種ですよね?
>いいえ。

222:デフォルトの名無しさん
08/02/18 13:34:06
>>221
言葉遊びとごっちゃにしてませんか?

223:デフォルトの名無しさん
08/02/18 15:01:13
糸色 = 文字コードの正規化
>>221 = 言葉遊び

なぜそう言いきれるのか理由を説明してくれ。
コンピュータにも分かるように。

224:デフォルトの名無しさん
08/02/18 15:33:56
>>223
逆。
>219は言葉遊び。通称「絶望」先生は、本名「糸色望」なのだから。

225:デフォルトの名無しさん
08/02/18 19:19:25
>>205
エンコーディングの自動判別機能については文字列クラスじゃなく、
フリー関数かlocaleを表現するクラスのメンバ関数に持たせるべきだと思う。
国際化された検索機能などを文字列クラス自体が持つとすると、
文字列はエンコーディングとバイト列の組になっているか、
あるいは特定の内部コードに正規化されているはずだけど
自動判別アルゴリズムの入力は「バイト列」と「エンコーディングの候補」になる。
これらを与えることが可能な場所はコンストラクタしかないが、
コード変換しないでエンコーディングだけ知りたい場合に困ってしまう。

226:デフォルトの名無しさん
08/02/19 01:58:32
きっと>>219が言いたかったのは
文字コードで悩むならいっそ画像化して画像解析すればいいじゃない
ってことだろう。

無いな。

227:219(本物)
08/02/19 18:01:30
私の言いたかったことは
「言葉遊びで言葉遊びを説明する・・・
そんな言葉遊びを言葉遊び的に言葉遊びで言葉遊びするという
言葉遊びを言葉遊びしてほしい」
ということです

228:デフォルトの名無しさん
08/02/25 21:12:30
縦読みも正規化だな

229:デフォルトの名無しさん
08/03/09 22:31:12
俺は>>198ではないがオレ流に作ってみたので晒してみる
URLリンク(sij.dip.jp)

話にならんってレベルだったらスルーしてくれ…


230:デフォルトの名無しさん
08/04/13 18:49:20
>>229
亀レスだが、文字コードによって文字列クラスを変えるのはどうかと思う。
内部フラグか何かでどうにかならんかな?

こういうことがしたい)
strjp sjis("Shift_JIS文字", encoding::sjis);
strjp euc("EUC文字", encoding::euc);
sjis = euc;
euc = sjis.conv_to(encoding::euc);


最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5392日前に更新/51 KB
担当:undef