C++ CSV 中文 乱码 UTF-8 ANSI

要正确读取包含中文字符的CSV文件,需要确保文件是以UTF-8编码保存的,并且在读取文件时正确处理编码。使用 std::wifstream 并设置其字节流的编码方式可以解决乱码问题。以下是修改后的代码:

代码说明:

  1. 设置UTF-8编码

    • 使用 std::localestd::codecvt_utf8<wchar_t> 设置文件流为UTF-8编码。这确保了在读取包含中文字符的文件时,字符能够正确解码。
  2. 读取CSV文件

    • 读取文件的每一行,并将其分割成键和值。
    • 将键字符串转换为 long 型,并将键值对存储在 g_TextCode 中。
  3. 错误处理

    • 在转换键字符串时,如果发生 std::invalid_argumentstd::out_of_range 异常,记录错误并继续处理下一行。
#include <unordered_map>
#include <string>
#include <fstream>
#include <sstream>
#include <iostream>
#include <locale>
#include <codecvt>static const std::wstring TextCodeDataName = L"code.csv";
std::unordered_map<long, std::wstring> g_TextCode;
static bool isTextInit = false;bool Init()
{std::wstring binpathstr{L"e:/" };binpathstr += TextCodeDataName;std::wifstream file(binpathstr);if (!file.is_open()) {std::wcerr << L"无法打开文件: " << binpathstr << std::endl;return false;}// 设置文件流使用UTF-8编码file.imbue(std::locale(file.getloc(), new std::codecvt_utf8<wchar_t>));std::wstring line;while (std::getline(file, line)) {std::wstringstream linestream(line);std::wstring keyStr, value;if (std::getline(linestream, keyStr, L',') && std::getline(linestream, value)) {try {long key = std::stol(keyStr);g_TextCode[key] = value;}catch (const std::invalid_argument&) {std::wcerr << L"CSV文件中无效的键: " << keyStr << std::endl;continue;}catch (const std::out_of_range&) {std::wcerr << L"CSV文件中超出范围的键: " << keyStr << std::endl;continue;}}}file.close();isTextInit = true;return isTextInit;
}

这种方法确保了从UTF-8编码的CSV文件中读取中文字符时不会出现乱码问题。如果文件已经是UTF-8编码的,这段代码应该能正确读取并处理文件内容。

添加一个辅助函数用于ANSI到宽字符(wchar_t)的转换:

