Skip to content
 

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

関連記事:

  1. C++Builder 2009への移植作業 その1
  2. C++Builder 2009 Update 3、Update 4、Boost Updateで、どこが修正されたのか
  3. C++Builder 2009への移植作業 その3 C++Builder 2009におけるTStringList#LoadFromFileの挙動の変化
  4. C++BuilderによるUnlha32.dllを使用した書庫の展開(1)
  5. Delphi 2009/C++Builder 2009の新しい文字列型の問題

3 Comments

  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いれます。

Leave a Reply