Watch, Follow, &
Connect with Us

Welcome, Guest
Guest Settings
Help

Thread: C++Builder10.1 文字化けの対応について



Permlink Replies: 4 - Last Post: Feb 17, 2017 3:32 AM Last Post By: Yojiro Mori Threads: [ Previous | Next ]
朋則 北山

Posts: 22
Registered: 8/14/15
C++Builder10.1 文字化けの対応について
Click to report abuse...   Click to reply to this thread Reply
  Posted: Nov 9, 2016 1:08 AM
C++Builder6で作成されたアプリケーションのC++Builder10.1への移行作業を 行っています。

画面表示時に文字化けが発生しています。

以下に文字列をセットしている箇所のソースを抜き出しました。

//ストリンググリッドを継承してTKmnSGridを定義
class TKmnSGrid : public TStringGrid
{
public:
__fastcall virtual TKmnSGrid(TComponent* AOwner) : TStringGrid(AOwner) {}
virtual void __fastcall WndProc(Messages::TMessage &Message);
};

TKmnSGrid *KmnStringGrid;

// 構造体を定義
static struct
{
char *pszText; //テキスト
UINT uiWidth; //幅
BOOL bTabStop; //タブストップ
} SKmnGridColums[] =
{
{ "No", 40, false },
{ "項目名", 180, false },
{ "から", 170, true },
{ "まで", 170, true },
{ "以外", 56, false },
{ NULL }
};

// 構造体の内容を詰める
for( uiIx = 0; SKmnGridColums[uiIx].pszText; uiIx++ )
{
KmnStringGrid->Cells[uiIx][0] = SKmnGridColums[uiIx].pszText;
KmnStringGrid->ColWidths[uiIx] = SKmnGridColums[uiIx].uiWidth;
KmnStringGrid->TabStops[uiIx] = SKmnGridColums[uiIx].bTabStop;
}



文字化けの修正方法についてご存知であれば
教えていただけないでしょうか。
Hikaru FUKUSHI

Posts: 55
Registered: 11/11/02
Re: C++Builder10.1 文字化けの対応について
Click to report abuse...   Click to reply to this thread Reply
  Posted: Nov 9, 2016 4:31 AM   in response to: 朋則 北山 in response to: 朋則 北山
北山さん、こんばんは。福士です。

画面表示時に文字化けが発生しています。
(略)
文字化けの修正方法についてご存知であれば
教えていただけないでしょうか。

手元でTStringGridを使って試してみましたが、特に文字化けは起きませんでした。

あてずっぽうなのですが、構造体の定義で"char *"を使っていますが、
"wchar_t *"ではないでしょうか(文字列定数もL付きで)。C++Builder 2007および
それ以前のバージョンからC++Builder 2009およびそれ以降のバージョンに移行する
ときは基本的にchar *をTCHAR *やwchar_t *などの型に置き換える必要があると
思います(明確にANSI/ASCIIな文字列へのポインタを除く)。Delphiでは型チェックが
厳しいのでエラーや警告が出ますが、C++は暗黙にいろいろ行われるのできちんと
コードをチェックする必要があると思います。また特に理由がなければ新しいC++
コンパイラを使うよう、プロジェクトオプションのC++コンパイラページの従来の
コンパイラの"従来のBorlandコンパイラを使用"をチェックオフにするといいと
思います(オプションの変更後はクリーンアップでコンパイル済のobjを消して
ください)。これだけでヒントや警告による問題点の指摘は全く違ってきます。

--
東洋テクニカルシステム株式会社 システム開発部 福士 光
Hikaru Fukushi (Toyo Technical System Inc.)
mailto:fukushi@tts-inc.co.jp
朋則 北山

Posts: 22
Registered: 8/14/15
Re: C++Builder10.1 文字化けの対応について
Click to report abuse...   Click to reply to this thread Reply
  Posted: Nov 10, 2016 7:46 PM   in response to: Hikaru FUKUSHI in response to: Hikaru FUKUSHI
福士様

あてずっぽうなのですが、構造体の定義で"char *"を使っていますが、
"wchar_t *"ではないでしょうか(文字列定数もL付きで)。C++Builder 2007および
それ以前のバージョンからC++Builder 2009およびそれ以降のバージョンに移行する
ときは基本的にchar *をTCHAR *やwchar_t *などの型に置き換える必要があると
思います(明確にANSI/ASCIIな文字列へのポインタを除く)。

こちらの対応にて文字化けが解消しました。
ありがとうございました。

Delphiでは型チェックが
厳しいのでエラーや警告が出ますが、C++は暗黙にいろいろ行われるのできちんと
コードをチェックする必要があると思います。また特に理由がなければ新しいC++
コンパイラを使うよう、プロジェクトオプションのC++コンパイラページの従来の
コンパイラの"従来のBorlandコンパイラを使用"をチェックオフにするといいと
思います(オプションの変更後はクリーンアップでコンパイル済のobjを消して
ください)。これだけでヒントや警告による問題点の指摘は全く違ってきます。

"従来のBorlandコンパイラを使用"をチェックオフにしてみたところ
エラーが数多く発生し、その対応に相当時間がかかりそうな雰囲気がありましたので、
一旦チェックはそのままにして作業いたします。
ご指摘ありがとうございました。
Hikaru FUKUSHI

Posts: 55
Registered: 11/11/02
Re: C++Builder10.1 文字化けの対応について
Click to report abuse...   Click to reply to this thread Reply
  Posted: Nov 10, 2016 9:11 PM   in response to: 朋則 北山 in response to: 朋則 北山
北山さん、こんにちは。福士です。

"従来のBorlandコンパイラを使用"をチェックオフにしてみたところ
エラーが数多く発生し、その対応に相当時間がかかりそうな雰囲気がありましたので、
一旦チェックはそのままにして作業いたします。

いえ、違うのです。新しいコンパイラで指摘されている部分はその多くが不具合が
存在していたり、潜在的に問題があるものだったりするので、最初からこれを解決
していくことで最終的により早く、より不具合の少ないものができるのです。
『とりあえず』で作業すると、後で問題があったとき結局その部分をやり直すことに
なってしまいます。

# 特にC++は暗黙のナントカが多すぎて、コンパイルは通っても不適切なコードだったり
# するので、エラーメッセージの親切さで定評のある[要出典]Clang+LLVMベースの
# 新しいC++コンパイラが文句をいわないコードにすることには意味があると思います。

--
東洋テクニカルシステム株式会社 システム開発部 福士 光
Hikaru Fukushi (Toyo Technical System Inc.)
mailto:fukushi@tts-inc.co.jp
Yojiro Mori

Posts: 3
Registered: 3/1/03
Re: C++Builder10.1 文字化けの対応について
Click to report abuse...   Click to reply to this thread Reply
  Posted: Feb 17, 2017 3:32 AM   in response to: Hikaru FUKUSHI in response to: Hikaru FUKUSHI
char *をTCHAR *に、文字列リテラルを"***"からTEXT("***")に変えれば古いコンパイラから新しいコンパイラにそのまま移植できるかも?
Legend
Helpful Answer (5 pts)
Correct Answer (10 pts)

Server Response from: ETNAJIVE02