我正在努力验证字符串是否为utf8。 我从glib找到了方法g_utf8_validate,它返回:
是否有超出此范围的可能性,并且在非utf8部分之后还获得有效数据?例如:
std::string invalid = "okdata\xa0\xa1morevalid";
Currenlty我能够保存“okdata”,但我想得到“okdatamorevalid”。
有什么想法吗?谢谢。
答案 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;
}