首页 > 编程语言 >c++中文编码问题

c++中文编码问题

时间:2024-05-06 17:37:16浏览次数:18  
标签:编码 中文 utf8 c++ 源文件 ansi QString osgPath

std::string或者const char*,本质上都是二进制,不包含编码属性,其编码信息来源于赋值语句,

QString以utf16编码,默认构造或赋值的字面量假定为utf8,若是其它编码比如ansi,可以调用QString::fromLocal8bit

一、字面量的编码取决于文件,即如果在c++源文件中有直接赋值

1)、const char* s="中文";或者std::string str="中文",该源文件是什么编码,则结果就是什么编码。

2)、QString默认以utf-16编码,默认赋值假定为utf8,即:若源文件为utf8编码,则QString qStr="中文"

  若源文件为ansi,则QString qStr=QString::fromLocal8bit(”中文")

可以用记事本打开源文件,点另存为

二、printf和std::cout的编码取决于codepage,windows默认为ansi,查看方式,点左上角,属性

控制台应用,可以通过在main开始处设置utf8:

system("chcp 65001");//utf-8

三、main的argv到底是什么编码----ansi,无论调用system("chcp 65001")否。

四、调试过程中只能显示ansi,如果const char* 或者std::string编码为utf8,调试显示会乱码

解决方式:可在watch中查看该变量,后加",s8"

五、qt 5.15 后,QString::toStdString()和qDebug()默认调用toUtf8(),即将utf16转换为utf8。

  QTextCodec::setCodecForLocale只对QString::toLocalUtf8发生作用,

  中文操作系统默认: QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));

六、gdal:

  CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "YES/NO");

  若为YES,则假定函数接收的路径变量为utf8编码的,否则为ansi的。

七、osg:

  若在CMake编译的时候就选择OSG_USE_UTF8_FILENAME选项,则osgdb命名空间里read write路径均假定为utf8,否则为ansi

例:

int main(int argc, char* argv[]) {
#if 1
CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "YES");
GDALAllRegister();
//system("chcp 65001");

if (argc < 10)return 0;
//因为argv编码与源文件编码无关,一定为ansi,而qstring赋值语句默认接受utf8,因此需调用fromLocal8Bit
QString tiffPath =QString::fromLocal8Bit( argv[10]);//假定tiff路径存在命令行第10个参数中
//qDebug()解码为utf8
qDebug() << tiffPath.toStdString().c_str();
//tiffPath为utf16编码,toStdString默认调用toUtf8,则接受的输入符合GDAL_FILENAME_IS_UTF8=YES
GDALDataset* tiffDs=(GDALDataset *) GDALOpen(tiffPath.toStdString().c_str(), GDALAccess::GA_ReadOnly);

////一、源文件为utf编码时:
////因为源文件是utf8编码,则osgPath也是utf8编码,此时调试osgPath显示乱码,可watch ,s8
//std::string osgPath = "D:\\osgdataTest\\OSGB\\OSGB中\\Data\\rootMerge\\rootMerge.osgb";
////因为之前设置了system("chcp 65001"),则可正确显示中文
//std::cout << osgPath << "\n";

//二、源文件为ansi编码时:
//因为源文件是ansi编码,则osgPath也是ansi编码,此时调试osgPath显示正确
std::string osgPath = "D:\\osgdataTest\\OSGB\\OSGB中\\Data\\rootMerge\\rootMerge.osgb";
//fromLocal8Bit将ansi转换为utf16,toStdString再转换为utf8
osgPath = QString::fromLocal8Bit(osgPath.c_str()).toStdString();
//因为之前设置了system("chcp 65001"),则可正确显示中文
std::cout << osgPath << "\n";



//若osg库是打开utf8编译选项的,则以下可以执行
osg::Node* node = osgDB::readNodeFile(osgPath);


return 0;

#endif

}

以上一二分别对应源文件为utf8编码或者ansi编码

标签:编码,中文,utf8,c++,源文件,ansi,QString,osgPath
From: https://www.cnblogs.com/jwwry/p/18175473

相关文章

  • 22. 括号生成-c++
    数字n代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合。示例1:输入:n=3输出:["((()))","(()())","(())()","()(())","()()()"]示例2:输入:n=1输出:["()"]classSolution{public:vector<string>generat......
  • 39. 组合总和-c++
    给你一个无重复元素的整数数组candidates和一个目标整数target,找出candidates中可以使数字和为目标数target的所有不同组合,并以列表形式返回。你可以按任意顺序返回这些组合。candidates中的同一个数字可以无限制重复被选取。如果至少一个数字的被选数量不同......
  • C++内存分布
    内存分布典型的C/C++内存表示有以下几部分构成Textsegment,存放代码段和只读常量的区域Initializeddatasegment,通常叫做数据段,已经初始化的静态变量和全局变量存放的区域,如staticinti=5、全局变量intj=10都存放在数据段Uninitializeddatasegment(bss),未初始化的静......
  • 78. 子集-c++
    给你一个整数数组nums,数组中的元素互不相同。返回该数组所有可能的子集(幂集)。解集不能包含重复的子集。你可以按任意顺序返回解集。示例1:输入:nums=[1,2,3]输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]示例2:输入:nums=[0]输出:[[],[0]]classSolution{......
  • c++
    namespace命名空间我们为了防止由于定义了多个函数名,导致可能函数名重复的问题,我们创建了命名空间,为的就是区分函数名重复的问题当我们要调用某个命名空间中的函数时,我们可以直接namespace::function来进行直接调用,同时可以存放变量名,函数,再一个命令空间.....同时假如命名空间......
  • C++学习笔记
    参考https://github.com/weidongshan/cpp_projects《C++PrimerPlus》C++StandardsSupportinGCCGCCGCC中有libstdc++库的实现LLVMLLVM中有libc++库的实现面向对象编程的3大特点封装继承多态struct声明的类里的成员都是publicclass声明的类的成员都是pr......
  • 中文破折号,连接号如何区分,如何用?
    论文写作中常常会涉及破折号,连接号,因为它们很相似,作者在写作过程中不进行区分,抓住一个就用。显然破折号,连接号是不同的。下面截取了《标点符号用法(GB/T15834—2011)》中的部分内容供大家参考。 01破折号定义:标号的一种,标示语段中某些成分的注释、补充说明或语音、意义的变化......
  • JS转义html编码
    两个方法:1、利用用浏览器内部转换器实现html转义;2、用正则表达式实现html转义; varHtmlUtil={/*1.用浏览器内部转换器实现html编码(转义)*/htmlEncode:function(html){//1.首先动态创建一个容器标签元素,如DIVvartemp=docum......
  • 如何快速找出文件夹里的全部带有中文&纯中文的文件
    首先,需要用到的这个工具YTool:度娘网盘提取码:qwu2蓝奏云提取码:2r1z步骤1、打开工具,切换到批量复制文件2、鼠标移到右侧,点击搜索添加3、设定查找范围、指定为文件、勾选包含全部子文件夹,点击“详细过滤条件-文件”4、设定过滤的情况勾选“按命名”、范围为:“仅文件名......
  • c++综合实验报告友元
    综合性、设计性实验报告专业:计算机科学与技术 一、实验目的:1.熟练掌握友元函数和友元类设计的方法2.掌握友元函数的含义,友元函数和成员函数的区别。3.掌握友元类的含义。二、实验仪器或设备:微型计算机三、总体设计(设计原理、设计方案及流程等)实验内容:定义Student类和Sco......