2014-09-30 5 views
0

저는 C를 배우고 있으며, libcURL을 사용하여 웹 사이트에 로그인하기위한 POST 요청을 보내고 있습니다.
문제가 발생했습니다. 암호에 ü 문자가 포함되어 있습니다.
브라우저에서 POST 요청을 읽으면 %FC으로 인코딩 된 것을 볼 수 있습니다.
그러나 curl_easy_escape()을 사용하여 인코딩하면 %C3%BC으로 인코딩됩니다.다른 문자셋에서 이상한 문자를 URL로 변환합니다.

나는 검색을 해본 결과 다른 인코딩임을 알게되었습니다. 나는이 메타가 페이지에 있기 때문에 ISO라고 생각한다. <meta content="text/html; charset=ISO-8859-1" http-equiv="content-type">
그러나 어떻게 든 변환하는 방법을 알 수 없다.

이제 어떻게하면 ü%FC으로 urlencoding 할 수 있습니까?

+0

@HansPassant 왜 로케일을 변경해야합니까? 다국어 프로그램의 출력에만 영향을 미치지 않습니까? –

+0

'libcurl' 태그에 POST에 사용할 문자열을 준비하는 올바른/관용적 인 방법을 묻는 별도의 질문을 게시하는 것이 좋습니다. 이것은 모두가 필요로하는 것이기 때문에 분명히 표준 응답이 있습니다. 최악의 상황은 표준 솔루션이'curl_easy_escape'이고 문자열을이 함수에 전달하기 전에 charset 변환을 직접 수행해야한다는 것입니다. –

+0

@R .. 일반적으로 [라이브러리 자체의 예제] (http://curl.haxx.se/libcurl/c/http-post.html)가있는 경우, 필자는 이것이 올바른/관용적 인 방법이어야한다고 생각합니다. 처리해. –

답변

1

POST에 UTF-8이 아닌 인코딩을 사용하는 것은 완전히 엉망이며 실제로 브라우저간에 동작이 상당히 다양하므로이 작업을 수행하는 것이 매우 바람직하지 않습니다. 그러나 사이트에 머물러 있기 때문에이를 해결해야합니다.

대체 문자 세트로 백분율 인코딩을 수행 할 때 curl api를 찾을 수 없으므로 직접 수행해야 할 수도 있습니다. 먼저 시스템의 기본 인코딩 인 UTF-8을 ISO-8859-1로 변환하려면 iconv을 사용하십시오. (Latin-1)를 입력 한 다음 수동으로 백분율 인코딩을 수행하십시오.

하나의 아이디어 - 자신 만의 도피를해야한다고 생각하십니까? 내 인상은 URL을위한 것일 뿐이므로 게시 양식의 컬링 API는 이미 내부적으로 (확실하지 않은) 이스케이프 처리를 수행 할 수도 있습니다.이 경우 올바른 컨텐츠 유형을 말해야 할 것입니다.

+0

libcURL에서 문자열을 CURLOPT_POSTFIELDS에 넣으면됩니다. 그것으로 아무 것도하지 않습니다. iconv는 실행 가능한 방법처럼 보입니다. 내 프로그램은 암호에 대한 명령 줄 인수를 취할 것이며, 인수의 인코딩에 대해 걱정해야합니까? –

+1

@mid_kid : 일반적으로 할 일은 명령 줄, 사용자 제공 텍스트 파일, env 변수 등에서 오는 모든 것을 로케일의 인코딩으로 인코딩 된 것으로 취급하는 것입니다. 이것은'setlocale (LC_CTYPE, ")'또는 이와 유사한 함수를 호출하여 로케일을 유지하고'nl_langinfo (CODESET) '를 사용하여 로케일 인코딩의 이름을 얻고 ('iconv_open'에 전달할 수 있어야합니다) 필요합니다. –