2012-01-20 8 views
1

TWebRequest의 콘텐츠 필드에서 실제 유니 코드 문자열을 검색하는 방법은 무엇입니까? 내가 입력 된 유니 코드 값을 얻기 위해 TWebRequest의 컨텐트 필드를 읽으려고 할 때 텍스트 대신에 실제 값 대신 스크램블 된 값이 표시됩니다. 내가 입력 한 정보는 Добро 이었지만 내용 필드에는 값 "оР± Ñ € ¾¾이 표시됩니다. Response contenttype은 text/html 및 charset = 'UTF-8'로 설정됩니다. 어떤 본문이 텍스트 상자에 입력 된 실제 값과 이것이 수정 될 수있는 이유를 보여주지 못합니다. 내가TWebRequest의 콘텐츠 필드에서 유니 코드 문자열 읽기

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을 테스트했다

샘플 코드는 텍스트 상자를 가지고 있으며, 버튼

답변

3

당신은 UnicodeString에 UTF-8 문자열을 변환 할 UTF8ToString 기능을 사용할 수 있습니다를 제출합니다.

+0

답장을 보내 주셔서 감사합니다. UTF8ToString은 완벽하게 작동하지만 charset이 UTF-8로 설정되어 있기 때문에 문자열은 ut8로 인코딩되어 있으며 유니 코드 문자열로 변환해야합니다. 어떤 방법이나 설정이 요청 개체에 자동으로 변환되도록 설정할 수 있습니까? – ravi12

+2

HTTP 페이로드는 임의의 옥텟 시퀀스입니다. content-type (및 content-encoding) 필드는이를 해석하는 방법을 알려줍니다. 적절한 헤더 필드를 읽고 올바른 방법으로 페이로드를 처리하는 것은 응용 프로그램의 책임입니다. –

+0

정상적으로 작동하지만 경고를 표시합니다 * W1058 'string'에서 'RawByteString'*으로 잠재적 인 데이터 손실이있는 암시 적 문자열 캐스트. Content 대신 RawContent를 사용하여이를 결합하면 경고가 사라집니다. –

0

요청 헤더에 정의 된 문자 집합을 기반으로 올바른 코드 페이지가있는 AnsiString을 반환하는 TWebRequest.ContentRaw 만 사용하면됩니다. 유감스럽게도 콘텐츠를 수동으로 처리해야합니다.

문자열 (UnicodeString)을 얻으려면 TEncoding.UTF8.GetString(BytesOf(Request.RawContent))을 사용하십시오. 문자 세트가 UTF-8이면 확실합니다.

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.ContentTWebRequest.ContentFields ()의 내 현재 버전에서 도청됩니다 또는 당신과 함께 헤더의 원래의 contentType을 확인할 수 있습니다. 그들은 항상 ANSI로 인코딩됩니다. TWebRequest.EncodingFromContentTypeTWebRequest.ContentType에서 문자 집합을 추출하려고 시도하지만이 시점에서 contentType의 charset 부분이 이전 코드에 의해 이미 제거되었습니다.