You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中使用流处理中文时无法逐字符读取汉字的问题求助

解决C++读取中文汉字并统计出现次数的问题

你的代码无法正确读取汉字的核心原因有两个:

  • istringstream >> string 是按空白符分割字符串,不是逐字符读取;且中文在UTF-8编码下是多字节字符(通常3字节/汉字),char类型只能存储单字节,直接读取会把汉字拆分成零散的乱码字节。
  • 控制台输出编码与代码文件编码不匹配,也会导致显示乱码。

下面提供两种可行的解决方案:

方案一:使用宽字符流(适配UTF-16/GBK等宽字符编码)

宽字符类型wchar_t可以完整存储单个汉字,配合wistringstream、wstring和wcout实现正确读取与输出:

#include <iostream>
#include <sstream>
#include <map>
#include <windows.h> // Windows下需包含,用于设置控制台编码

int main() {
    // Windows下设置控制台输出编码为UTF-8,避免乱码
    SetConsoleOutputCP(CP_UTF8);
    // 宽字符字符串与流
    std::wistringstream iss(L"你是中国你是中国人");
    std::wstring character;
    // 统计汉字出现次数的map
    std::map<std::wstring, int> charCount;

    // 逐宽字符读取(每个wchar_t对应一个汉字)
    wchar_t wc;
    while (iss.get(wc)) {
        character = wc;
        std::wcout << character << std::endl;
        charCount[character]++;
    }

    // 输出统计结果
    std::wcout << L"\n汉字统计结果:" << std::endl;
    for (auto& pair : charCount) {
        std::wcout << pair.first << L": " << pair.second << L"次" << std::endl;
    }

    return 0;
}

方案二:直接处理UTF-8多字节字符(适配UTF-8编码环境)

如果你的代码文件和运行环境都是UTF-8编码,可以直接解析多字节序列,提取完整的汉字:

#include <iostream>
#include <sstream>
#include <map>
#include <string>

// 从UTF-8字符串中提取下一个完整汉字
std::string getNextUtf8Char(const std::string& str, size_t& pos) {
    if (pos >= str.size()) return "";
    unsigned char c = static_cast<unsigned char>(str[pos]);
    int len = 0;
    // 判断UTF-8字符的字节长度(汉字通常是3字节)
    if ((c & 0xE0) == 0xE0) len = 3;
    else if ((c & 0xF0) == 0xF0) len = 4; // 极少生僻字是4字节
    else if ((c & 0xC0) == 0xC0) len = 2; // 中文标点等
    else len = 1; // ASCII字符

    std::string result = str.substr(pos, len);
    pos += len;
    return result;
}

int main() {
    // 设置控制台输出UTF-8(Linux/macOS默认支持,Windows需执行chcp 65001或代码设置)
    #ifdef _WIN32
        system("chcp 65001 > nul");
    #endif

    std::istringstream iss("你是中国你是中国人");
    std::string content((std::istreambuf_iterator<char>(iss)), std::istreambuf_iterator<char>());
    std::map<std::string, int> charCount;
    size_t pos = 0;

    while (pos < content.size()) {
        std::string character = getNextUtf8Char(content, pos);
        std::cout << character << std::endl;
        charCount[character]++;
    }

    // 输出统计结果
    std::cout << "\n汉字统计结果:" << std::endl;
    for (auto& pair : charCount) {
        std::cout << pair.first << ": " << pair.second << "次" << std::endl;
    }

    return 0;
}

注意事项

  • 确保代码文件的编码与运行环境的控制台编码一致(建议统一用UTF-8)。
  • Windows环境下,若使用宽字符方案,需注意L""前缀表示宽字符字面量;若使用UTF-8方案,可通过chcp 65001命令切换控制台编码。

内容的提问来源于stack exchange,提问作者user21477725

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 09:25:15