기본 콘텐츠로 건너뛰기

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

프로세스 강제 종료 불가 시.

특정 프로세스를 강제 종료 하려는데... "실행 중인 작업 인스턴스가 없습니다." 이런 메시지가 나타나면서 종료가 안되는 문제가 있었습니다. 작업 관리자에서 "프로세스 종료", "프로세스 트리 종료" 해봐도 안되고, cmd에서 taskkill 해봐도 안되고... 그런데 이게 부모 프로세스를 종료하면 자동으로 종료가 되네요.. (제 경우에는 Visual Studio가 부모 프로세스였습니다. ㅋ) 참고: DEVPIA http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNo=20&no=917792&ref=917791

어느날 갑자기 "알 수 없음."이라는 에러가 발생할 때.

  윈도 XP 를 사용하던 중 어느날 갑자기 일부 프로그램에서 "알 수 없음."(Unknown) 에러가 발생했습니다. 원인을 도무지 알 수 없어서 OllyDbg 를 이용해서 해당 에러가 발생하는 시점을 확인해보니, "Microsoft Jet data engine"이라는 말이 눈에 띄었습니다.   그래서 관련 부분을 검색했는데, 다음의 글을 발견했습니다. Resolving Microsoft Jet Error 'Unknown'   저는 방법 2에서 "msjtes40.dll"만 레지스트리에 다시 등록하고 컴퓨터를 재부팅하니까 증상이 사라졌습니다. 혹시나 같은 문제로 고민하고 계실 분들이 있을지도 몰라서 해결 방법을 아래에 정리(번역)해 두었으니 참고하시기 바랍니다. ^_^ 1. 증상   어느날 갑자기 일부 프로그램에서 "알 수 없음."(Unknown) 이라는 에러가 발생.   (윈도 XP에서 확인. 상위 버전의 윈도에서도 발생하기도 하는 듯.) 2. 증상이 발생하는 프로그램   데이터베이스 (DB)로 마이크로소프트의 엑세스(Access) 를 사용하고 있는 프로그램. (DB 파일의 확장자가 .mdb 임.)   예:  Mybible(성경 읽기 프로그램), 벧엘3(교인, 재정 관리 등) 3. 원인   Microsoft Jet data engine 관련 레지스트리가 손상된 것으로 추정. 4. 해결 방법 # 방법 1: 드라이버 재설치. 제어판에서 프로그램 추가/제거를 실행. Microsoft Access Database Engine 2007 driver가 있으면 삭제합니다. 다음의 링크에서 Microsoft Access Database Engine 2010 재배포 패키지를 받아서 설치합니다. Microsoft Access Database Engine 2010 재배포 가능 패키지 증상이 해결되었는지 확인합니다. # 방법 2: 레지

VirtualBox 업데이트 후 블루스크린 문제.

  VirtualBox를 업데이트 했는데, 그 후부터 가상 머신을 실행하면, 거의 매번 블루스크린이 뜨는 것이 아니겠어요?! 일하다가 컴퓨터가 갑자기 재부팅 되어 버리니, 겁이 나서 가상 머신을 쓸 수가 없었습니다.   한동안은 다시 예전 버전을 설치해서 쓰다가, 새로운 업데이트가 나와서 이제는 괜찮겠지라는 생각에 업데이트 했는데... 왠걸요. 똑같습니다..   여기 저기 해매다가 마침내 해결법을 알아냈는데요, 가상 머신 설정에서 "시스템 -> 가속"으로 간 후, "네스티드 페이징 사용하기"를 비활성 했더니 이후로는 한번도 그런 문제가 발생하지 않았습니다.