在一些特殊的情况下会用到这个功能。本来想在lazarus中使用正则表达式,没想到弄了好久居然不行,换了个思路用最笨的办法很快搞定。
function TformMain.wyToUTF8Decode(const str: string): string;
var
tmpStr: AnsiString;
i, iLen: Integer;
sAll, s : string;
begin
// 例子: b'pandas\xe7\xbb\x83\xe4\xb9\xa04-Apply'
sAll := str;
// 首先删除开始的 b' 和结尾的 '
sAll := copy(str, 3, length(str) - 3);
iLen := length(sAll) - subStrCount('\x', sAll) * 3;
SetLength(tmpStr, iLen);
i := 0;
while length(sAll) > 0 do
begin
if pos('\x', sAll) = 1 then // \x 位于开头
begin
// 处理头4个字符
i := i + 1;
sAll := copy(sAll, 3, length(sAll)); // 先删除开头的 \x
s := copy(sAll, 1, 2);
Byte(tmpStr[i]) := StrToInt('$' + s);
sAll := copy(sAll, 3, length(sAll)); // 再删除开头的2个字符
end
else //if pos('\x', sAll) > 1 then // \x 不位于开头
begin
// 处理第1个字符
i := i + 1;
s := copy(sAll, 1, 1);
Byte(tmpStr[i]) := ord(s[1]); // cur:=ord(s[i])
sAll := copy(sAll, 2, length(sAll)); // 再删除开头的1个字符
end;
end;
Result := UTF8Decode(tmpStr);
end;
下面这个是模拟python的encode('utf-8'),输出不完全一样,如果要用,需要修改。
function wyToUTF8Encode(str: string): string;
var
b: Byte;
begin
for b in BytesOf(UTF8Encode(str)) do
//Result := Format('%s%%%.2x', [Result, b]);
Result := Result + '\x' + lowercase(Format('%.2x', [b]));
end;