10

古い (2003 年以降の) Delphi コードを Delphi Architect XE にアップグレードしていますが、いくつかの問題が発生しています。互換性のない型がある場合、多くのエラーが発生します。これらのエラーは Delphi 6 では発生しないため、アップグレードが行われたことが原因であると想定する必要があります。

正直なところ、PAnsiChar と PWideChar の違いはわかりませんが、Delphi はその違いを認識しており、コンパイルを許可しません。違いが何であるかを知っていれば、どちらを使用するか、またはこれを修正する方法を理解できるかもしれません.

4

2 に答える 2

19

要するに、Delphi 2009 より前の Delphi のネイティブ文字列型は ANSI CHAR でした。すべての文字列の各文字は 8 ビット文字として表されていました。Delphi 2009 以降、Delphi の文字列は UTF-16 表記を使用する UNICODE になりました。現在、基本的な Char は 16 ビットのデータ (2 バイト) を使用しており、おそらく 2 つとして表される Unicode コード ポイントについて多くを知る必要はありません。連続する 16 ビット文字。

8 ビット文字は「Ansi Char」と呼ばれます。PAnsiChar は、8 ビット文字へのポインターです。16 ビット文字は「ワイド文字」と呼ばれます。PWideChar は、16 ビット文字へのポインターです。Delphi はその違いを認識しており、2 つを混在させることができない場合でもうまく機能します。

より詳しい情報

Unicode に関する一般的なリンクは次のとおりです。すべてのソフトウェア開発者が絶対に、積極的に Unicode と文字セットについて知っておく必要がある絶対最小値

Delphi から Unicode への移行に関する詳細については、こちらを参照してください。新しいホワイト ペーパー: 一般ユーザー向けの Delphi Unicode 移行

SO で「Delphi Unicode migration」を検索することもできます。

于 2011-02-09T00:09:17.047 に答える
10

数年前、Delphi のデフォルトの文字型がAnsiChar(ANSI 文字を表す 1 バイト変数) からWideChar(UTF16 文字を表す 2 バイト変数) に変更されました。型はではなくへcharのエイリアスになりました。の代わりに(Delphi の伝統的な文字列型の UTF-16 Unicode バージョン)へのエイリアスであり、型はではなくへのエイリアスになりました。WideCharAnsiCharstringUnicodeStringAnsiStringPCharPWideCharPAnsiChar

コンパイラは多くの変換自体を処理できますが、いくつかの問題があります。

  1. などの文字列ポインター型を使用している場合はPChar、ポインターが正しい型のデータを指していることを確認する必要があり、コンパイラーは常にこれを確認できるとは限りません。
  2. 文字列をvarパラメーターに渡す場合、変数の型はまったく同じである必要があります。2 つの文字列型を処理する必要があるため、これはより複雑になる可能性があります。
  3. stringテキストを保持する変数の代わりに、任意のデータを保持するための便利なバイト配列バッファーとして使用している場合、 UnicodeString. それらが回避策として宣言されていることを確認しRawByteStringてください。
  4. 文字列のバイト長を扱う場合、たとえば TStream との間で読み取りまたは書き込みを行う場合、コードで acharが 1 バイト長であると想定していないことを確認してください。

Delphi Unicode Migration for Mere Mortalsを参照して、これを機能させる方法に関するその他のトリックとアドバイスを確認してください。思ったほど難しくはありませんが、簡単でもありません。幸運を!

于 2011-02-09T00:07:34.913 に答える