sqlite 중국어 난 코드 문제 원인 분석 및 해결

VC+에서 sqlite3.dll 인 터 페 이 스 를 통 해 sqlite 데이터 베 이 스 를 조작 합 니 다.데이터 베 이 스 를 열 고 삽입 하 며 데이터 베 이 스 를 조회 하 는 등 조작 인터페이스 입력 매개 변수 가 중국어 문 자 를 포함 하면 조작 이상 이 발생 할 수 있 습 니 다.예 를 들 어 sqlite 3 호출open 데이터베이스 파일 을 엽 니 다.파일 경로 에 중국어 가 나타 나 면 열 리 는 데 실 패 했 습 니 다.sqlite3_exec 는 sql 문 구 를 실행 합 니 다.중국어 대응 문 자 를 포함 하면 어 지 러 운 코드 가 됩 니 다.sqlite 데이터 베 이 스 는 UTF-8 인 코딩 방식 을 사용 하기 때문에 들 어 오 는 문자열 은 ASCII 인 코딩 이나 유 니 코드 인 코딩 으로 문자열 형식 이 잘못 되 었 습 니 다.해결 방안 은 sqlite 인 터 페 이 스 를 호출 하기 전에 문자열 을 UTF-8 인 코딩 으로 변환 하고 다음은 각종 문자열 인 코딩 변환 함 수 를 제공 합 니 다
 
//UTF-8 Unicode
std::wstring Utf82Unicode(const std::string& utf8string)
{
int widesize = ::MultiByteToWideChar(CP_UTF8, 0, utf8string.c_str(), -1, NULL, 0);
if (widesize == ERROR_NO_UNICODE_TRANSLATION)
{
throw std::exception("Invalid UTF-8 sequence.");
}
if (widesize == 0)
{
throw std::exception("Error in conversion.");
}
std::vector<wchar_t> resultstring(widesize);
int convresult = ::MultiByteToWideChar(CP_UTF8, 0, utf8string.c_str(), -1, &resultstring[0], widesize);
if (convresult != widesize)
{
throw std::exception("La falla!");
}
return std::wstring(&resultstring[0]);
}
//unicode ascii
string WideByte2Acsi(wstring& wstrcode)
{
int asciisize = ::WideCharToMultiByte(CP_OEMCP, 0, wstrcode.c_str(), -1, NULL, 0, NULL, NULL);
if (asciisize == ERROR_NO_UNICODE_TRANSLATION)
{
throw std::exception("Invalid UTF-8 sequence.");
}
if (asciisize == 0)
{
throw std::exception("Error in conversion.");
}
std::vector<char> resultstring(asciisize);
int convresult =::WideCharToMultiByte(CP_OEMCP, 0, wstrcode.c_str(), -1, &resultstring[0], asciisize, NULL, NULL);
if (convresult != asciisize)
{
throw std::exception("La falla!");
}
return std::string(&resultstring[0]);
}
//utf-8 ascii
string UTF_82ASCII(string& strUtf8Code)
{
string strRet("");
// utf8 unicode
wstring wstr = Utf82Unicode(strUtf8Code);
// unicode ascii
strRet = WideByte2Acsi(wstr);
return strRet;
}
///////////////////////////////////////////////////////////////////////
//ascii Unicode
wstring Acsi2WideByte(string& strascii)
{
int widesize = MultiByteToWideChar (CP_ACP, 0, (char*)strascii.c_str(), -1, NULL, 0);
if (widesize == ERROR_NO_UNICODE_TRANSLATION)
{
throw std::exception("Invalid UTF-8 sequence.");
}
if (widesize == 0)
{
throw std::exception("Error in conversion.");
}
std::vector<wchar_t> resultstring(widesize);
int convresult = MultiByteToWideChar (CP_ACP, 0, (char*)strascii.c_str(), -1, &resultstring[0], widesize);
if (convresult != widesize)
{
throw std::exception("La falla!");
}
return std::wstring(&resultstring[0]);
}
//Unicode Utf8
std::string Unicode2Utf8(const std::wstring& widestring)
{
int utf8size = ::WideCharToMultiByte(CP_UTF8, 0, widestring.c_str(), -1, NULL, 0, NULL, NULL);
if (utf8size == 0)
{
throw std::exception("Error in conversion.");
}
std::vector<char> resultstring(utf8size);
int convresult = ::WideCharToMultiByte(CP_UTF8, 0, widestring.c_str(), -1, &resultstring[0], utf8size, NULL, NULL);
if (convresult != utf8size)
{
throw std::exception("La falla!");
}
return std::string(&resultstring[0]);
}
//ascii Utf8
string ASCII2UTF_8(string& strAsciiCode)
{
string strRet("");
// ascii unicode
wstring wstr = Acsi2WideByte(strAsciiCode);
// unicode utf8
strRet = Unicode2Utf8(wstr);
return strRet;
}

좋은 웹페이지 즐겨찾기