c ++删除非utf8

时间:2015-01-20 09:32:59

标签: c++ utf-8

我正在努力验证字符串是否为utf8。 我从glib找到了方法g_utf8_validate,它返回:

  • true / false
  • 从字符串
  • 读取的最后一个有效数据的位置

是否有超出此范围的可能性,并且在非utf8部分之后还获得有效数据?例如:

std::string invalid = "okdata\xa0\xa1morevalid";

Currenlty我能够保存“okdata”,但我想得到“okdatamorevalid”。

有什么想法吗?谢谢。

2 个答案:

答案 0 :(得分:1)

你可以继续在剩下的字符串上调用g_utf8_validate(每次都跳过第一个字节)以找到更多有效的部分:

#include <iostream>
#include <string>

#include <glib.h>

int main() {
  char const *data = "okdata\xa0\xa1morevalid";
  std::string s;

  // Under the assumption that the string is null-terminated.
  // Otherwise you'll have to know the length in advance, pass it to
  // g_utf8_validate and reduce it by (pend - p) every iteration. The
  // loop condition would then be remaining_size > 0 instead of *pend != '\0'.
  for(char const *p = data, *pend = data; *pend != '\0'; p = pend + 1) {
    g_utf8_validate(p, -1, &pend);
    s.append(p, pend);
  }

  std::cout << s << std::endl; // prints "okdatamorevalid"
}

答案 1 :(得分:1)

您可以循环调用它。像这样:

std::string sanitize_utf8(const std::string &in) {
    std::string result;
    const char *ptr = in.data(), *end = ptr + in.size();
    while (true) {
        const char *ptr2;
        g_utf8_validate(ptr, end - ptr, &ptr2);
        result.append(ptr, ptr2);
        if (ptr2 == end)
            break;
        ptr = ptr2 + 1;
    }
    return result;
}