<p>仕方がないのでソースを見てみることに。<br />
該当のHTMLEncodeは下記のようになっていた。</p>
<pre class="brush: delphi" title="修正前">
function HTMLEncode(const AStr: String): String;
const
  Convert = ['&amp;','&lt;','&gt;','&quot;'];
var
  Sp, Rp: PChar;
begin
  SetLength(Result, Length(AStr) * 10);
  Sp := PChar(AStr);
  Rp := PChar(Result);
  while Sp^ &lt;&gt; #0 do
  begin
    case Sp^ of
      '&amp;': begin
             FormatBuf(Rp^, 5, '&amp;', 5, []);
             Inc(Rp,4);
           end;
      '&lt;',
      '&gt;': begin
             if Sp^ = '&lt;' then
               FormatBuf(Rp^, 4, '&lt;', 4, [])
             else
               FormatBuf(Rp^, 4, '&gt;', 4, []);
             Inc(Rp,3);
           end;
      '&quot;': begin
             FormatBuf(Rp^, 6, '&quot;', 6, []);
             Inc(Rp,5);
           end;
    else
      Rp^ := Sp^
    end;
    Inc(Rp);
    Inc(Sp);
  end;
  SetLength(Result, Rp - PChar(Result));
end;
</pre>
<p>よく見てるとFormatBufのところが正しく動いていないようだ。ということで、FormatBufの不具合を疑ったのだが、どうやらFormatBufに渡しているパラメータがまずいらしい。<br />
FormatBufに渡すパラメータはバイト単位で文字数ではないのだが、文字数で渡していたみたい。AnsiStringの際には半角英数は1文字1バイトであったので、正しく動いていたのであろうということが伺える。処理がUnicode16になったことで半角英数も1文字2バイトになったので、あわせてパラメータを2倍して渡してみたところ正常に動作した。</p>
<pre class="brush: delphi" title="修正後">
function HTMLEncode(const AStr: String): String;
const
  Convert = ['&amp;','&lt;','&gt;','&quot;'];
var
  Sp, Rp: PChar;
begin
  SetLength(Result, Length(AStr) * 10);
  Sp := PChar(AStr);
  Rp := PChar(Result);
  while Sp^ &lt;&gt; #0 do
  begin
    case Sp^ of
      '&amp;': begin
             FormatBuf(Rp^, 10, '&amp;', 10, []);
             Inc(Rp,4);
           end;
      '&lt;',
      '&gt;': begin
             if Sp^ = '&lt;' then
               FormatBuf(Rp^, 8, '&lt;', 8, [])
             else
               FormatBuf(Rp^, 8, '&gt;', 8, []);
             Inc(Rp,3);
           end;
      '&quot;': begin
             FormatBuf(Rp^, 12, '&quot;', 12, []);
             Inc(Rp,5);
           end;
    else
      Rp^ := Sp^
    end;
    Inc(Rp);
    Inc(Sp);
  end;
  SetLength(Result, Rp - PChar(Result));
end;
</pre>
<p>Unicode文字列に対する必要バイト数が正しく設定されていないのが原因だった。<br />
Unicode化に正しく対応できていない関数はまだまだありそうな感じですね。</p>