Oracle OCISessionGet使用Unicode失败

Oracle OCISessionGet使用Unicode失败,oracle,unicode,utf-16,oracle-call-interface,Oracle,Unicode,Utf 16,Oracle Call Interface,我有以下代码用于连接到Oracle XE DB,该数据库按预期工作: const char *tns = "(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1) (PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=XE)))", *usr = "scott", *pwd = "tiger"; err = OCIEnvNlsCreate(&envhp,OCI_TH

我有以下代码用于连接到Oracle XE DB,该数据库按预期工作:

const char
*tns = "(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)
        (PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=XE)))",
*usr = "scott",
*pwd = "tiger";

err = OCIEnvNlsCreate(&envhp,OCI_THREADED, NULL, NULL, NULL, NULL, (size_t) 0
                     , (void**) NULL, 0, 0);
if(err != OCI_SUCCESS) return true;

err = OCIHandleAlloc(envhp, (void **) &errhp, OCI_HTYPE_ERROR, (size_t) 0
                    , (void **) NULL);
if(err != OCI_SUCCESS) return true;

err = OCIHandleAlloc(envhp,(void**)&authp, OCI_HTYPE_AUTHINFO,(size_t)0
      , (void **) NULL);
if(err != OCI_SUCCESS) return true;
err = OCIAttrSet(authp, OCI_HTYPE_AUTHINFO,(void*) usr,
                 (ub4)strlen(usr),OCI_ATTR_USERNAME, (OCIError *)errhp);
if(err != OCI_SUCCESS) return true;
err = OCIAttrSet(authp, OCI_HTYPE_AUTHINFO,(void*) pwd,
                 (ub4)strlen(pwd),OCI_ATTR_PASSWORD, (OCIError *)errhp);
if(err != OCI_SUCCESS) return true;

err = OCISessionGet(envhp, errhp, &svchp, authp, (OraText*) tns,
                    (ub4)strlen(tns), NULL, 0, NULL, NULL, NULL, OCI_DEFAULT);
if(err != OCI_SUCCESS) {
    checkerr(errhp, err, __LINE__);
    return true;
}
现在我想支持unicode,我更改了以下内容:

err = OCIEnvNlsCreate(&envhp,OCI_THREADED, NULL, NULL, NULL, NULL, (size_t) 0,
                      (void**) NULL, OCI_UTF16ID, OCI_UTF16ID);
现在我在OCISessionGet获得了ORA-12154,所以它不再连接了。我做错了什么


TIA

可能是一个糟糕的Oracle文档,如果您查看dbname for的描述,您会发现这段信息

dbname必须采用上一次调用OCIEnvNlsCreate()的charset参数指定的编码


我猜在这里也是这样,尽管文档中没有说明,所以简短回答UTF编码您的tns字符串

谢谢回复。将字符串转换为UTF16后,出现错误-ORA-12169:TNS:Net作为连接标识符提供的服务名称太长。对于UTF-8,上面给出的TNS字符串是相同的字节。有什么想法吗?如何进行转换?对于utf16,请使用erlang unicode:characters_to_binary/3,然后将字节字符串加载到tns char数组中。是否零终止字符串?i、 e.endutf-8处的零字节和ascii字符串(在我的例子中它们是相同的)都以零结尾,只需检查一下即可。对于UTF-16,我不知道追加零字节是如何应用的,也许我需要添加0x0000(或在末尾添加两个0x00s)——两个都尝试了,但都不起作用,出现了相同的错误