delphi utf8解码

function Utf8ToUnicode1(Dest: PWideChar; MaxDestChars: Cardinal; Source: PChar; SourceBytes: Cardinal): Cardinal;
var
<wbr> i, count: Cardinal;<br><wbr> c: Byte;<br><wbr> wc: Cardinal;<br> begin<br><wbr> if Source = nil then<br><wbr> begin<br><wbr><wbr><wbr> Result := 0;<br><wbr><wbr><wbr> Exit;<br><wbr> end;<br><wbr> Result := Cardinal(-1);<br><wbr> count := 0;<br><wbr> i := 0;<br><wbr> if Dest &lt;&gt; nil then<br><wbr> begin<br><wbr><wbr><wbr> while (i &lt; SourceBytes) and (count &lt; MaxDestChars) do<br><wbr><wbr><wbr> begin<br><wbr><wbr><wbr><wbr><wbr> wc := Cardinal(Source[i]);<br><wbr><wbr><wbr><wbr><wbr> Inc(i);<br><wbr><wbr><wbr><wbr><wbr> if (wc and $80) &lt;&gt; 0 then<br><wbr><wbr><wbr><wbr><wbr> begin<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> if i &gt;= SourceBytes then Exit;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> // incomplete multibyte char<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> wc := wc and $3F;<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> if (wc and $20) &lt;&gt; 0 then<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> begin<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> c := Byte(Source[i]);<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> Inc(i);<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> if (c and $C0) &lt;&gt; $80 then Exit;<wbr><wbr><wbr><wbr><wbr> // malformed trail byte or out of range char<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> if i &gt;= SourceBytes then Exit;<wbr><wbr><wbr><wbr><wbr><wbr><wbr> // incomplete multibyte char<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> wc := (wc shl 6) or (c and $3F);<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> end;<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> c := Byte(Source[i]);<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> Inc(i);<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> if (c and $C0) &lt;&gt; $80 then Exit;<wbr><wbr><wbr><wbr><wbr><wbr> // malformed trail byte</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr> Dest[count] := WideChar((wc shl 6) or (c and $3F));<br><wbr><wbr><wbr><wbr><wbr> end<br><wbr><wbr><wbr><wbr><wbr> else<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> Dest[count] := WideChar(wc);<br><wbr><wbr><wbr><wbr><wbr> Inc(count);<br><wbr><wbr><wbr> end;<br><wbr><wbr><wbr> if count &gt;= MaxDestChars then count := MaxDestChars-1;<br><wbr><wbr><wbr> Dest[count] := #0;<br><wbr> end<br><wbr> else<br><wbr> begin<br><wbr><wbr><wbr> while (i &lt; SourceBytes) do<br><wbr><wbr><wbr> begin<br><wbr><wbr><wbr><wbr><wbr> c := Byte(Source[i]);<br><wbr><wbr><wbr><wbr><wbr> Inc(i);<br><wbr><wbr><wbr><wbr><wbr> if (c and $80) &lt;&gt; 0 then<br><wbr><wbr><wbr><wbr><wbr> begin<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> if i &gt;= SourceBytes then Exit;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> // incomplete multibyte char<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> c := c and $3F;<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> if (c and $20) &lt;&gt; 0 then<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> begin<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> c := Byte(Source[i]);<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> Inc(i);<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> if (c and $C0) &lt;&gt; $80 then Exit;<wbr><wbr><wbr><wbr><wbr> // malformed trail byte or out of range char<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> if i &gt;= SourceBytes then Exit;<wbr><wbr><wbr><wbr><wbr><wbr><wbr> // incomplete multibyte char<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> end;<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> c := Byte(Source[i]);<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> Inc(i);<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> if (c and $C0) &lt;&gt; $80 then Exit;<wbr><wbr><wbr><wbr><wbr><wbr> // malformed trail byte<br><wbr><wbr><wbr><wbr><wbr> end;<br><wbr><wbr><wbr><wbr><wbr> Inc(count);<br><wbr><wbr><wbr> end;<br><wbr> end;<br><wbr> Result := count+1;<br> end;</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

function Utf8Decode1(const S: string): WideString;
var
<wbr> L: Integer;<br><wbr> Temp: WideString;<br> begin<br><wbr> Result := '';<br><wbr> if S = '' then Exit;<br><wbr> SetLength(Temp, Length(S));</wbr></wbr></wbr></wbr></wbr>

<wbr> L := Utf8ToUnicode1(PWideChar(Temp), Length(Temp)+1, PChar(S), Length(S));<br><wbr> if L &gt; 0 then<br><wbr><wbr><wbr> SetLength(Temp, L-1)<br><wbr> else<br><wbr><wbr><wbr> Temp := '';<br><wbr> Result := Temp;<br> end;<br> 调用:<br> UTF8Decode1('乱码')</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值