「ターゲットのマルチバイトコードページにUnicode文字のマッピングが存在しない」原因は何ですか?

InTheNameOfScience

を示すバグレポートがありEEncodingErrorます。ログはを指しますTFile.AppendAllText私が呼ぶのTFile.AppendAllText私のこの手順です:

procedure WriteToFile(CONST FileName: string; CONST uString: string; CONST WriteOp: WriteOpperation; ForceFolder: Boolean= FALSE);     // Works with UNC paths
begin
 if NOT ForceFolder
 OR (ForceFolder AND ForceDirectoriesMsg(ExtractFilePath(FileName))) then
   if WriteOp= (woOverwrite)
   then IOUtils.TFile.WriteAllText (FileName, uString)
   else IOUtils.TFile.AppendAllText(FileName, uString);
end;

これはEurekaLogからの情報です。

ここに画像の説明を入力してください

ここに画像の説明を入力してください

これを引き起こす原因は何ですか?

デビッド・ヘファーナン

このプログラムは、報告したエラーを再現します。

{$APPTYPE CONSOLE}

uses
  System.SysUtils, System.IOUtils;

var
  FileName: string;

begin
  try
    FileName := TPath.GetTempFileName;
    TFile.WriteAllText(FileName, 'é', TEncoding.ANSI);
    TFile.AppendAllText(FileName, 'é');
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

ここでは、元のファイルをANSIとして記述しています。そして、AppendAllTextUTF-8として書き込もうとする呼び出し何が起こるかというと、この関数になってしまいます。

class procedure TFile.AppendAllText(const Path, Contents: string);
var
  LFileStream: TFileStream;
  LFileEncoding: TEncoding; // encoding of the file
  Buff: TBytes;
  Preamble: TBytes;
  UTFStr: TBytes;
  UTF8Str: TBytes;
begin
  CheckAppendAllTextParameters(Path, nil, False);

  LFileStream := nil;
  try
    try
      LFileStream := DoCreateOpenFile(Path);
      // detect the file encoding
      LFileEncoding := GetEncoding(LFileStream);

      // file is written is ASCII (default ANSI code page)
      if LFileEncoding = TEncoding.ANSI then
      begin
        // Contents can be represented as ASCII;
        // append the contents in ASCII

        UTFStr := TEncoding.ANSI.GetBytes(Contents);
        UTF8Str := TEncoding.UTF8.GetBytes(Contents);

        if TEncoding.UTF8.GetString(UTFStr) = TEncoding.UTF8.GetString(UTF8Str) then
        begin
          LFileStream.Seek(0, TSeekOrigin.soEnd);
          Buff := TEncoding.ANSI.GetBytes(Contents);
        end
        // Contents can be represented only in UTF-8;
        // convert file and Contents encodings to UTF-8
        else
        begin
          // convert file contents to UTF-8
          LFileStream.Seek(0, TSeekOrigin.soBeginning);
          SetLength(Buff, LFileStream.Size);
          LFileStream.ReadBuffer(Buff, Length(Buff));
          Buff := TEncoding.Convert(LFileEncoding, TEncoding.UTF8, Buff);

          // prepare the stream to rewrite the converted file contents
          LFileStream.Size := Length(Buff);
          LFileStream.Seek(0, TSeekOrigin.soBeginning);
          Preamble := TEncoding.UTF8.GetPreamble;
          LFileStream.WriteBuffer(Preamble, Length(Preamble));
          LFileStream.WriteBuffer(Buff, Length(Buff));

          // convert Contents in UTF-8
          Buff := TEncoding.UTF8.GetBytes(Contents);
        end;
      end
      // file is written either in UTF-8 or Unicode (BE or LE);
      // append Contents encoded in UTF-8 to the file
      else
      begin
        LFileStream.Seek(0, TSeekOrigin.soEnd);
        Buff := TEncoding.UTF8.GetBytes(Contents);
      end;

      // write Contents to the stream
      LFileStream.WriteBuffer(Buff, Length(Buff));
    except
      on E: EFileStreamError do
        raise EInOutError.Create(E.Message);
    end;
  finally
    LFileStream.Free;
  end;
end;

エラーは次の行に起因します。

if TEncoding.UTF8.GetString(UTFStr) = TEncoding.UTF8.GetString(UTF8Str) then

