お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"Unicode & Null文字対策"






TMemo, TRichEdit, TEditorなどで Lines.LoadFromFileメソッドでファイルを開く
場合にぶち当たる次の問題を解決する手続きです。
 ・Unicodeのテキストが文字化けする。
 ・Null文字(#0)が含まれているテキストがちょんぎれる。

以下の過去ログを参考にさせていただきました。
単に2つくっつけただけとも言えます・・(笑)

  Unicode対策   nifty:FDELPHI/MES/10/7443  清明さん
  Null文字対策  nifty:FDELPHI/MES/6/28626  Satobeさん

-----------------------------------------------------------

procedure ReadTextByStream(Fn: string; mLines: TStrings);
var
  S: string;
  W: WideString;
  MS: TMemoryStream;
  P: PChar;
  j: Integer;
begin
  mLines.Clear;
  MS := TMemoryStream.Create;
  try
    MS.LoadFromFile(Fn);
    SetLength(S, 2);
    // Unicode対策
    if MS.Size > 2 then       // これがないとEReadError例外になる場合がある。
      MS.ReadBuffer(S[1], 2); // Streamから2バイトをバッファーに読み込み
      if S = #$FF#$FE then    // 内容がFFFEであればUnicodeと判定する
      begin
        MS.Position := 2;     // 3バイト目以降をバッファーへ
        SetLength(W, (MS.Size - 2) div 2);
        MS.ReadBuffer(W[1], MS.Size - 2);
        mLines.Text := W;     // バッファーから文字列リストへ
        Exit;
      end;
    // Null文字対策
    MS.Position:= 0;
    P := MS.Memory;
    for j:=0 to MS.Size-1 do
    begin
      if P^ = #0 then P^ := ' ';  // Nullを見つけたらSpaceに置き換える
      inc(P);                     // Pointerを1文字分進める
    end;
    mLines.LoadFromStream(MS);    // Streamから文字列リストへ
  finally
    MS.Free;
  end;
end;


<使い方の例>
  ReadTextByStream(Memo1.Lines);


                  http://member.nifty.ne.jp/h-triton/
         ○ 快速・大容量テキストエディタ えるの〜と Ver 2.4公開中 ○
 


Original document by H-Triton        氏 ID:(QZV11422)


ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum