C++ 如何从将遍历带中文的字符串呢?

发布于 2022-09-12 04:13:54 字数 1474 浏览 32 评论 0

我现在需要从一个 utf-8 文件中读取文本内容,然后将文件内容读入到 std::string中。
但是由于 u8 中文字符的长度是不定的,处理起来相当麻烦,而且还要区分 带 bom 的和不带 bom 的文件。

请问也没有更简单一点的,遍历带中文字符串的方法呢?即使是用宽字符看起来也没有用,而且 cout u8 字符串的时候,在 chcp 936 下还会乱码。。。

我目前只处理了三个字节长度的中文,而代码已经很长了:

void output(char ch, bool r = false){
    // 缓存 3 个字节再输出
    // r 代表逆序传入字符
    static char hans[3];
    static char bom[3]{
            (char )0xef,(char)0xbb, (char)0xbf
    };
    static char rbom[3]{
            (char)0xbf, (char)(0xbb), (char)0xef
    };
    if(r){
        static int num = 2;
        hans[num] = ch;
        --num;
        if( !num ){ // 当 num 为0时
            if( strcmp(hans, rbom) ) // 当字符串与 bom 不同时
            {
                if( (int)hans[2] >= 0x80 ){
                    swap(hans[0], hans[2]);
                    cout<<hans;
                }
                num = 2;
            }
        }
    }else{
        static int num = 0;
        hans[num] = ch;
        ++num;
        if( num == 2){
            if( strcmp(hans, bom) ) // 当 字符串与 bom 不同时
                cout<<hans;
            num = 0;
        }

    }
}

附带一些有关链接

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文