問題は、それUTFStrが実際には有効はないということですUTF-8したがってTEncoding.UTF8.GetString(UTFStr)、例外をスローします。

これはの欠陥ですTFile.AppendAllBytesそれは完全によく知っていることを考えるとUTFStrされANSI、それがコールするためにエンコードされ、それは全く意味がありませんTEncoding.UTF8.GetString

Delphi 10 Seattleにまだ存在するこの欠陥については、Embarcaderoにバグレポートを提出する必要があります。それまでの間、を使用しないでくださいTFile.AppendAllBytes

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Delphi10.1ターゲットのマルチバイトコードページにUnicode文字のマッピングが存在しません

分類Dev

delphixe6ターゲットのマルチバイトコードページにUnicode文字のマッピングが存在しません

分類Dev

ターゲットのマルチバイトコードページにUnicode文字のマッピングがありません:MemoryStreamを文字列に変換する方法

分類Dev

Robocopy | 新しいバージョンが原因で、データバックアップバッチが機能しなくなったのはなぜですか?マイクロソフトは何をしましたか?

分類Dev

ファイルがターゲットディレクトリに存在しない場合にのみ、無限に実行されるバッチファイルにファイルをコピーするにはどうすればよいですか?

分類Dev

私のコードの何が問題になっていますか。反応ネイティブのマルチパートでサーバーにデータを送信またはアップロードしない

分類Dev

チェックボックスへのXAML-WPFマルチバインディングが失敗する原因となるハードウェア/プラットフォームの違いは何ですか?

分類Dev

このコードがマルチバイト文字セットを使用してVisualStudioで完全に実行されるのに、ユニコード文字セットを使用しないのはなぜですか?

分類Dev

QEMUはゲストOSのカーネルページをどこにマッピングしますか?

分類Dev

マルチターゲットクラスライブラリを参照しながら、NuGetにパッケージの特定のバージョンを認識させるにはどうすればよいですか?

分類Dev

tmuxのターゲットペイン/ウィンドウのフォーマットは何ですか?

分類Dev

StringFormatを使用したマルチバインディング-内部コンバーターにtargetType ==オブジェクトがあるのはなぜですか?

分類Dev

mp3ファイルをAmazonAlexa SSMLに必要なコーデックバージョン(MPEGバージョン2)とビットレート(48 kbps)に変換するための正しいコマンドは何ですか?

分類Dev

パターンマッチング(x:_):リストヘッドがxにバインドされているのはなぜですか?

分類Dev

`parseInt`ポイントフリースタイルのマッピングが期待どおりに機能しないのはなぜですか?

分類Dev

Javaネットワーキング、マルチスレッドサーバーの何が問題になっているのか理解できない

分類Dev

Scalaマッチ式のコンストラクターパターンと可変バインディングパターンの違いは何ですか?

分類Dev

オブジェクト内のすべてのフィールドが存在するかどうかが不明なときに、オブジェクト配列を介してマッピングするにはどうすればよいですか?

分類Dev

Windowsサービスは、Unicodeとしての文字セットで正常に動作していますが、マルチバイトの同じコードが1053エラーで失敗し始めています

分類Dev

画像ピッカーページのナビゲーションバーのタイトルを変更するにはどうすればよいですか?

分類Dev

Windowsの「マイコンピュータ」のアドレスターゲットは何ですか?カスタムショートカットを作成するにはどうすればよいですか?

分類Dev

「バット」と「マイター」を使用しているにもかかわらず、ラケットペンが2本の線が結合する余分なピクセルを描画するのはなぜですか?

分類Dev

マルチモジュールMavenプロジェクトで1つのターゲットフォルダーから別のターゲットフォルダーにファイルをコピーします

分類Dev

ターゲットマシンにPythonバージョンが存在しない場合に、Ansibleを介してPythonをインストールする

分類Dev

Angular Materialテーブルマット-ページネーターのページサイズが機能しないのはなぜですか?

分類Dev

VStudioは、Unoプラットフォームソリューションでのビルドに指定されているヘッドに関係なく、参照されているマルチターゲットプロジェクトのすべてのTargetFrameworksを常にコンパイルします。

分類Dev

ファイルのリストをgrepコマンドからターゲットディレクトリにコピーしています

分類Dev

アマゾンインスペクターvsトラストアドバイザーvsクラウドウォッチvsパーソナルヘルスダッシュボードvsAWSクラウドトレイルの違いは何ですか?

分類Dev

reactのテーブルコンポーネントで機能しないオブジェクトの配列のマッピングがなぜですか?

Related 関連記事

  1. 1

    Delphi10.1ターゲットのマルチバイトコードページにUnicode文字のマッピングが存在しません

  2. 2

    delphixe6ターゲットのマルチバイトコードページにUnicode文字のマッピングが存在しません

  3. 3

    ターゲットのマルチバイトコードページにUnicode文字のマッピングがありません:MemoryStreamを文字列に変換する方法

  4. 4

    Robocopy | 新しいバージョンが原因で、データバックアップバッチが機能しなくなったのはなぜですか?マイクロソフトは何をしましたか?

  5. 5

    ファイルがターゲットディレクトリに存在しない場合にのみ、無限に実行されるバッチファイルにファイルをコピーするにはどうすればよいですか?

  6. 6

    私のコードの何が問題になっていますか。反応ネイティブのマルチパートでサーバーにデータを送信またはアップロードしない

  7. 7

    チェックボックスへのXAML-WPFマルチバインディングが失敗する原因となるハードウェア/プラットフォームの違いは何ですか?

  8. 8

    このコードがマルチバイト文字セットを使用してVisualStudioで完全に実行されるのに、ユニコード文字セットを使用しないのはなぜですか?

  9. 9

    QEMUはゲストOSのカーネルページをどこにマッピングしますか?

  10. 10

    マルチターゲットクラスライブラリを参照しながら、NuGetにパッケージの特定のバージョンを認識させるにはどうすればよいですか?

  11. 11

    tmuxのターゲットペイン/ウィンドウのフォーマットは何ですか?

  12. 12

    StringFormatを使用したマルチバインディング-内部コンバーターにtargetType ==オブジェクトがあるのはなぜですか?

  13. 13

    mp3ファイルをAmazonAlexa SSMLに必要なコーデックバージョン(MPEGバージョン2)とビットレート(48 kbps)に変換するための正しいコマンドは何ですか?

  14. 14

    パターンマッチング(x:_):リストヘッドがxにバインドされているのはなぜですか?

  15. 15

    `parseInt`ポイントフリースタイルのマッピングが期待どおりに機能しないのはなぜですか?

  16. 16

    Javaネットワーキング、マルチスレッドサーバーの何が問題になっているのか理解できない

  17. 17

    Scalaマッチ式のコンストラクターパターンと可変バインディングパターンの違いは何ですか?

  18. 18

    オブジェクト内のすべてのフィールドが存在するかどうかが不明なときに、オブジェクト配列を介してマッピングするにはどうすればよいですか?

  19. 19

    Windowsサービスは、Unicodeとしての文字セットで正常に動作していますが、マルチバイトの同じコードが1053エラーで失敗し始めています

  20. 20

    画像ピッカーページのナビゲーションバーのタイトルを変更するにはどうすればよいですか?

  21. 21

    Windowsの「マイコンピュータ」のアドレスターゲットは何ですか?カスタムショートカットを作成するにはどうすればよいですか?

  22. 22

    「バット」と「マイター」を使用しているにもかかわらず、ラケットペンが2本の線が結合する余分なピクセルを描画するのはなぜですか?

  23. 23

    マルチモジュールMavenプロジェクトで1つのターゲットフォルダーから別のターゲットフォルダーにファイルをコピーします

  24. 24

    ターゲットマシンにPythonバージョンが存在しない場合に、Ansibleを介してPythonをインストールする

  25. 25

    Angular Materialテーブルマット-ページネーターのページサイズが機能しないのはなぜですか?

  26. 26

    VStudioは、Unoプラットフォームソリューションでのビルドに指定されているヘッドに関係なく、参照されているマルチターゲットプロジェクトのすべてのTargetFrameworksを常にコンパイルします。

  27. 27

    ファイルのリストをgrepコマンドからターゲットディレクトリにコピーしています

  28. 28

    アマゾンインスペクターvsトラストアドバイザーvsクラウドウォッチvsパーソナルヘルスダッシュボードvsAWSクラウドトレイルの違いは何ですか?

  29. 29

    reactのテーブルコンポーネントで機能しないオブジェクトの配列のマッピングがなぜですか?

ホットタグ

アーカイブ