Delphi 2010でUnicodeプログラムを作成するにはどうすればよいですか?
私は英語のウィンドウを持っており、「非Unicodeプログラムの現在の言語」も英語です。静的コントロールは見栄えがしますが、変更しようとすると(Label.Caption:='unicode value'またはMemo.LoadFromFile(textFilename))、テキストは次のようになります:$ ^ $&%*(#&#。
それを修正する方法は?
Delphi 2010でUnicodeプログラムを作成するにはどうすればよいですか?
私は英語のウィンドウを持っており、「非Unicodeプログラムの現在の言語」も英語です。静的コントロールは見栄えがしますが、変更しようとすると(Label.Caption:='unicode value'またはMemo.LoadFromFile(textFilename))、テキストは次のようになります:$ ^ $&%*(#&#。
それを修正する方法は?
スタックオーバーフローへようこそ。このような問題が発生した場合は、コードを投稿してください。あなたが見ているような問題の最も可能性の高い原因を説明しますが、コードを投稿しない場合は修正できません. また、質問のほとんどすべてを推測するように依頼されたため、多くの仮定を立てる必要があります。これが、質問が閉じられた理由です。今後、詳細をお知らせいただければ、非公開の質問を避けることができます。
先に進むためのデータがあまり与えられていないため、多くのことを想定させてください.
以前に Delphi を使用したことがあり、String、Char などの基本的な型名について知っているとします。
Delphi 2007 (char=Ansichar/string=Ansistring) と Delphi 2009 以降 (Delphi 2010 および XE を含む) の Unicode の違いに気付いていないかもしれません。ここで、Char=UnicodeChar、String=UnicodeString です。
ガベージが表示される最も一般的な理由 (質問では として表されますthe text looks like $^$&%*(#&#."
) は、バイト サイズの AnsiCharacter データを直接操作し、間違った方法で UnicodeString に変換しようとした場合です。
MJN は、あなたのコメントの 1 つから、UTF8 ファイルとして保存されていない Unicode 文字を含むソース コードにも問題があることに気付きました... ソース ファイルに Unicode 文字を入れようとすると、Delphi は自動的にこの質問をします。 、あなたも見ていると思いますが、正しく答えてください(正解は「はい」です)...しかし、あなたの質問ではこれについてまったく言及されていません。問題の原因を特定するために質問を更新してみてください。
これは右クリックのファイル形式メニューで、いつでもエンコーディングを変更できます。推奨される値は、ここに示すように UTF8 です。
間違った文字列値を生成する影響を受けるコードを投稿する必要があります。Unicode Delphi に移植しようとしている巨大なアプリケーションから始めるのではなく (これは、私がここで行っている 4 番目で最大の仮定です)、小さなサンプル コードから始めるべきです。
これは、各文字のサイズが 1 バイトであるため、たまたま Delphi 7 でも機能する「不適切に記述されたコード」の例ですが、この仮定は 2009 および XE Delphi までは適用されません。
procedure Tform1.TestBad;
var
x:PAnsiChar;
s:String;
begin
x := 'test';
s := Copy(PChar(x),1,10);
Self.Caption := s;
end;
これは、同じ不自然なサンプル コードを「修正」したものであり (意図的に壊れていないようなものです)、少なくとも Delphi XE で動作します。
procedure Tform1.TestLessBad;
var
x:PAnsiChar;
s:String;
begin
x := 'test';
s := Copy(x,1,10);
Self.Caption := s;
end;
上記のポインターの使用は、この例で教えようとしていることを除いて、不自然で不必要です。
最初の例では、「テスト」というテキストを表示する代わりに、フォームのキャプションに Unicode の漢字を作成します。これは、2 バイトが 1 つの文字になっているためです。これは、あなたが話すこのノイズを生成する簡単な方法を 1 つ示すために意図的に悪いことをしたためです。私のコードで間違いを犯すことによって。
特定の Unicode コードポイントに問題がある場合は、次の表記法を試すことをお勧めします。
c := Char($21CC); // this is U+21CC (cool two arrows thingy used in chemistry to indicate a reversible reaction)
または、これが表示されますが、これはほとんど同じことです。
c := #$21CC; // U+21CC
この方法で記述したものを保存するために、UTF8 でエンコードされたファイルが必要ないことに注意してください。
コメント
Unicode DelphiがUTF-8に保存されないのはなぜですか?
と
Delphi 2010はUTF-8ではなくプロジェクトを保存しました。私はUTF-8に変換し、すべてが機能し始めました。
Delphiプロジェクト(dprおよび/またはpas)のソースコードファイルのエンコーディングに関連しているようです。たとえば、ANSIに設定されている場合、現在のコードページに属していない文字が正しく保存されない可能性があります。
IDE(少なくともDelphi 2009では)は、ファイル形式がANSIに設定された新しいユニットを作成します。混合言語のソースコードの場合、UTF-8(またはUCSフレーバーの1つ)は、テキストエディターのコンテキストメニュー([ファイル形式] | [UTF8])を使用して手動でアクティブ化する必要があります。
IDE(Delphi 2009)にも、デフォルトのテキスト形式をANSI以外に設定するオプションがないようです。(Delphi IDEのデフォルトのファイル形式をUTF8に設定するにはどうすればよいですか?を参照してください) 。
簡単な答え:
ソースコードのファイル形式をUTF-8に設定します。
(Delphi 2009 IDEはデフォルトでUnicodeを使用しません。これは、Delphi 2010でも同じだと思います)
古い Delphi バージョンからプロジェクトを移行した場合は、ダイアログで使用されているフォントを確認してください。すべてのフォントがすべての Unicode 文字をサポートしているわけではありません。
明らかにあなたと似た問題がありました。デバッガーでは正しい Unicode 文字列がありましたが、アプリケーションでは特殊文字の一部が黒い四角として表示されました。これは、Delphi 6 から移行された古いプログラムで、一部のキャプションがコードで設定されていました。新しいフォームでは、すべて問題ありませんでした (ここでは、キャプションはダイアログ エディターで設定されていますが、これは実際には関係ありません)。
問題は、移行されたすべてのフォームのフォントでした。Delphi 6 では、フォントとして「MS Sans Serif」を使用していました。しかし、このフォントにはほとんどの Unicode 文字がありません。「Tahoma」に切り替えると、問題が解決しました。