lovingxiaobing 发表于 2019-12-4 18:00

C++中编译时期判断字符串编码

好久没有水贴了,差点不记得论坛密码

这里分享一下如何判断一个字符串编码是否为UTF8

具体做法我随便搜了一下,找到了一段代码,改成C++能在编译期判断的代码
所以,思路不是原创的!后面会附上资料的链接。

C++11/14中有一个新的关键字“constexpr”,这个东西好理解,这里不再赘述。相关资料我也会在后面附上链接。

下面就是代码啦!只能在支持C++14以上的编译器上编译!(vs2015+或者g++5+或者clang6+)

#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)) {
    static_assert(L > 1, "老子不检查空字符串");
    bool isUTF8{true};
    size_t start{};
    size_t end{L};
   
    while (start < end) {
      // ASCII码
      if (str < 0x80) {
      ++start;
      } else if (str < 0xC0) { // 无效UTF8字符
      isUTF8 = false;
      break;
      } else if (str < 0xE0) { // 2字节UTF8字符
      if (start >= (end - 1)) {
          break;
      }
      if (str & 0xC0 != 0x80) {
          isUTF8 = false;
          break;
      }
      start += 2;
      } else if (str < 0xF0) { // 3字节UTF8字符
      if (start >= (end - 2)) {
          break;
      }
      if (((str & 0xC0) != 0x80) ||
            ((str & 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

xouou 发表于 2019-12-4 18:35

其实我是沙发哈哈

芝麻KK 发表于 2019-12-4 19:14

C++好难啊楼主

hgzyyl 发表于 2019-12-4 19:18

谢谢分享宝贵经验

xfmjn 发表于 2019-12-4 19:33

编码这个鬼,,,

intel286 发表于 2019-12-4 19:47

牛牛在手机上跑C++

低调的菜鸡 发表于 2019-12-4 21:46

顶一顶楼主,俺也是学c++的{:1_918:}
页: [1]
查看完整版本: C++中编译时期判断字符串编码