|
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
|