C++中文字符转换问题

这篇具有很好参考价值的文章主要介绍了C++中文字符转换问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在VC++中通过sqlite3.dll接口对sqlite数据库进行操作,包括打开数据库,插入,查询数据库等,如果操作接口输入参数包含中文字符,会导致操作异常。例如调用sqlite3_open打开数据库文件,如果文件路径出现中文,就会导致打开失败。sqlite3_exec执行sql语句,如果包含中文对应字符就会变成乱码。或者查询数据出来后,由于sqlite3数据库数据存储用的是utf-8字符集,因此读到中文乱码。

因此对C++中文字符转换进行总结。

1、UTF-8转Unicode 

2、unicode 转为 ascii 

3、utf-8 转ascii

4、ascii 转 utf-8文章来源地址https://www.toymoban.com/news/detail-727030.html

 
//UTF-8转Unicode 
std::wstring Utf82Unicode(const std::string& utf8string) 
{ 
int widesize = ::MultiByteToWideChar(CP_UTF8, 0, utf8string.c_str(), -1, NULL, 0); 
if (widesize == ERROR_NO_UNICODE_TRANSLATION) 
{ 
throw std::exception("Invalid UTF-8 sequence."); 
} 
if (widesize == 0) 
{ 
throw std::exception("Error in conversion."); 
} 
std::vector<wchar_t> resultstring(widesize); 
int convresult = ::MultiByteToWideChar(CP_UTF8, 0, utf8string.c_str(), -1, &resultstring[0], widesize); 
if (convresult != widesize) 
{ 
throw std::exception("La falla!"); 
} 
return std::wstring(&resultstring[0]); 
} 
//unicode 转为 ascii 
string WideByte2Acsi(wstring& wstrcode) 
{ 
int asciisize = ::WideCharToMultiByte(CP_OEMCP, 0, wstrcode.c_str(), -1, NULL, 0, NULL, NULL); 
if (asciisize == ERROR_NO_UNICODE_TRANSLATION) 
{ 
throw std::exception("Invalid UTF-8 sequence."); 
} 
if (asciisize == 0) 
{ 
throw std::exception("Error in conversion."); 
} 
std::vector<char> resultstring(asciisize); 
int convresult =::WideCharToMultiByte(CP_OEMCP, 0, wstrcode.c_str(), -1, &resultstring[0], asciisize, NULL, NULL); 
if (convresult != asciisize) 
{ 
throw std::exception("La falla!"); 
} 
return std::string(&resultstring[0]); 
} 
//utf-8 转 ascii 
string UTF_82ASCII(string& strUtf8Code) 
{ 
string strRet(""); 
//先把 utf8 转为 unicode 
wstring wstr = Utf82Unicode(strUtf8Code); 
//最后把 unicode 转为 ascii 
strRet = WideByte2Acsi(wstr); 
return strRet; 
} 
/// 
//ascii 转 Unicode 
wstring Acsi2WideByte(string& strascii) 
{ 
int widesize = MultiByteToWideChar (CP_ACP, 0, (char*)strascii.c_str(), -1, NULL, 0); 
if (widesize == ERROR_NO_UNICODE_TRANSLATION) 
{ 
throw std::exception("Invalid UTF-8 sequence."); 
} 
if (widesize == 0) 
{ 
throw std::exception("Error in conversion."); 
} 
std::vector<wchar_t> resultstring(widesize); 
int convresult = MultiByteToWideChar (CP_ACP, 0, (char*)strascii.c_str(), -1, &resultstring[0], widesize); 
if (convresult != widesize) 
{ 
throw std::exception("La falla!"); 
} 
return std::wstring(&resultstring[0]); 
} 
//Unicode 转 Utf8 
std::string Unicode2Utf8(const std::wstring& widestring) 
{ 
int utf8size = ::WideCharToMultiByte(CP_UTF8, 0, widestring.c_str(), -1, NULL, 0, NULL, NULL); 
if (utf8size == 0) 
{ 
throw std::exception("Error in conversion."); 
} 
std::vector<char> resultstring(utf8size); 
int convresult = ::WideCharToMultiByte(CP_UTF8, 0, widestring.c_str(), -1, &resultstring[0], utf8size, NULL, NULL); 
if (convresult != utf8size) 
{ 
throw std::exception("La falla!"); 
} 
return std::string(&resultstring[0]); 
} 
//ascii 转 Utf8 
string ASCII2UTF_8(string& strAsciiCode) 
{ 
string strRet(""); 
//先把 ascii 转为 unicode 
wstring wstr = Acsi2WideByte(strAsciiCode); 
//最后把 unicode 转为 utf8 
strRet = Unicode2Utf8(wstr); 
return strRet; 
} 

