Problem with Unicode Strings

From: André Hartmann <andrehartmann_at_hotmail.com>
Date: Tue, 15 Apr 2008 15:02:35 +0200
Message-ID: <4804a76b$0$631$9b4e6d93@newsspool1.arcor-online.net>


Hi,
  I am having trouble with stuffing in an getting out unicode strings into/from my database. I will briefly describe what I am doing, hoping that someone can point me to a mistake and end my weeks of trying...

  • Oracle 9i client and server, connecting via OCI from a C++ (MS Dev Studio 2005) application
  • Client OS: German Windows XP, SP2
  • Server: Oracle9.2.0.1 Enterprise on Windows XP SP2, NLS_LANGUAGE=AMERICAN
  • Server character set (determined via "select value from nls_database_parameters where parameter='NLS_CHARACTERSET';"): WE8MSWIN1252
  • Client character set GERMAN_GERMANY.WE8MSWIN1252 (determined via "sqlplus /nolog" and @.[%NLS_LANG%])

  What I am doing in my program to stuff unicode in is this:

std::wstring strUnicode(L"Âb穾ü??déñf??"); ...
wchar_t* pValue = (pWS_ == NULL) ? NULL : _wcsdup( strUnicode.c_str() ); size_t nSize = (pValue == NULL) ? 0 : (sizeof(wchar_t) * (1 + wcslen(pValue)));
...
swdReturnCode = OCIBindByPos (
(OCIStmt*) m_pOCIStatement,
(OCIBind**) &pBindHandle,
(OCIError*) m_pConnection->_getOCIError(),
(ub4) columnIndex_,
(dvoid*) pValue,
(sb4) nSize,
(ub2) SQLT_STR,
(dvoid*) NULL,
(ub2*) NULL,
(ub2*) NULL,
(ub4) NULL,
(ub4*) NULL,
(ub4) OCI_DEFAULT

);
ub2 csid = OCI_UTF16ID;
swdReturnCode = OCIAttrSet(
(void *) pBindHandle

, (ub4) OCI_HTYPE_BIND
, (void *) &csid
, (ub4) 0
, (ub4) OCI_ATTR_CHARSET_ID
, m_pConnection->_getOCIError()

);
...

  The string that I am stuffing in corresponds to the following sequence of integers in my program's main memory:

194,98,231,169,190,252,1046,950,100,233,241,102,1715,1492

  When I select I get the following back (displayed as "Âb穾ü¿¿déñf¿¿"):

194,98,231,169,190,252,191,191,100,233,241,102,191,191

  So it turns out that some characters have been transformed to be upsode-down question marks. I see the same thing when I dont fetch with my application but with the Oracle Enterprose Manager.

  What is wrong here? Am I missing out some important conversion on the way? Thanks in advance,
André
:) Received on Tue Apr 15 2008 - 08:02:35 CDT

Original text of this message