C++ c++;拆下非utf8

C++ c++;拆下非utf8,c++,utf-8,C++,Utf 8,我正在验证字符串是否为utf8。 我从glib中找到了方法,它返回: 对/错 从字符串中读取的最后一个有效数据的位置 除此之外,ge还有可能获得非utf8部分之后的有效数据吗?例如: std::string invalid=“okdata\xa0\xa1morevalid”; 目前,我可以保存“okdata”,但我希望获得“okdatamorevalid” 有什么想法吗?谢谢。您可以继续调用剩余字符串上的g\u utf8\u validate(每次跳过第一个字节),以查找更多有效部分: #

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

  • 对/错
  • 从字符串中读取的最后一个有效数据的位置
除此之外,ge还有可能获得非utf8部分之后的有效数据吗?例如:

std::string invalid=“okdata\xa0\xa1morevalid”;
目前,我可以保存“okdata”,但我希望获得“okdatamorevalid”


有什么想法吗?谢谢。

您可以继续调用剩余字符串上的
g\u utf8\u 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"
}
#包括
#包括
#包括
int main(){
char const*data=“okdata\xa0\xa1morevalid”;
std::字符串s;
//假设字符串以null结尾。
//否则,您必须提前知道长度,将其传递给
//g_utf8_每次迭代验证并减少(pend-p)
//循环条件将保持_size>0,而不是*pend!='\0'。
对于(字符常量*p=data,*pend=data;*pend!='\0';p=pend+1){
g_utf8_验证(p,-1,&pend);
s、 追加(p,pend);
}

std::cout您可以在循环中调用它。类似这样的内容:

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;
}

由于无效数据不是UTF-8,因此您无法对其长度进行假设,并且必须一次跳过一个字节。不幸的是,除非您知道错误数据的原因,但您没有告诉我们。但是,您可以实现“扫描下一个有效字节”您自己。谢谢。我正在确保使用c_str以null结尾,正如我所读到的,c_str可以保证这一点,因为:
const char*toFilter=inputString.c_str();
是的。如果您不想在文本中嵌入null字节,您可以使用上述不变的方法。