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

我现在需要从一个 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;
        }

    }
}

附带一些有关链接

阅读 5.7k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题