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