ファイルに有効な UTF-8 BOM があるが、無効な UTF8 エンコーディングが含まれていて、Delphi (2009+) エンコーディング対応メソッドのいずれかによって読み取られる場合LoadFromFile
、結果はエラー表示のない完全に空のファイル。私のアプリケーションのいくつかでは、この場合もエラー レポートが得られなくても、いくつかの不正なエンコーディングを単純に失うことを好みます。
デバッグにより、 が 2 回呼び出されていることがわかりMultiByteToWideChar
ます。最初に出力バッファー サイズを取得し、次に変換を行います。FMBToWCharFlags
ただし、TEncoding.UTF8 にはこれらの呼び出しのプライベート値が含まれており、これはMB_ERR_INVALID_CHARS
値で初期化されます。そのため、charcount を取得する呼び出しは 0 を返し、ロードされたファイルは完全に空になります。フラグなしでこの API を呼び出すと、「不正なコード ポイントが黙ってドロップされます」。
私の質問は、これがプライベートな値であるという事実を回避するために、エンコーディング領域のクラスのネストをどのように織り込むのが最善かということです (すべてのスレッドのクラス var であるため、そうする必要があります)。Marco Cantu の Delphi 2009 book のガイダンスを使用して、カスタム UTF8 エンコーディングを追加できると思います。MultiByteToWideChar
また、フラグなしで再度呼び出した後、エンコーディング エラーが返された場合は、オプションで例外を発生させることができます。しかし、それは私のカスタムエンコーディングを の代わりに使用する方法の問題を解決しませんTencoding.UTF8
。
初期化時にこれをアプリケーションのデフォルトとして設定できれば、おそらくクラス var for を実際に変更して、Tencoding.UFT8
おそらくこれで十分でしょう。
もちろん、より堅牢な設計を要求する QC レポートを提出するのを待たずに解決策が必要であり、それが受け入れられ、変更が加えられることはありません。
どんなアイデアでも大歓迎です。また、これがまだインストールしていない XE4 の問題であることを確認できますか?