到了这里,关于C++中文字符转换问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【问题解决】mysql 数据库字符串分割之后多行输出方法

    项目需要从一张表查询出来数据插入到另一张表,其中有一个字段是用逗号分隔的字符串,需要多行输入到另一张表,那么这个如何实现呢 下面先粘贴下sql语句: 参数解释 1.SUBSTRING_INDEX(str, delimiter, count)     参数解释     str :必填。STRING类型。待截取的字符串     separat

    2024年02月14日
    浏览(48)
  • GBASE南大通用数据库GBase 8s常见问题讲堂 -- 字符集的设置

    本文摘自GBASE南大通用社区,by:wty,原文请点击:GBase 8s常见问题 -- 字符集相关问题|GBASE社区|天津南大通用数据技术股份有限公司|GBASE-致力于成为用户最信赖的数据库产品供应商 23103   Code-set conversion function failed due to an illegal sequence or invalid value. 字符集转换失败,字符串中

    2024年01月24日
    浏览(61)
  • 数据库编码 问题 mysql 修改字符集为utf8mb4

    数据库编码 问题 mysql 修改字符集为utf8mb4 问题 ; 当向数据库插入表,或者在表中插入数据时,出现 ERROR 1366 (HY000): Incorrect string value: ‘xBDxF0xD3xB9’ for column ‘name’ at row 1 原因 数据库编码方式 和 表编码方式 以及 插入数据(字符串)的编码方式不同 我们可以查看建表,

    2023年04月08日
    浏览(46)
  • 再相逢【知识图谱】中文医学知识图谱CMeKG,中文产科医学知识图谱COKG | 附:图数据库Neo4j下载安装教学(遇到问题并解决) + Neo4j基本操作

      无论结果如何,请相信那些你努力游向岸的日子都有它的意义。   🎯 作者主页 : 追光者♂ 🔥          🌸 个人简介 : 计算机专业硕士研究生 💖、 2022年CSDN博客之星人工智能领域TOP4 🌟、 阿里云社区特邀专家博主 🏅、 CSDN-人工智能领域新星创作者 🏆、 预期20

    2024年02月14日
    浏览(82)
  • GPT应用-使用中文操作数据库

    本次尝试使用langchain来操作数据库; 下面是数据库相关的表,使用Mysql5.7 数据库,数据库名students 下面是相关表的介绍 学生表,有名字、分数、和老师的备注 学生父母表,其中有学生的名字,父母的电话 下面是notebook 内容的相关介绍 安装langchain和pymysql依赖 配置OPENAI_API_KE

    2024年02月07日
    浏览(44)
  • MySQL 数据库全局变量中文解释

    Name Value auto_increment_increment AUTO_INCREMENT 字段值的自增长步长值。 auto_increment_offset AUTO_INCREMENT 字段值的初始值。 autocommit 指示新连接的默认提交模式是否启用。 automatic_sp_privileges 控制是否在存储过程上创建或更改时自动分配特定权限。 back_log 在开始拒绝新连接之前,等待处理

    2024年02月07日
    浏览(45)
  • 数据库之MySQL字符集与数据库操作

    目录 字符集 CHRARCTER SET 与COLLATION的关联 CHRARCTER SET 定义 基础操作         查看当前MySQL Server支持的 CHARACTER SET         查看特定字符集信息(主要包含默认的COLLATION 与 MAXLEN) COLLATION 定义 COLLATION后缀 基础操作         查看MySQL Server支持的COLLATION MySQL Ser

    2024年02月13日
    浏览(46)
  • 数据库系统概念 第七版 中文答案 第2章 关系模型介绍

    2.1 考虑图 2.17 中的员工数据库。 这些关系上适当的主码是什么 ? Answer: 相应的主键如下所示: 2.2 考虑从 instructor 的 dept_name 属性到   department 关系的 外键约束 。 请给出对这些关系的插入和删除的示例,使得它们破坏该外码约束。 Answer: 插入元组: (10111,   Ostrom, Econ omics,  

    2024年02月02日
    浏览(46)
  • 数据库系统概念 第七版 中文答案 第3章 SQL介绍

      a. 查找计算机科学系中学分为3的课程的标题。 b. 查找所有由名为Einstein的教师教授的学生的ID;确保结果中没有重复项。 c. 查找任何教师的最高工资。 d. 查找所有薪水最高的教师(可能有多个薪水相同的教师)。 e. 查找在2017年秋季开设的每个课程部分的注册人数。 f. 查

    2024年01月22日
    浏览(51)
  • GaussDB数据库SQL系列-行列转换

    一、前言 二、简述 1、行转列概念 2、列转行概念 三、GaussDB数据库的行列转行实验示例 1、行转列示例 1)创建实验表(行存表) 2)静态行转列 3)行转列(结果值:拼接式) 4)动态行转列(拼接SQL式) 2、列转行示例 1)创建实验表(复用前面的测试数据) 2)使用union a

    2024年02月10日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包