기본 콘텐츠로 건너뛰기

5월, 2015의 게시물 표시

C++ URL 인코딩 (== 퍼센트 인코딩)

 소스 코드는 아래와 같습니다. /** * 주어진 문자열을 URL 인코딩하여 반환함. * * 주요 코드 출처: http://codepad.org/lCypTglt * * @param s utf-8로 인코딩된 멀티바이트 문자열. * (utf-8이 아니면 웹에서 제대로 인식하지 못할 수 있습니다.) * @return URL 인코딩된 문자열 */ std::string UrlEncode(const std::string &s) { //RFC 3986 section 2.3 Unreserved Characters (January 2005) // 참고: http://ko.wikipedia.org/wiki/퍼센트_인코딩 const std::string unreserved = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.~"; std::string escaped=""; for(size_t i=0; i<s.length(); i++) { if (unreserved.find_first_of(s[i]) != std::string::npos) { escaped.push_back(s[i]); } else { escaped.append("%"); char buf[3]; /* char를 unsigned char로 바꿔주어야 합니다. * (그렇지 않으면 한글 등의 문자를 제대로 변환하지 못합니다.) */ sprintf(buf, "%.2X", (unsigned char) s[i]); escaped.append(

RapidXml에서 문자열 파싱하기 및 주의사항

C++에서 XML 파싱에 사용하는 라이브러리 중 RapidXml이 있습니다. 속도가 빠르고, 헤더 파일로만 되어 있어서 단순히 파일을 복사하는 정도만으로 쉽게 사용할 수 있다는 장점이 있습니다. 더군다나 MIT 라이선스로 사용 가능하므로 상업용 프로그램에도 유용하게 사용할 수 있습니다. 공식 사이트: http://rapidxml.sourceforge.net 그런데 주의사항이 있습니다. 우선 아래를 봐주시기 바랍니다. string strXml = "<?xml version="1.0" encoding="utf-8"?><books> ... (중략) ... </books>"; xml_document<> doc; doc.parse<0>( (char*)strXml.c_str() ); xml_node<>* root = doc.first_node(); printf("root 노드 이름: %s\n", root->name()); 위와 같이 하면 std::string으로부터 XML을 파싱할 수 있습니다. 여기서 빨간색 부분을 보시면 const char*를 char*로 변환하는데요, 해보시면 별 문제 없이 잘되는 것 같아 보입니다. 하지만 parse()가 문자열을 변경하지 않는다는 보장이 없습니다.만약 변경해버린다면 예상치 못한 문제가 발생할 것이고, 정말 찾기 힘든 버그가 될 것입니다. 별 문제가 없더라도 아래와 같이 문자열을 복사해서 사용하는 방법을 권장해드립니다. string strXml = "<?xml version="1.0" encoding="utf-8"?><books> ... (중략) ... </books>"; char* sz = new char[strXml.size() + 1]; strcpy(sz, strXm