喫茶XRAYトップページ

[スレッド全体
]

[11339] Re4:翻訳こんにゃく返信 削除
2017/8/18 (金) 09:54:01 Mr.XRAY
▼ おかぽんさん

> MemoryStreamに読み込んで、AnsiString で読んで、Harryさんメソッド通して
> FileStreamで書き込んでおしまい。


ゲッ !
おかぽんさん仕事早いですね.
私は Harry さんのコードコピペして保存しただけです.
おかぽんさんのおかげで手間が省けそうです.サンクスです.


[11343] Re5:翻訳こんにゃく返信 削除
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


[11344] Re6:翻訳こんにゃく返信 削除
2017/8/18 (金) 15:55:08 Mr.XRAY
> せっかくなので Harryさん の UTF8MojibakeFix を某掲示板仕様に修正したので置いていきます。

私は取り合えば Harry さんのコードをコピペしたのを
TEmbeddedWB に置き換えてみました.TWebBrowser だとスクリブエラーが発生したので.

http://mrxray.on.coocan.jp/Delphi/zip/plCnvCodepage4QA.zip

動作確認は Windows 7 U64(SP1) + Delphi XE(UP1) Pro です.


[11345] Re7:翻訳こんにゃく返信 削除
2017/8/18 (金) 16:14:01 Mr.XRAY
> http://mrxray.on.coocan.jp/Delphi/zip/plCnvCodepage4QA.zip

おかぽんさんのコードも追加させていただきました.
ボタンが 1 つ増えています.

もし応答なしの状態になったら,閉じて再度起動してみてください.


2017/08/23 追記
NavigateError 時の処理を Cancel することにより,
応答なしの状態を抑えるようにしてみました.



[11354] Re8:翻訳こんにゃく返信 削除
2017/8/23 (水) 15:03:44 Mr.XRAY
> もし応答なしの状態になったら,閉じて再度起動してみてください.

NavigateError 時の処理を Cancel することにより,
応答なしの状態を抑えるようにしてみました.


[11348] Re7:翻訳こんにゃく返信 削除
2017/8/18 (金) 16:41:21 Harry
▼ Mr.XRAYさん
> TEmbeddedWB に置き換えてみました.TWebBrowser だとスクリブエラーが発生したので.

その辺が(ミニマム版)のゆえんでした。
あいにく、某掲示板だと広告によってスクリプトエラー多発するんですよねー。
それと、ページが遷移してもロケーションバーが変化しないのは仕様です(笑)


[11349] Re8:翻訳こんにゃく返信 削除
2017/8/18 (金) 17:03:25 Mr.XRAY
▼ Harryさん

> その辺が(ミニマム版)のゆえんでした。
> あいにく、某掲示板だと広告によってスクリプトエラー多発するんですよねー。
> それと、ページが遷移してもロケーションバーが変化しないのは仕様です(笑)


UI 関係をちゃんとというか,考えると大変というか面倒ですからね.
解読できれば十分と思います.
これでコピペして解読する必要がなくなりました.
感謝です.


[11347] Re6:翻訳こんにゃく返信 削除
2017/8/18 (金) 16:39:07 Harry
▼ おかぽんさん
> すばらしいです!
> 私、なければ作るの精神、すっかり忘れてしまったようです


無ければ作る…そういうことを言っていただけてうれしいです。
そう、タネを明かせば単にUTF-8をデコードしてる(※ただし対象は1byte文字限定)
だけなんですけど、こんなもの、既製のライブラリ使用では難しいですよね、たぶん。

> ・・・URLOpenBlockingStreamで、失敗する・・・。
> proxy環境では失敗するとか、しないとか。


ありゃー、そんな罠があるんですか。残念。
でもまあ、もうお察しの通り、生HTMLを取得できればなんでもOKですので。
URLOpenBlockingStreamを採用したのは、AnsiStringに直接ぶち込める、シンプルな
コードを探し、試してみた結果です。
本質的にはAnsiStringさえ要らないですよね。自分の場合はスクリプトに放り込むときに
必要なのと、「Stringは足し算が出来てお得!」なのでバイナリは基本AnsiStringに
入れてしまいます(笑)


> せっかくなので Harryさん の UTF8MojibakeFix を某掲示板仕様に修正したので置いていきます。

早速、差し替えて使わせていただきました。おおおお、これは… 感動しました!!

★感動ポイント
 (1) 目の付け所がHR
 (2) たった一文字、関数名に 2 を追加するだけで機能アップする親切かつ互換性抜群の仕様
 (3) なんかぜんぜん違うコードになってるぅ〜(笑) 特にフラグの意味がまったく違うし!
 (4) こっそりDeleteNull関数も統合されてるぞ!?
 (5) case文の書き方が自分と同じだ!!

DeleteNull関数について。
私も投稿の際にやぼったいから統合しようかと思ったんですが、見送りました。
その理由は、UTF8MojibakeFix関数の処理内容が分かりにくくなる恐れがあったのと、
いかなる場合(例えば不正なUTF-8とか)でもNull文字を除去したかったためです。


[▼次のスレッド]
INCM/CMT
Cyclamen v3.82