名前 題名 ▼ おかぽんさん > ▼ 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 GIF,JPEG,PNG画像ファイル及びLZH,ZIPファイルをアップロードできます.600 x 1200 ピクセルを超える画像は縮小表示されます(画像クリックで拡大表示). (上限122000(120k)バイト) 削除キー Link