std::wstring AnsiToWString(const std::string& str)
{int len;int slength = static_cast<int>(str.length()) + 1;len = MultiByteToWideChar(CP_ACP, 0, str.c_str(), slength, 0, 0);std::wstring wstr(len, L'\0');MultiByteToWideChar(CP_ACP, 0, str.c_str(), slength, &wstr[0], len);return wstr;
}
    std::string line;while (std::getline(file, line)) {std::wstring wline = AnsiToWString(line);std::wstringstream linestream(wline);std::wstring keyStr, value;if (std::getline(linestream, keyStr, L',') && std::getline(linestream, value)) {try {long key = std::stol(keyStr);g_TextCode[key] = value;}catch (const std::invalid_argument&) {std::wcerr << L"CSV文件中无效的键: " << keyStr << std::endl;continue;}catch (const std::out_of_range&) {std::wcerr << L"CSV文件中超出范围的键: " << keyStr << std::endl;continue;}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/18186.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学至乎没而后止也

开场白 学至后没而后止也这个题目的原话来自与荀子《劝学》。大家知道什么意思吗&#xff1f;学习要学到你人没了&#xff0c;才算停止了。通俗点说就是只要没学死就往死里学&#xff0c;高雅点说就是要保持终身学习。 在以前说终身学习好像是一种良好习惯或品德&#xff0c;…

43-2 Linux入侵排查实验

环境准备: 老规则,我没有靶场就自己搭建了类似, 这里准备一台CentOS 7虚拟机作为受害者,然后使用CS制作木马并在受害者主机上线,具体过程可以看我之前写的一篇文章: 黑客必备利器:如何在系统上安装和使用 CobaltStrike(简称:CS)_cobalt strike-CSDN博客 最终的效果…

Go语言数据库框架 — Gorm

Go入门之Gorm 框架_go gorm-CSDN博客 https://zhuanlan.zhihu.com/p/677057361 一、简介 Gorm框使用ORM技术&#xff0c;将对象(O)和关系数据库(R)之间的映射(M)抽象出来&#xff0c;开发者通过操作对象的方式操作数据库&#xff0c;不需要直接处理SQL语句&#xff0c;降低了…

CANDela studio之CDDT与CDD

CDDT有更高的权限&#xff0c;作为模板规范CDD文件。 CDD可修改的内容比CDDT少。 CDDT根据诊断协议提供诊断格式&#xff0c;主要就是分类服务和定义服务&#xff0c;一般是OEM释放&#xff0c;然后由供应商细化成自己零部件的CDD文件。 在这里举个例子&#xff0c;OEM在CDDT…

Java | Leetcode Java题解之第117题填充每个节点的下一个右侧节点指针II

题目&#xff1a; 题解&#xff1a; class Solution {Node last null, nextStart null;public Node connect(Node root) {if (root null) {return null;}Node start root;while (start ! null) {last null;nextStart null;for (Node p start; p ! null; p p.next) {if…

编译链接问题

问题描述 C语言在编译的时候&#xff0c;提示链接的时候没有找到相应的方法 问题分析 代码文件结构&#xff1a; test.c test/1.c test/1.h test.c代码&#xff1a; #include “test/1.h” void main() { hello(); } test/1.c代码&#xff1a; void hello() { printf(“hel…

AIGC中国开发者大会:AI Agent中国落地发展现状及多模态结合具身智能的发展展望

引言 2024年5月25日&#xff0c;第三届AIGC中国开发者大会在昆仑巢成功举办。本次大会围绕“AI Agent的国内应用现状及多模态结合具身智能的发展展望”这一主题&#xff0c;邀请了多位知名企业家、投资人以及技术专家&#xff0c;共同探讨大模型在中国各行各业的应用现状及未来…

AURIX TC3xx单片机介绍-启动过程介绍3

如下的内容是英文为主,对于TC3xx芯片启动原理不清楚的,可以给我留言,我来解答你们的问题! 3.2.1 Reset类型识别 Reset类型的识别是用来判断上次的复位是Application Reset还是System Reset还是CPU0 Reset。基于复位的原因,启动软件会运行不同的分支逻辑。复位原因可以通…

文章结尾,铺垫下一章带来的期待

你是否容易在阅读时打瞌睡? 是否有很多买回来的书,放在书架上一年甚至几年都未读完,积满了灰尘? 但是,对于小说和电视剧,你却完全停不下来。每集片尾的预告激发了你持续观看下一集的渴望,带来了无限的期待…… 当你撰写文章或编写工具书时,内容可能呈现出乏味的面貌…

Web前端发射爱心:揭秘技术与创意的交融之旅

Web前端发射爱心&#xff1a;揭秘技术与创意的交融之旅 在数字化的世界中&#xff0c;Web前端技术如同一位巧手的魔术师&#xff0c;将代码转化为绚丽多彩的界面&#xff0c;让用户感受到前所未有的体验。而今天&#xff0c;我们将踏上一段特别的旅程&#xff0c;探索如何使用…

pelican,一个超强的 Python 库!

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个超强的 Python 库 - pelican。 Github地址&#xff1a;https://github.com/getpelican/pelican 在当今数字化时代&#xff0c;博客已经成为个人和企业分享信息、展示成果的重要途径。静态网站…

React:构建Web应用的未来

引言 在不断发展的Web开发领域&#xff0c;React已经成为一股主导力量&#xff0c;重塑了我们构建用户界面和交互式应用的方式。React由Facebook&#xff08;现Meta&#xff09;开发&#xff0c;由于其创新的基于组件的架构、高效的虚拟DOM渲染和声明式编程风格而广受欢迎。在…

熵值法(熵权法)

熵值法&#xff08;Entropy Method&#xff09;是一种多属性决策分析方法&#xff0c;主要用于权重确定、排序和评价。它在风险评估、资源配置、环境管理等领域得到广泛应用。熵值法的核心思想是基于信息熵的概念&#xff0c;利用信息熵来度量各属性对决策的贡献程度&#xff0…

深入解析WordPress常用的函数、方法

WordPress 是一个广泛使用的内容管理系统&#xff08;CMS&#xff09;&#xff0c;其灵活性和扩展性使其成为创建和管理网站的首选。为了充分利用 WordPress 的功能&#xff0c;了解其常用的函数和方法是必不可少的。本文将深入解析一些最常用和最有用的 WordPress 函数和方法&…

FME学习之旅---day28

我们付出一些成本&#xff0c;时间的或者其他&#xff0c;最终总能收获一些什么。 教程&#xff1a;CSV 入门 逗号分隔值 &#xff08;CSV&#xff09; 是一种以 ASCII 文件格式存储结构化信息的方法&#xff0c;从而使其成为一个非常简单的数据库。这使其成为电子表格、数据…

【busybox记录】【shell指令】link

目录 内容来源&#xff1a; 【GUN】【link】指令介绍 【busybox】【link】指令介绍 【linux】【link】指令介绍 使用示例&#xff1a; Link 只能用来创建硬链接&#xff0c;更多的指令请查看ln 常用组合指令&#xff1a; 指令不常用/组合用法还需继续挖掘&#xff1a; …

【Qt秘籍】[004]-Qt中的重要工具-介绍

QtCreator概览 当我们打开系统的菜单翻到刚刚下载的Qt文件&#xff0c;里面的内容却让我们眼花缭乱。 不过别急&#xff0c;下面我们将一一解析。 1.Assistant Qt自带的离线版本官方文档 2.Designer Qt图形化设计界面的工具&#xff0c;通过拖拽控件快速生成界面&#xff0c…

Linux 基础笔记(一)

1.ctrl A : 到开头位置&#xff1b; 2.CtrlE : 到结尾位置&#xff1b; 3.ctrlU: 删除光标前内容&#xff1b; 4.ctrlK&#xff1a;删除光标后内容&#xff1b; 5.ctrlL: 清屏&#xff1b; 6.ctrlC&#xff1a;结束当前命令操作&#xff1b; 7.ctrlD&#xff1a;退出当…

2024 最新版 Navicat 17 下载与安装步骤及演示 (图文版)

Navicat 是一款专业的数据库管理工具&#xff0c;支持多种数据库类型&#xff0c;包括 MySQL、Oracle、SQL Server、PostgreSQL、MariaDB、Redis、MongoDB 和 SQLite。Navicat17包含的版本如下Navicat Premium 17, Navicat 17 for MySQL, Navicat 17 for Oracle, Navicat 17 fo…

MySQL之创建高性能的索引(五)

创建高性能的索引 多列索引 很多人对多列索引的理解都不够。一个常见的错误就是&#xff0c;为每个列创建独立的索引&#xff0c;或者按照错误的顺序创建多列索引。先来看第一个问题&#xff0c;为每个列创建独立的索引&#xff0c;从SHOW CREATE TABLE总很容易看到这种情况:…