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 |
こんにちは
ずっと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いれます。