Если вы используете Delphi 2009 или более позднюю версию (версии Unicode), преобразование WideString в UTF8String является простым оператором присваивания:
var
ws: WideString;
u8s: UTF8String;
u8s := ws;
Компилятор вызовет подходящую библиотечную функцию для выполнения преобразования, поскольку он знает, что значения типа UTF8String имеют "кодовую страницу" CP_UTF8
.
В Delphi 7 и более поздних версиях вы можете использовать предоставленную библиотечную функцию Utf8Encode
. Для более ранних версий эту функцию можно получить из других библиотек, таких как JCL.
Вы также можете написать свою собственную функцию преобразования, используя Windows API:
function CustomUtf8Encode(const ws: WideString): UTF8String;
var
n: Integer;
begin
n := WideCharToMultiByte(cp_UTF8, 0, PWideChar(ws), Length(ws), nil, 0, nil, nil);
Win32Check(n <> 0);
SetLength(Result, n);
n := WideCharToMultiByte(cp_UTF8, 0, PWideChar(ws), Length(ws), PAnsiChar(Result), n, nil, nil);
Win32Check(n = Length(Result));
end;
В большинстве случаев вы можете просто использовать UTF8String в качестве массива, но если вам действительно нужен байтовый массив, вы можете использовать функции Дэвида и Космина. Если вы пишете свою собственную функцию преобразования символов, вы можете пропустить UTF8String и перейти непосредственно к байтовому массиву; просто измените тип возвращаемого значения на TBytes
или array of Byte
. (Вы также можете увеличить длину на единицу, если хотите, чтобы массив заканчивался нулем. SetLength будет делать это со строкой неявно, но с массивом.)
Если у вас есть какой-либо другой тип строки, который не является ни WideString, ни UnicodeString, ни UTF8String, то способ преобразовать его в UTF-8 - сначала преобразовать его в WideString или UnicodeString, а затем преобразовать обратно в UTF-8.