Чтение строк Юникода из полей содержимого TWebRequest - PullRequest
1 голос
/ 20 января 2012

Как мы можем получить фактическую строку Unicode из полей содержимого TWebRequest. Когда я пытаюсь прочитать поля содержимого TWebRequest, чтобы получить введенное значение Unicode, которое я ввел в текст, я вижу зашифрованное значение вместо фактического. Ввод, который я дал, был Добро, но в полях содержания я вижу значение Ð »Ð¾Ð ± Ñ € о. Тип содержимого ответа имеет значение text / html и charset = 'UTF-8'. Может ли какой-либо орган сообщить, почему он не показывает фактическое значение, введенное в текстовое поле, и как это можно исправить.

образец кода, который я тестировал

procedure TWebModule1.WebModule1HelloAction(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
  s : string;
  PageProducer1 : TPageProducer;
begin
  Response.ContentType := 'text/html;charset=UTF-8';
  s := Request.ContentFields.Text;
  PageProducer1 := TPageProducer.Create(nil);
  try
    PageProducer1.HTMLFile := 'C:\Hello.tmpl';
    PageProducer1.OnHTMLTag := PageProducer1HTMLTag;
    Response.Content := PageProducer1.Content + ' ' + 'Entered string:' + s;
  finally
    PageProducer1.Free;
  end;
end;

Hello.tmpl просто имеет текстовое поле и кнопку отправки

Ответы [ 2 ]

3 голосов
/ 20 января 2012

Вы можете использовать функцию UTF8ToString для преобразования вашей строки UTF-8 в UnicodeString.

0 голосов
/ 13 мая 2015

Вам просто нужно использовать TWebRequest.ContentRaw, который возвращает AnsiString с правильной кодовой страницей на основе кодировки, определенной в заголовке запроса.К сожалению, вам придется обрабатывать содержимое вручную.

Чтобы получить строку (UnicodeString), используйте TEncoding.UTF8.GetString(BytesOf(Request.RawContent)), если вы уверены, что charset имеет UTF-8.В качестве альтернативы вы можете проверить оригинальный contentType заголовка с:

var ct: string;
...
ct := string(Request.GetFieldByName('Content-type')).ToUpper;
if (Pos('CHARSET', ct) > 0) and (Pos('UTF-8', ct) > 0) then
    Result := TEncoding.UTF8.GetString(BytesOf(Request.RawContent))
  else
    Result := TEncoding.ANSI.GetString(BytesOf(Request.RawContent));

TWebRequest.Content и TWebRequest.ContentFields содержат ошибки в моей текущей версии ().Они всегда кодируются в ANSI.TWebRequest.EncodingFromContentType попытаться извлечь кодировку из TWebRequest.ContentType, но часть кодировки в contentType уже удалена предыдущим кодом.

...