2017/8/18 (金) 11:58:07 おかぽん |
▼ Mr.XRAYさん
> おかぽんさん仕事早いですね.
仕事じゃないから早い・・・おっと、これ以上は言えない
せっかくなので Harryさん の UTF8MojibakeFix を某掲示板仕様に修正したので置いていきます。
各投稿間には、必ず横線(<HR> タグ)があるので、このタグがあれば、そこから
127バイト先読みして、文字化け対策が必要か確認しています(関数内関数doFixCheck)。
確認は、投稿日時が "(" + 曜日 であるため、"(" に続けて修正文字 $C2 があれば、
次の横線までの範囲を修正区間として処理。
これにより、正常な投稿の文字化けを回避します。
function UTF8MojibakeFix2(const aStr: AnsiString): AnsiString;
//UTF8修正が必要であるか
//127文字分先読みして、文字化けしているか調査する
function doFixCheck(aPStr: PAnsiChar; aMax: Integer): Boolean;
const
MAX_SEARCH_SIZE = 127;
var
fInnK, idx, nMax: Integer;
begin
Result := False;
fInnK := 0;
if aMax < MAX_SEARCH_SIZE then nMax := aMax else nMax := MAX_SEARCH_SIZE;
for idx := 0 to nMax do begin
case aPStr^ of
#$28: fInnK := 1; //(
#$C2: begin
if fInnK = 1 then begin
Result := True;
Break;
end;
end
else fInnK := 0;
end;
Inc(aPStr);
end;
end;
var
fInnState,
fAddChar: Boolean;
fHR, mlen, idx: Integer;
begin
Result:='';
fInnState := False;
fHR := 0;
mLen := Length(aStr);
idx := 1;
while idx <= mLen do begin
fAddChar := True;
case aStr[idx] of
#$3C: fHR := 1; //<
#$3E: begin //>
if fHR = 3 then begin
fHR := 0;
fInnState := doFixCheck(@aStr[idx], mLen - idx);
end;
end;
#$48: if fHR = 1 then Inc(fHR) else fHR := 0; //H
#$52: if fHR = 2 then Inc(fHR) else fHR := 0; //R
#$C2: if fInnState then fAddChar := False;
#$C3: begin
if fInnState then begin
Inc(idx);
//次の文字を変換
Result := Result + AnsiChar(Byte(aStr[idx])+$40);
fAddChar := False;
end;
end;
else fHR := 0;
end;
if fAddChar then begin
if aStr[idx] = #$0 then Result := Result + #$20
else Result := Result + aStr[idx];
end;
Inc(idx);
end;
end;
以下4質問が、華麗に翻訳されました。
http://madia.world.coocan.jp/cgi-bin/DelphiBBS/wwwlng.cgi?print+201609/16090004.txt
http://madia.world.coocan.jp/cgi-bin/DelphiBBS/wwwlng.cgi?print+201611/16110016.txt
http://madia.world.coocan.jp/cgi-bin/DelphiBBS/wwwlng.cgi?print+201704/17040002.txt
http://madia.world.coocan.jp/cgi-bin/DelphiBBS/wwwlng.cgi?print+201708/17080004.txt
|
|