在openldap数据库中插入utf-8数据的正确方法是什么?我在std::wstring中有数据,其中utf-8用:
std::wstring converted = boost::locale::conv::to_utf<wchar_t>(line, "Latin1");当字符串需要添加一个ldapMod结构时,我使用以下函数:
std::string str8(const std::wstring& s) {
  return boost::locale::conv::utf_to_utf<char>(s);
}从wstring转换到字符串。这在我的函数中被用来创建一个LDAPMod:
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操作错误。
发布于 2015-05-10 11:06:01
结果发现我的代码一点也不错误。我的修改试图将全名存储在'displayName‘字段以及'gecos’中。但是很明显,'gecos‘不能处理utf8数据。
我们不再使用gecos了。值之所以存在,只是因为我们几年前使用了一些软件,所以我将其从目录中删除。
之所以很难找到的原因是,即使将日志级别设置为“解析”,但日志中仍然没有出现此错误。
因为libldap可能是一个很难破解的难题,我将包括一个链接到我正在处理的项目的完整代码。对于其他程序员来说,这可能是一个起点。(我在教程中发现的大部分代码都过时了。)
https://github.com/yvanvds/yATools/tree/master/libadmintools/ldap
https://stackoverflow.com/questions/30111189
复制相似问题