문제

유니코드 문자열을 utf-8 또는 utf-16 문자열로 변환하는 방법은 무엇입니까?내 VS2005 프로젝트는 유니코드 문자 세트를 사용하고 있지만 cpp의 sqlite는

int sqlite3_open(
  const char *filename,   /* Database filename (UTF-8) */
  sqlite3 **ppDb          /* OUT: SQLite db handle */
);
int sqlite3_open16(
  const void *filename,   /* Database filename (UTF-16) */
  sqlite3 **ppDb          /* OUT: SQLite db handle */
);

폴더를 열려면문자열, CString 또는 wstring을 UTF-8 또는 UTF-16 문자 집합으로 변환하려면 어떻게 해야 합니까?

매우 감사합니다!

도움이 되었습니까?

해결책

짧은 답변:

CString 또는 wstring과 같은 유니코드 문자열을 사용하는 경우 변환이 필요하지 않습니다.sqlite3_open16()을 사용하세요.WCHAR 포인터(로 캐스팅됨)를 전달해야 합니다. void *.형편없는 것 같아요!이 라이브러리가 크로스 플랫폼이더라도 플랫폼에 따라 다르고 라이브러리보다 덜 비우호적인 넓은 문자 유형을 정의했을 수 있을 것 같습니다. void *)를 API에 추가합니다.CString의 경우: (void*)(LPCWSTR)strFilename

더 긴 대답은 다음과 같습니다.

UTF8 또는 UTF16으로 변환하려는 유니코드 문자열이 없습니다.주어진 인코딩을 사용하여 프로그램에 유니코드 문자열이 표시됩니다.유니코드는 그 자체로 이진 표현이 아닙니다.인코딩은 유니코드 코드 포인트(숫자 값)가 메모리(숫자의 이진 레이아웃)에 어떻게 표현되는지를 나타냅니다.UTF8과 UTF16은 가장 널리 사용되는 인코딩입니다.하지만 그들은 매우 다릅니다.

VS 프로젝트에 "유니코드 문자 집합"이라고 표시되면 실제로는 "문자가 UTF16으로 인코딩됨"을 의미합니다.따라서 sqlite3_open16()을 직접 사용할 수 있습니다.변환이 필요하지 않습니다.문자는 WCHAR 유형으로 저장됩니다. char) 16비트를 사용합니다(표준 C 유형의 폴스백). wchar_t, Win32에서는 16비트를 사용합니다.다른 플랫폼에서는 다를 수 있습니다.수정해주셔서 감사합니다, 체커님).

주의해야 할 세부 사항이 하나 더 있습니다.UTF16은 두 가지 형태로 존재합니다.빅엔디안과 리틀엔디안.이것이 이 16비트의 바이트 순서입니다.UTF16에 대해 제공한 함수 프로토타입은 어떤 순서가 사용되는지 말하지 않습니다.그러나 sqlite가 Windows와 동일한 엔디안을 사용한다고 가정하면 꽤 안전합니다(Little Endian IIRC.나는 순서를 알고 있지만 항상 이름에 문제가 있었습니다 :-)).

편집하다:Checkers의 댓글에 대한 답변:

UTF16은 16비트를 사용합니다. 코드 단위.Win32에서 (그리고 오직 Win32의 경우), wchar_t 그러한 저장 장치로 사용됩니다.비결은 일부 유니코드 문자에는 16비트 코드 단위 2개의 시퀀스가 ​​필요하다는 것입니다.이를 대리 쌍이라고 합니다.

같은 방식으로 UTF8은 1~4바이트 시퀀스를 사용하여 1개의 문자를 나타냅니다.그러나 UTF8은 char 유형.

다른 팁

사용 Widechartomultibyte 기능. 지정하십시오 CP_UTF8CodePage 매개 변수.

CHAR buf[256]; // or whatever
WideCharToMultiByte(
  CP_UTF8, 
  0, 
  StringToConvert, // the string you have
  -1, // length of the string - set -1 to indicate it is null terminated
  buf, // output
  __countof(buf), // size of the buffer in bytes - if you leave it zero the return value is the length required for the output buffer
  NULL,    
  NULL
);

또한 Windows에서 유니 코드 앱의 기본 인코딩은 UTF-16LE이므로 번역을 수행 할 필요가없고 두 번째 버전 만 사용할 필요가 없습니다. sqlite3_open16.

모든 C++ 문자열 유형은 문자 집합 중립적입니다.그들은 단지 문자 폭에만 안주하고 더 이상의 가정을 하지 않습니다.wstring은 Windows에서 대략 utf-16에 해당하는 16비트 문자를 사용하지만 여전히 스레드에 저장하는 내용에 따라 다릅니다.wstring은 입력한 데이터가 유효한 utf16이어야 한다고 강제하지 않습니다.Windows는 UNICODE가 정의된 경우 utf16을 사용하므로 문자열이 이미 utf16일 가능성이 높으므로 아무 작업도 수행할 필요가 없습니다.

몇몇 다른 사람들은 utf16을 utf8로 변환하는 방법 중 하나인 WideCharToMultiByte 함수를 사용할 것을 제안했습니다.그러나 sqlite는 utf16을 처리할 수 있으므로 그럴 필요는 없습니다.

UTF-8 및 UTF-16은 둘 다 "유니 코드"문자 인코딩입니다. 아마도 당신이 말하는 것은 고정 크기의 문자 인코딩 인 UTF-32입니다. 어쩌면 찾고있을 수도 있습니다

"Convert utf-32 into utf-8 or utf-16"

이것에 대한 몇 가지 결과 또는 다른 논문을 제공합니다.

이를 수행하는 가장 간단한 방법은 Cstringa를 사용하는 것입니다. CSTRING 클래스는 CSTRINGA (ASCII 버전) 또는 CSTRINGW (Wide Char 버전)의 typedef입니다. 이 두 클래스에는 문자열 유형을 변환하는 생성자가 있습니다. 나는 일반적으로 사용합니다.

sqlite3_open(CStringA(L"MyWideCharFileName"), ...);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top