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 <> nil then<br><wbr> begin<br><wbr><wbr><wbr> while (i < SourceBytes) and (count < 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) <> 0 then<br><wbr><wbr><wbr><wbr><wbr> begin<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> if i >= 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) <> 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) <> $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 >= 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) <> $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 >= 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 < 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) <> 0 then<br><wbr><wbr><wbr><wbr><wbr> begin<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> if i >= 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) <> 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) <> $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 >= 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) <> $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 > 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>