吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2299|回复: 6
收起左侧

[C&C++ 转载] C++中编译时期判断字符串编码

[复制链接]
lovingxiaobing 发表于 2019-12-4 18:00
好久没有水贴了,差点不记得论坛密码

这里分享一下如何判断一个字符串编码是否为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编译执行,下面是结果
Screenshot_2019-12-04-17-56-27-05.png

下面是参考资料:
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

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
低调的菜鸡 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

xouou 发表于 2019-12-4 18:35
其实我是沙发  哈哈
芝麻KK 发表于 2019-12-4 19:14
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++的
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-16 17:48

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表