表題の件、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 件のコメント:
コメントを投稿