2011-03-24 2 views
17

나는 HTTP 관련 문제에 초보자입니다. 내 질문은 아이폰 OS 개발에, 내가 HTTP 헤더를 사용하여 문자열을 보내려고, 그래서 내가 사용하고 있습니다 :HTTP 헤더를 사용하여 영어 이외의 유니 코드 문자열을 보내는 방법은 무엇입니까?

[httpRequest setValue:@"nonEnglishString" forHTTPHeaderField:@"customHeader"]; 

수신 서버가 파이썬 (구글 앱 엔진)이며, DB에 문자열 값을 저장 사용 StringProperty 같은 모델 : 나는 한국처럼 영어가 아닌 문자열을 보내려고 할 때

dataEntityInstance.nonEnglishString = unicode(self.request.headers.get('customHeader') 

그러나, 문제는이 같은 HTTP 헤더에 저장된 것입니다 :

Customheader = "\Uc8fc\Uba39\Uc774 \Uc6b4\Ub2e4"; 
,321 이 데이터 스토어에 구글 앱 엔진에서 수신 및 저장 때 0, 그것은 같은 것으로 바뀌 :

??? ?? 

는 유니 코드 값에 대한 적절한 문자를 찾을 수없는 것처럼.

HTTP 헤더를 사용하여 영어 이외의 문자열을 보낼 수 없습니까? 허용되지 않습니까?

iOS에서 setHTTPBody 만 사용하는 경우 영어 이외의 문자열을 전송하여 App Engine의 데이터 저장소에 올바르게 저장할 수 있습니다.

[httpRequest setHTTPBody:[httpBody dataUsingEncoding:NSUTF8StringEncoding]]; 

하지만 난 그냥

답변

23

HTTP 헤더를 사용하여 영어 이외의 문자열을 보낼 수 없습니까? 허용되지 않습니까?

HTTP 표준에 따라 HTTP 헤더에 ISO-8859-1이 아닌 문자를 직접 입력하는 것은 불가능합니다. 그러면 ASCII ("영어"?) 문자와 일반적인 서유럽 구별 기호가 생깁니다.

실제로 서버와 브라우저가 헤더의 비 ASCII 문자로 처리 할 것에 동의하지 않기 때문에 실제로 ISO-8859-1 확장 문자를 사용할 수 없습니다. 사파리는 말 그대로 RFC2616을 사용하며 높은 바이트는 ISO-8859-1 문자로 취급합니다. Mozilla는 UTF-16 코드 단위를 로우 바이트로 취합니다. Opera와 Chrome은 UTF-8에서 디코딩됩니다. IE는 로컬 시스템 코드 페이지를 사용합니다.

실제로 HTTP 헤더에 넣을 수있는 것은 제어 코드가없는 간단한 ASCII입니다. 더 많은 것을 원한다면 인코딩 스키마 (예 : UTF-8 + base64)를 만들어야합니다. RFC2616 표준은 RFC2047 인코딩 된 단어를 표준 형식의 인코딩으로 제안하지만 RFC2047 자체에서 허용되는 정의가 주어진다면 의미가 없습니다.

+0

* (...)로 무엇을 의미합니까? RFC2047 자체에서 허용되는 경우 (*) *의 정의가 주어지면 의미가 없습니다. –

+0

RFC 2047 섹션 ​​5는 인코딩 된 단어가 RFC 822 'text', 'comment'및 'phrase'가있는 곳으로 갈 수 있다고 명시하지만 RFC 2616은 RFC 822 제품군 표준이 아니며 해당 항목과 일치하는 토큰이 없습니다. (TEXT 토큰이 있지만 동일한 정의가되어 있지 않습니다.) 명시 적으로 'quoted-string'에 들어가서는 안됩니다. RFC 2616에 정의 된 매우 유사한 'quoted-string'토큰이 있습니다. 이는 실제로 Content-Disposition 및 유사 매개 변수화 된 헤더로 인해 비 ASCII 문자를 가장 많이 넣고 싶은 곳입니다. – bobince

+0

어쨌든, 표준 관점에서 이것은 이제 정리됩니다 : RFC 5987은 매개 변수화 된 헤더에서 비 ASCII를 인코딩하는 표준 방법을 제공하고 RFC 7230은 비 레거시 헤더를 ASCII로 권장합니다. – bobince

4
구글 앱 엔진의 데이터 저장소를 기반으로 파이썬에서 적절한 형태로 문자열을 정사각형의처럼 무엇을 많은 API를 같은 HTTP 헤더를 사용 및 저장 같은 목표를 달성하기 위해 올바른 방법을 찾을 수 없습니다

HTTP 헤더에는 ISO 8859-1 이외의 문자 집합을 사용할 수 있지만 RFC 2047에 설명 된대로 인코딩해야합니다.

+0

iOS 응용 프로그램 클라이언트가 RFC 2047의 NSString 인코딩을 HTTP 헤더 값으로 설정하기 전에 인코딩해야하는 경우 iOS 또는 Objective-C 소스를 통해이를 처리 할 수있는 곳을 알려주시겠습니까? 태스크? – petershine

+1

RFC2616에서이 처방은 불행히도 가짜입니다. RFC2047 인코딩 된 단어는 RFC-822 패밀리 아톰을 기반으로하지 않으므로 명시 적으로 HTTP 헤더에서 사용할 수있는 장소에 들어갈 수 없습니다.2047에 대한 참조는 향후 표준에 대한 HTTPbis 작업에서 제거되었습니다. 원하는 경우 인코딩 된 단어를 특정 응용 프로그램 형식의 인코딩으로 사용할 수 있습니다 (단, 직선 UTF-8 base64가 더 쉬울 수도 있음). – bobince

관련 문제