首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用c api在openldap中插入utf-8数据

用c api在openldap中插入utf-8数据
EN

Stack Overflow用户
提问于 2015-05-07 20:36:28
回答 1查看 403关注 0票数 0

在openldap数据库中插入utf-8数据的正确方法是什么?我在std::wstring中有数据,其中utf-8用:

代码语言:javascript
复制
std::wstring converted = boost::locale::conv::to_utf<wchar_t>(line, "Latin1");

当字符串需要添加一个ldapMod结构时,我使用以下函数:

代码语言:javascript
复制
std::string str8(const std::wstring& s) {
  return boost::locale::conv::utf_to_utf<char>(s);
}

从wstring转换到字符串。这在我的函数中被用来创建一个LDAPMod:

代码语言:javascript
复制
LDAPMod ** y::ldap::server::createMods(dataset& values) {
  LDAPMod ** mods = new LDAPMod*[values.elms() + 1];
  mods[values.elms()] = NULL;

  for(int i = 0; i < values.elms(); i++) {
    mods[i] = new LDAPMod;
    data & d = values.get(i);

    switch (d.getType()) {
      case NEW: mods[i]->mod_op = 0; break;
      case ADD: mods[i]->mod_op = LDAP_MOD_ADD; break;
      case MODIFY: mods[i]->mod_op = LDAP_MOD_REPLACE; break;
      case DELETE: mods[i]->mod_op = LDAP_MOD_DELETE; break;
      default: assert(false);
    }

    std::string type = str8(d.getValue(L"type"));
    mods[i]->mod_type = new char[type.size() + 1];
    std::copy(type.begin(), type.end(), mods[i]->mod_type);
    mods[i]->mod_type[type.size()] = '\0';

    mods[i]->mod_vals.modv_strvals = new char*[d.elms(L"values") + 1];
    for(int j = 0; j < d.elms(L"values"); j++) {
      std::string value = str8(d.getValue(L"values", j));
      mods[i]->mod_vals.modv_strvals[j] = new char[value.size() + 1];
      std::copy(value.begin(), value.end(), mods[i]->mod_vals.modv_strvals[j]);
      mods[i]->mod_vals.modv_strvals[j][value.size()] = '\0';
    }

    mods[i]->mod_vals.modv_strvals[d.elms(L"values")] = NULL;
  }

  return mods;
}

生成的LDAPMod将传递给ldap_modify_ext_s,只要我只使用ASCII字符即可工作。但是,如果字符串中存在其他字符,则会出现ldap操作错误。

我也用ldap库(ldap_x_wcs_to_utf8s)提供的函数进行了尝试,但结果与boost转换相同。

并不是转换本身是错误的,因为如果我将修改转换回std::wstring并在程序输出中显示它,那么编码仍然是正确的。

AFAIK openldap支持utf-8已经很久了,所以我想知道在这之前是否还需要做些什么呢?

我看过openldap客户机/工具示例,但是库提供的utf-8函数从未在其中使用过。

更新:我注意到我可以在Apache的中插入像é这样的utf-8字符。我可以在我的c++程序中从ldap检索这些值。但是,如果我再次插入相同的字符,而不将任何内容更改为该字符串,则会再次得到ldap操作错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-10 11:06:01

结果发现我的代码一点也不错误。我的修改试图将全名存储在'displayName‘字段以及'gecos’中。但是很明显,'gecos‘不能处理utf8数据。

我们不再使用gecos了。值之所以存在,只是因为我们几年前使用了一些软件,所以我将其从目录中删除。

之所以很难找到的原因是,即使将日志级别设置为“解析”,但日志中仍然没有出现此错误。

因为libldap可能是一个很难破解的难题,我将包括一个链接到我正在处理的项目的完整代码。对于其他程序员来说,这可能是一个起点。(我在教程中发现的大部分代码都过时了。)

https://github.com/yvanvds/yATools/tree/master/libadmintools/ldap

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30111189

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档