6

私のアプリは Delphi 7 で書かれた非 Unicode アプリです。

この関数を使用して、Unicode 文字列を ANSI に変換したいと思います。

function convertU(ws : widestring) : string;
begin
  result := string(ws);
end;

このコードも使用して、変換する正しいコードページを設定します。

initialization
  SetThreadLocale(GetSystemDefaultLCID);
  GetFormatSettings;

VCL のメイン スレッドではうまく機能しますが、TThread では機能しません関数convertUの結果として。

TThread ではないのはなぜですか?

4

2 に答える 2

6

AFAIKSetThreadLocaleは現在のシステム コード ページを変更しないため、API 呼び出し、つまりシステム コード ページに依存する Delphi 7 でのwidestringto変換には影響しません。ansistringGetACP

システムのコード ページは、たとえば Windows Seven のコントロール パネルで設定し、[地域の言語] / [管理] タブ / 非 Unicode アプリケーションのコード ページで設定します。これには、システムの再起動が必要です。

Delphi 7 は、このシステム コード ページを使用して、すべての変換 API 呼び出しに 0 を提供します。そのため、 AFAIRは Delphi 7 のto変換にSetThreadLocaleは影響しません。システムが Ansi <-> Unicode 変換に使用するコード ページではなく、ロケール (日付/時刻や通貨の形式など) を変更します。widestringansistring

新しいバージョンの Delphi には、すべての処理SetMultiByteConversionCodePage()に使用するコード ページを設定できる機能があります。AnsiString

ただし、API 呼び出し(つまり、Delphi 7 でマップされるWindows.pas....A()のすべての関数)は、このシステム コード ページを使用します。したがって、別のコード ページを処理する場合は、Unicode への変換後にワイド API を呼び出す必要があります。つまり、Delphi 7 VCL は、 で指定された値ではなく、システム コード ページでのみ機能します。...()...W()SetThreadLocale

Delphi 7 での私のアドバイスは次のとおりです。

  • どこでも使用WideStringでき、特定の「ワイド」API 呼び出し - を処理する Delphi 7 用のコンポーネント セットがいくつかありWideStringます。
  • 専用の文字セットを使用して独自の型を使用しますが、VCL/RTL または「 MyString = type AnsiStringAnsi 」API 呼び出しを使用する前に明示的な変換が必要になります。RawUTF88 プロセス)。

AnsiStringDelphi 2009 以降では、すべての型にコード ページを指定し、API 呼び出しまたは VCL プロセスのために Unicode との間の変換を適切に処理できるため、これははるかに適切に処理されます。

于 2012-09-09T12:15:41.920 に答える
5

ブロックSetThreadLocale()内で呼び出しても、 には影響しません。スレッドのロケールを設定したい場合は、メソッド内で呼び出す必要があります。initializationTThreadSetThreadLocale()TThread.Execute()

より良いオプションは、まったく依存しないことSetThreadLocale()です。直接呼び出して独自の変換をWideCharToMultiByte()行い、変換先の特定の Ansi コードページを指定できるようにします。

于 2012-09-09T07:31:17.703 に答える