好久没有水贴了,差点不记得论坛密码
这里分享一下如何判断一个字符串编码是否为UTF8
具体做法我随便搜了一下,找到了一段代码,改成C++能在编译期判断的代码
所以,思路不是原创的!后面会附上资料的链接。
C++11/14中有一个新的关键字“constexpr”,这个东西好理解,这里不再赘述。相关资料我也会在后面附上链接。
下面就是代码啦!只能在支持C++14以上的编译器上编译!(vs2015+或者g++5+或者clang6+)
[C++] 纯文本查看 复制代码 #ifdef __cplusplus
# if __cplusplus < 201402L
# error "当前C++编译器不支持C++14或未开启C++14支持"
# endif
#else
# error "请使用C++编译器编译(并且支持C++14)"
#endif
#include <iostream>
inline namespace {
template <size_t L>
constexpr bool IsUTF8(const char (&str)[L]) {
static_assert(L > 1, "老子不检查空字符串");
bool isUTF8{true};
size_t start{};
size_t end{L};
while (start < end) {
// ASCII码
if (str[start] < 0x80) {
++start;
} else if (str[start] < 0xC0) { // 无效UTF8字符
isUTF8 = false;
break;
} else if (str[start] < 0xE0) { // 2字节UTF8字符
if (start >= (end - 1)) {
break;
}
if (str[start+1] & 0xC0 != 0x80) {
isUTF8 = false;
break;
}
start += 2;
} else if (str[start] < 0xF0) { // 3字节UTF8字符
if (start >= (end - 2)) {
break;
}
if (((str[start+1] & 0xC0) != 0x80) ||
((str[start+2] & 0xC0) != 0x80)) {
isUTF8 = false;
break;
}
start += 3;
} else {
isUTF8 = false;
break;
}
}
return isUTF8;
}
}
// 测试是否是编译期计算
template <bool Val>
struct TConst {
constexpr static bool value = Val;
};
int main() {
constexpr char str[]{"测试是不是UTF8字符串"};
constexpr bool isUTF8{TConst<IsUTF8(str)>::value};
std::cout << std::boolalpha << isUTF8 << std::endl;
return 0;
}
电脑坏了,手机上用DCoder编译执行,下面是结果
下面是参考资料:
https://www.cnblogs.com/fnlingnzb-learner/p/5832486.html
https://en.cppreference.com/w/cpp/language/constexpr
https://en.cppreference.com/w/cpp/compiler_support
想看cppreference的中文页面,把链接中的en改成zh
|