Вот. Только USC здесь от 0 до FFFF, так как WideChar имеет только два байта. Если продолжать тему, кто знает, какой формат символа имеет 4 байта (полноценный USC)?
| Код | { Функция переводит строку в UTF-формат для передачи данных, например, по сети через get-запрос. Таким образом преобразуется строка для передачи данных поисковику google.com Пример: абв -> %D0%B0%D0%B1%D0%B2 abc -> %61%62%63 Примечание: те символы, которые имеют код 0-7F, могут также передаваться непосредственно, без данного преобразования. Конвертируются только символы, имеющие в кодировке USC код от 0 до FFFF Также см. статью по UTF-формату: http://www.linuxdoc.ru/manpages/man7/utf8.7.html } function StrToUTF (S : String) : String; var Buf : LPCWSTR; Size : Integer; SW : PWideChar; i : DWord; W : Word; begin Result := ''; Size := SizeOf (WideChar) * Length (S) + 1; GetMem (Buf, Size); //Сначала переходим в USC SW := StringToWideChar (S, Buf, Size); //Затем каждый символ этой "широкой" строки переводим в UTF согласно //документу по вышеуказанной ссылке for i := 0 to Length (S)-1 do begin W := Word(SW[i]); if W < $7F then Result := Result + '%' + IntToHex (W, 2) else if W < $7FF then Result := Result + '%' + IntToHex (W shr 6 + $C0, 2) + '%' + IntToHex (W and $3F + $80, 2) else Result := Result + '%' + IntToHex (W shr 12 + $E0, 2) + '%' + IntToHex (W shr 6 and $3F + $80, 2) + '%' + IntToHex (W and $3F + $80, 2); end; end; | |