Qt 路径选择,返回的QString是什么编码的?

千梦一生 2020-07-03 10:52:06

QString file_path = QFileDialog::getExistingDirectory(this, "请选择文件路径...", "./");

如上代码,选择了一个中文路径。后来发现无法打开。故需要转码一下这个路径。

请问这个函数返回的编码是什么呢?怎么看?
谢谢


另外同样的多询问一个问题:
假如有一个
输入框,用户输入了的字符串,到内存中,是什么编码呢?
...全文
618 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
mideum 2020-07-03
  • 打赏
  • 举报
回复
QString简单一点你就理解为UTF16吧,QString的toStdString()是转换成UTF8的,但是一般外部方法要求char*参数的,都是要非Unicode的本地编码。
比如如果是简体中文的系统,一般需要GBK的。
默认情况下,你只要使用QString的toLocal8Bit()方法,它会自动获取你的locale然后转成对应的编码,取得的QByteArray可以直接作为const char*参数
其实理论上stl应该也支持wchar_t*作为参数,这样的话就根本不需要转码了,因为wchar_t也基本是utf16的
只要用QString的toStdWString()就可以获得wchar_t字符串了,但是我自己测试ofstream/wofstream传入wchar_t*会跑不起来,不清楚为什么
千梦一生 2020-07-03
  • 打赏
  • 举报
回复
引用 1 楼 mideum 的回复:
不会啊,我用这行代码打开中文文件夹不需要转码的,除非你不是用Qt的方法打开的
Qt本身的字符是使用双字节Unicode存储的,QString / QChar都是这个格式
只有在需要变成QByteArray / std::string() / char*的时候才需要进行编码转换

您好,确实我不是用的Qt方式打开的文件夹

(路径+文件名).tostdString()了。。后面使用的是std::ofstream打开,然后失败了。
网上查了查,说这很有可能是编码问题引起的,所以我想那肯定可以通过编码转换解决这个问题。
但我现在很懵逼的就是:这个QString是哪个编码的。我又该转成哪个编码才行?
网上有说设置loc什么的。代码很简单,但我觉得既然是编码问题,那肯定有办法改变编码以适应它的输入要求
mideum 2020-07-03
  • 打赏
  • 举报
回复
不会啊,我用这行代码打开中文文件夹不需要转码的,除非你不是用Qt的方法打开的
Qt本身的字符是使用双字节Unicode存储的,QString / QChar都是这个格式
只有在需要变成QByteArray / std::string() / char*的时候才需要进行编码转换
mideum 2020-07-03
  • 打赏
  • 举报
回复
就像我上面说的,如果你open + wstring没问题的话,都用不着什么utf8呀std::string的转换,
只要用QString::toStdWString()就可以拿到wstring了
千梦一生 2020-07-03
  • 打赏
  • 举报
回复
引用 3 楼 mideum 的回复:
QString简单一点你就理解为UTF16吧,QString的toStdString()是转换成UTF8的,但是一般外部方法要求char*参数的,都是要非Unicode的本地编码。
比如如果是简体中文的系统,一般需要GBK的。
默认情况下,你只要使用QString的toLocal8Bit()方法,它会自动获取你的locale然后转成对应的编码,取得的QByteArray可以直接作为const char*参数
其实理论上stl应该也支持wchar_t*作为参数,这样的话就根本不需要转码了,因为wchar_t也基本是utf16的
只要用QString的toStdWString()就可以获得wchar_t字符串了,但是我自己测试ofstream/wofstream传入wchar_t*会跑不起来,不清楚为什么


您好,刚才再次学习了一会儿,确实如您所说。

刚才我成功解决了这个问题。我用的是wstring,其实和wchar_t相同
下面是我的代码,和我的总结。劳您看一看我的想法思路上是否是对的。
谢谢。

std::ofstream& f = (*l)[token];
//网上说std::string是utf-8【多字节】的。那我这里姑且认为是utf-8的
//QString【unicode】【宽字符】->std::string【utf8】【多字节字符】
//- >open底层实现-> C语言的 【多字节字符】转【宽字节字符】:C语言的这个转换“默认且确认”为当前的locale设置【默认为ANSI C】的字符集
//但输入的std::string是【utf8】字符集的【多字节字符串】,则将utf8视为ANSIC 字符集来解码、转码为unicode【宽字符集】,自然翻车妥妥的
//不过好在fstream接受直接输入的 unicode【宽字符集】编码的输入。即wstring字符串

std::wstring_convert<std::codecvt_utf8<wchar_t>> utf8ToUnicode;
std::wstring unicodePath = utf8ToUnicode.from_bytes(path);

f.open(unicodePath,std::ios::binary);

16,818

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