2014年8月19日火曜日

AppMethodに挑戦(11)UnicodeStringのバグ?→仕様だそうです。

20140821追記
表題の件、embarcaderoさまより回答をいただいており、『仕様』のようです。
以下、参考URLです。
C++ におけるマルチデバイス アプリケーションについての考慮事項
文字列定数
またその他の情報として、
『C++ではAnsiString型の一種であり、UTF-8形式で文字列を処理するUTF8String型をお勧め』
だそうなので、UTF8Stringというのをためしてみます。
以下は、元の記事です。

文字コードの謎です。
まぁ謎というほどのことでもないのですが、
appmethod(Delpji/C++Builder含む)
の大きな特徴のひとつとして、ワンソース、マルチプラットフォームがあるわけです。
そして、文字コードは(正確には文字のEncode)、UTF16のようで、
文字列はとにかくUnicodeStringというものを使うべきだと。
ということで、SRCと結果を。
 M1->Lines->Clear();
 UnicodeString us1;
 us1 = "AnsiString";
 M1->Lines->Add(us1);
 us1 = "AnsiString日本語";
 M1->Lines->Add(us1);
 us1 = L"WideString";
 M1->Lines->Add(us1);
 us1 = L"WideString日本語";
 M1->Lines->Add(us1);
 WideChar wc[] = { 0xd840,0xdc0b,0x6075,0x4ecb,0};
 us1 = wc;
 M1->Lines->Add(us1);
 M1->Lines->Add(wc);

●結果
左から、設計時画面、WIN32実行画面、Android実行画面

    

●ということで、2点あります。
■ひとつは、もちろん期待はしていませんでしたが、
サロゲートペアの文字は当然のようにWindowsでしか表示されませんでした。
まぁこれはしかたないところでしょう。スマフォ側のフォントの問題もありますし、
スマフォのブラウザでも表示できなかったので。。。(>_<)

■しかし、問題はこれです。
us1 = L"WideString日本語"; はOKですが、
us1 = "AnsiString日本語"; はNGだということです。
ここを見ると、こんな記述があります。
UnicodeString は、名前こそ Unicode となっていますが、ANSI 、Unicode 両方の文字セットの文字列を表すことができます(ANSI 文字列はまず変換されます)。
ということは、
us1 = "AnsiString日本語"; としたときに内部的にはUnicodeに変換されてると予想されますが、変換される方法が間違っているということですよね。
で、ここでテスト。
us1 = "あAnsiString日本語";
WideChar* wcptr = us1.c_str();
と書いて、デバッガで見てみます。

●win32だとこうである。


●arm(Android)だとこうである。


もーハッキリ言ってぐでぐでですわ~(o^^o)。
まぁ、日本人が作ってないですからね。。。
バグ報告とか無いんでしょうか?

まぁ、、でも、、このような使い方をしなければよいのでしょうけど。。。(>_<)!

その他。。
【配置】において、日本語ファイルを追加するとエラーとなりますね。
まぁこれも仕方ないのかな。。。(>_<)


その他2
→こんなのも書かざるを得ませんでした。。。(>_<)
#ifdef __arm__
#define THandle int
#endif



0 件のコメント:

コメントを投稿