2009-09-09 6 views
7

大規模なレガシーアプリケーションをDelphi 2009に変換する必要があります。Delphi 2009では、文字列、AnsiStrings、WideStrings、UTF8データを使用しています。新しい文字列型の仕組みや使い方を理解するのは難しいです。Delphi 2009/2010で新しい文字列型はどのように機能しますか?

アプリケーションはTntUnicodeControlsを使用して完全にUnicodeをサポートしています。特定のエンコーディング(ほとんどはUTF8とUTF16)の文字列を必要とするサードパーティのDLLがあり、変換タスクは疑わしいほど簡単ではありません。

私は特に、C DLLの呼び出しと正しいタイプの選択に問題があります。 また、Delphiの文字列がどのようにエンコードされていても、DLLの1つが常にUTF-8でエンコードされた文字列を受け取っているように見えるため、暗黙の文字列変換が多数発生しているという印象を受けます。

新しいDelphi 2009の文字列型UnicodeStringとRawByteStringについての簡単な概要を提供してください。おそらく、2009年以前のアプリケーションを変換する際の使用上のヒントや潜在的な落とし穴がありますか?

+0

CodeRage 4のリプレイがオンラインになりました。 http://www.delphifeeds.com/go/s/60421およびhttp://conferences.embarcadero.com/coderage/sessions –

答えて

8

私のCodeRage 4「このプログラムでは、Unicodeと他のエンコーディングを使用しています」というこの講演を見るか、オンラインで再生ができるまで待ちます。

いくつかのエンコーディングについて説明し、文字列形式について説明します。

スライドはすぐに利用できるようになります(私は今日オンラインでそれらを入手しようとします)、あなたはインターネット上で読んでみたいものについてたくさんの参考文献を含みます(しかし、私はJoel on Unicodeへのリンクを忘れてしまったことを認めなければならないeed3si9n投稿されました)。

アップロードとリンクでこの回答を編集します。


編集:

あなたがあなたのC/C++ DLLは、UTF8はエンコードされた文字列を受け取ることを示しているが、彼らはそれ以外の場合は、符号化されなければならないと思ったことができ、少量のサンプルを持っている場合は、それを投稿してください(メール私は、特にあなたがアットマークの前に自分の名前を使用している場合は、私は、pluimersドットコムのほとんど何でも私に取得します。

セッションの資料は、「プログラムでのUnicodeとその他のエンコーディングの使用」セッションを含むdownloadedになります。

これらは、そのセッションからのリンクです:

  1. マルコ・カントゥ、ホワイトペーパー「Delphi and Unicode
  2. マルコ・カントゥ、プレゼンテーション「Delphi and Unicode
  3. ニック・ホッジス、ホワイトペーパー「Delphi in a Unicode World

    これらを読みます"

関連のオンラインヘルプトピック:

  1. What's New in Delphi and C++Builder 2009
  2. 文字列タイプ:Base: ShortString, AnsiString, WideString, UnicodeString
  3. 文字列タイプ:Unicode (including internal memory layouts of the string types)
  4. 文字列タイプ:Enabling for Unicode
  5. 文字列タイプ:RawByteString (AnsiString with CodePage $ffff)
  6. 文字列タイプ:UTF8String (AnsiString with CodePage 65001)
  7. 文字列< - > PChar型の変換:PChar fundamentals
  8. 文字列< - > PChar型の変換:< Returning a PChar Local Variable
  9. 文字列 - > PChar型の変換:これはあなたが行くの取得Passing a Local Variable as a PChar

希望。そうでない場合は、私にメールしてください。ここで答えを広げようとします。

+0

ユニコードはエンコーディングではなく、(Wikipediaを引用して) "Unicodeは異なる文字エンコーディングで実装できる"と考えれば、奇妙なタイトルです。 – mghie

+0

英語以外のネイティブスピーカーとして、タイトルを正しくカバーしていない短いタイトルを思いつくことができませんでした。あなたが持っている場合:私に知らせてください。私はタイトルを変更してうれしいだろう。 –

+0

私はネイティブスピーカーでもありませんが、そのままのタイトルには誤った記述が含まれていると思います。とにかにUnicodeについての誤解が多すぎるため、残念です。 "Unicodeを使用し、エンコーディングを選択する..."がより正確になります。私はあなたの話を知らないので、それはより良いタイトルかどうかわかりません。 – mghie

11

Delphi and Unicode、マルコカンタウの白書を参照してください。私は The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)、Joelによって書かれています。

たとえば、ShellExecuteAのように、A(ANSI)バージョンの代わりにW(ワイド文字列)バージョンを使用するようにデフォルトのWin32 API呼び出しがマップされているということです。コードが内部レイアウトAnsiString 、それは壊れます。代わりに、PCharPAnsiChar,CharAnsiChar,stringAnsiStringに置き換えて、その部分のWin32 API呼び出しの最後にAを付けることをお勧めします。コードが実際にコンパイルされて正常に実行された後、stringUnicodeString)を使用するようにコードをリファクタリングすることができます。

+0

+1の素晴らしいリンクをご覧ください。どちらも非常に興味深い読み物です。 – jpfollenius

+0

私は[C++ Builder 2007アプリケーションのアップグレードについて]同様の質問をしました(http://stackoverflow.com/questions/1392409/what-do-i-need-to-know-to-upgrade-a-complex-アプリケーションからcbuilder-2007-to-2)そのすべてが適用されるわけではありませんが、人々が与えたリンクや回答の中には役に立つものがあります。 –

0

実際の文字列コードにヒットするだけではないことに注意してください。また、PCHARを使用してバッファをトラップしたり、APIとのインタフェースをとるコードをヒットします。

など。 DLLを動的にロードするヘッダーの初期化コード(getprocedureaddress/loadlibray)

0

ほとんどすべての私の問題は、割り当て時の自動変換によってUTF8Stringになったようです。

UTF8Stringを使用している古いコードは、変数に含める文字列の種類を判断するのに役立ちます。

ポートに自分のアプリケーションを起動し、私は同じ理由UTF8StringAnsiStringを交換しますが、コードは、前提は、もはや自動変換と今(クラシック)AnsiString

にだけエイリアスであることUTF8Stringに依存していましたそれは多くの問題を引き起こしました。

2009年以前のDelphiコードから移植するときにUTF8Stringを使用する場合は注意してください!

0

異なるバージョンのDelphiまたはC++ Builderで構築されたDLL間で文字列を渡すときに注意すべきことは、2009年からAnsiStringBaseのStrRec部分が2つの余分なフィールドを取得したことです。 codePageとelemSizeです。これらはそれぞれ2バイト(short ints)なので、StrRecのサイズは8バイトではなく12バイトになりました。これは、たとえ文字列のデータ部分が正常に転送されたように見える場合であっても、メモリの割り当てと破棄に関する無効なポインタ例外の問題を引き起こす可能性があります。

関連する問題