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++Builder2007 C++Builder2009(AnsiString) C++Builder2009(UnicodeString) C++Builder2007(WideString) C++Builder2009(WideString)
s.AnsiPos(“うえ”); 5 3
s.Pos(“うえ”); 5 5 3 3 3
s.Delete(3, 2); あうえお あうえお あいお あいお あいお
s.Insert(“ん”, 3); あんいうえお あんいうえお あいんうえお あいんうえお あいんうえお
s.Length(); 10 10 5 5 5
s.SubString(3, 2); うえ うえ うえ
s.LastDelimiter(“え”); 9 4 4

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

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

C++Builder2007 C++Builder2009 Update3(AnsiString) C++Builder2009 Update3(UnicodeString) C++Builder2007(WideString) C++Builder2009(WideString)
s.AnsiPos(“うえ”); 5 5
s.Pos(“うえ”); 5 5 3 3 3
s.Delete(3, 2); あうえお あうえお あいお あいお あいお
s.Insert(“ん”, 3); あんいうえお あんいうえお あいんうえお あいんうえお あいんうえお
s.Length(); 10 10 5 5 5
s.SubString(3, 2); うえ うえ うえ
s.LastDelimiter(“え”); 9 9 4

コメント

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

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

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

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

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

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

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

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

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

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

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

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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください