MySQL ++ use Unicode on Windows

Source: Internet
Author: User
This is a summary about how to use Unicode with MySQL ++ on Windows OS. [problem] From http://lists.mysql.com/plusplus/5989
hi..i have a problem using Query class from mysqlpp with wchar_t. i hopesomebody can help me with this.i want to insert unicode to table.here is the sample codemysqlpp::Connection con( "test", "localhost",  "test", "" );mysqlpp::Query query = con.query();char *test = "abcdefghij";wchar_t *wtest = L"abcdefghij";query << "INSERT INTO tes VALUES( '" << test << "')";query.execute();query << "INSERT INTO tes VALUES( '" << wtest << "')";query.execute();the char test will gave the right result, 'abcdefghij' inserted to db.but the wchar_t wtest not give the right result, the record filled with'004A00F4'.it seems Query not welcome unicode.so how can I insert unicode using mysqlpp??

[Solution]
From http://tangentsoft.net/mysql++/doc/html/userman/unicode.html6.3. Unicode on Windows

Each Windows API function that takes a string actually comes in two versions. one version supports only 1-Byte "ANSI" characters (a superset of ASCII), so they end in 'A '. windows also supports the 2-byte subset of Unicode called UCS-2. some call these "wide" characters, so the other set of functions end in 'W '. theMessageBox()API, for instance, is actually a macro, not a real function. If you define the Unicode Macro when building your program,MessageBox()Macro evaluatesMessageBoxW(); Otherwise,MessageBoxA().

Since MySQL uses the UTF-8 unicode encoding and Windows uses UCS-2, you must convert data when passing text between MySQL ++ and the Windows API. since there's no point in trying for portability-no other OS I'm aware of uses UCS-2-You might as well use platform-specific functions to do this translation. since version 2.2.2, MySQL ++ ships with two visual c ++ specific examples showing how to do this in a GUI program. (in earlier versions of MySQL ++, we did Unicode conversion in the Console mode programs, but this was unrealistic .)

How you handle Unicode data depends on whether you're using the Native Windows API, or the newer. Net API. First, the native case:

// Convert a C string in UTF-8 format to UCS-2 format.void ToUCS2(LPTSTR pcOut, int nOutLen, const char* kpcIn){  MultiByteToWideChar(CP_UTF8, 0, kpcIn, -1, pcOut, nOutLen);}// Convert a UCS-2 string to C string in UTF-8 format.void ToUTF8(char* pcOut, int nOutLen, LPCWSTR kpcIn){  WideCharToMultiByte(CP_UTF8, 0, kpcIn, -1, pcOut, nOutLen, 0, 0);}

These functions leave out some important error checking, so seeexamples/vstudio/mfc/mfc_dlg.cppFor the complete version.

If you're building a. NET application (such as, perhaps, because you're using Windows Forms), it's better to use the. NET libraries for this:

// Convert a C string in UTF-8 format to a .NET String in UCS-2 format.String^ ToUCS2(const char* utf8){  return gcnew String(utf8, 0, strlen(utf8), System::Text::Encoding::UTF8);}// Convert a .NET String in UCS-2 format to a C string in UTF-8 format.System::Void ToUTF8(char* pcOut, int nOutLen, String^ sIn){  array<Byte>^ bytes = System::Text::Encoding::UTF8->GetBytes(sIn);  nOutLen = Math::Min(nOutLen - 1, bytes->Length);  System::Runtime::InteropServices::Marshal::Copy(bytes, 0,    IntPtr(pcOut), nOutLen);  pcOut[nOutLen] = '/0';}

Unlike the native API versions, these examples are complete, since. NET platform handles a lot of things behind the scenes for us. we don't need any error-Checking code for such simple routines.

All of this assumes you're using Windows NT or one of its direct descendants: Windows 2000, Windows XP, Windows Vista, or any "server" variant of windows. windows 95 and its descendants (98, me, and Ce) do not support UCS-2. they still have the 'W' APIs for compatibility, but they just smash the data down to 8-bit and call the 'A' version for you.

From examples/vstudio/mfc/mfc_dlg.cpp


/// Toucs2 /////////////////////////////////// /////////////////////////

// Convert a C string in the UTF-8 format to the UCS-2 format.

Bool

Cexampledlg: toucs2 (lptstr pcout, int noutlen, const char * kpcin)

{

If (strlen (kpcin)> 0 ){

// Do the conversion normally

Return multibytetowidechar (cp_utf8, 0, kpcin,-1, pcout,

Noutlen)> 0;

}

Else if (noutlen> 1 ){

// Can't distinguish no Bytes copied from an error, so handle

// An empty input string as a special case.

_ Tccpy (pcout, _ T (""));

Return true;

}

Else {

// Not enough room to do anything!

Return false;

}

}

/// Toutf8 /////////////////////////////////// /////////////////////////

// Convert a UCS-2 multibyte string to the UTF-8 format required

// MySQL, and thus MySQL ++.

Bool

Cexampledlg: toutf8 (char * pcout, int noutlen, lpcwstr kpcin)

{

If (_ tcslen (kpcin)> 0 ){

// Do the conversion normally

Return widechartomultibyte (cp_utf8, 0, kpcin,-1, pcout,

Noutlen, 0, 0)> 0;

}

Else if (noutlen> 0 ){

// Can't distinguish no Bytes copied from an error, so handle

// An empty input string as a special case.

* Pcout = '/0 ';

Return true;

}

Else {

// Not enough room to do anything!

Return false;

}

}

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.