« C++Builder 2009への移植作業 その1 | メイン | AnsiDequotedStrの不具合 »

C++Builder 2009への移植作業 その2 C++Builder 2007と2009のAnsiStringの動作の違いの調査

C++Builder 2007と2009のAnsiStringの動作の違いを検証した。
比較の対象としてC++Builder 2009のUnicodeStringも比較した。

AnsiString s = "あいうえお";

として、各動作を確認した。

結論から言うと、動作が異なったのはAnsiString#AnsiPos()だけ。

C++Builder 2007から2009へ移植するときは、AnsiPos()に注意すればよさそうだ。

WideStringの動作は変更が無く、UnicodeStringと同じ挙動らしい。

C++Builder2007C++Builder2009(AnsiString)C++Builder2009(UnicodeString)C++Builder2007(WideString)C++Builder2009(WideString)
s.AnsiPos("うえ");53
s.Pos("うえ");55333
s.Delete(3, 2);あうえおあうえおあいおあいおあいお
s.Insert("ん", 3);あんいうえおあんいうえおあいんうえおあいんうえおあいんうえお
s.Length();1010555
s.SubString(3, 2);うえうえうえ
s.LastDelimiter("え");944

追記
AnsiString::LastDelimiterの挙動も異なるようです。

2009年5月28日追記
C++Builder 2009 Update3でAnsiStringの挙動が修正されました。

C++Builder2007C++Builder2009 Update3(AnsiString)C++Builder2009 Update3(UnicodeString)C++Builder2007(WideString)C++Builder2009(WideString)
s.AnsiPos("うえ");55
s.Pos("うえ");55333
s.Delete(3, 2);あうえおあうえおあいおあいおあいお
s.Insert("ん", 3);あんいうえおあんいうえおあいんうえおあいんうえおあいんうえお
s.Length();1010555
s.SubString(3, 2);うえうえうえ
s.LastDelimiter("え");994

トラックバック

このエントリーのトラックバックURL:
http://www.gesource.jp/mt/mt-tb.cgi/832

コメント (3)

ほやぞう:

こんにちは
ずっとBCB6を使ってたんですが、今回C++Builder2009を買ってみて移植すると、文字列の挙動がおかしくてなやんでましたので、たすかりました。

Memo1->SelStart
Memo1->SelLength
これも、以前はバイト数だったのが、文字数になってますね。

すべてのデフォルト文字列をUnicodeStringじゃなく、依然と同じにするオプションとかないのでしょうかね~

山本隆:

> すべてのデフォルト文字列をUnicodeStringじゃなく、依然と同じにするオプションとかないのでしょうかね~
残念ながら、ないと思います。
AnsiStringsユニットを使うことで、若干移植が簡単になります。

AnsiString s = "あいうえお";
int i = AnsiPos("うえ", s); => 3

#include <AnsiStrings.hpp>
AnsiString s = "あいうえお";
int i = AnsiPos("うえ", s); => 5 #C++Builder2007と同じ

ほやぞう :

山本様、コメントありがとうございます。

以前BCB6でつくったアプリが、リッチテキストコンポーネントをベースに専用の文字処理するエディタみたいなもので、今回BCB2009を買ったのは、これのバージョンアップのためだったんです。BCB6がVistaでうまく動かなくて。

文字列の処理はSTLのstring型の関数群で、あとコールバックAPIとかも頻繁によぶんですけど、これらが全部S-JISで処理してまして、しかもRitchTextVCLの内容と何度も行ったり来たりします。VCLとの出し入れで毎回マルチバイト文字とS-JISを相互変換すると相当パフォーマンスが落ちそうです。また、そもそもソースのうちこれら文字列の処理が1万行ほどあって、文字処理を移植すると、ほとんど作り直しになってしまいます。

たしかにUnicodeString便利ですし、いまから作るならUnicodeStringの恩恵をうけれるんだけど・・・・まいりました。

互換オプション当然あると思ってましたが、・・・ないとは!コードギアさん、互換VCLのこしてほしかったよぉ
な~んて、ここに愚痴を書いてすみません(汗)

あきらめがつきました。VirtuaPCにXPいれて、BCB6いれます。

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

About

2008年10月10日 23:48に投稿されたエントリーのページです。

ひとつ前の投稿は「C++Builder 2009への移植作業 その1」です。

次の投稿は「AnsiDequotedStrの不具合」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

Powered by
Movable Type 3.35