- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的程序中,用户可以在命令行上提供文件名或使用 QFileDialog
。在第一种情况下,我有一个没有任何编码信息的 char*
,在第二种情况下,我有一个 QString
。
要存储文件名供以后使用(最近的文件),我需要它作为 QString
。但是要使用 std::ifstream
打开文件,我需要一个 std::string
。
现在乐趣开始了。我能做到:
filename = QString::fromLocal8Bit(argv[1]);
稍后,我可以:
std::string fn = filename.toLocal8Bit().constData();
这适用于大多数角色,但不是全部。例如,Раи́са这个词在经过这种转换后看起来是一样的,但实际上却有不同的字符。因此,虽然我可以拥有 Раи́са.txt,它会显示 Раи́са.txt,但它不会在文件系统中找到该文件。大多数字母都有效,但 и́ 无效。(请注意,当在 QFileDialog
中选择文件时,它确实可以正常工作。当它来自命令行时,它不会。)
有没有更好的方法来保留文件名?现在我以任何 native 编码获取它,并且可以在不知情的情况下以相同的编码传递。至少我是这么认为的。
最佳答案
'и́'不是ASCII字符,也就是说它没有8位表示。它在 argv[1]
中的表示方式取决于操作系统。但它并没有只用一个 char
来表示。
fromLocal8bit
使用相同的 QTextCodec::codecForLocale作为 toLocal8bit
。正如您所说,您的 std::string
将保存“Раи́са.txt”,所以这不是问题。
虽然 std::ifstream
可能期望每个 char
是它自己的 ,但取决于您的操作系统如何定义
而不是通过操作系统的翻译。我希望您使用的是 Windows,因为您看到了这个问题。在这种情况下,您应该使用 std::ifstream
charstd::fstream
的 std::wstring
实现,这是 Microsoft 特定的:http://msdn.microsoft.com/en-us/library/4dx08bh4.aspx
您可以使用以下命令从 QString
获取 std::wstring
:toStdWString
查看此处了解更多信息:fstream::open() Unicode or Non-Ascii characters don't work (with std::ios::out) on Windows
编辑:
对于可以访问它的项目来说,一个很好的跨平台选项是 Boost::Filesystem
. ypnos提及 File-Streams特别相关。
关于qt - 在 std::string 和 QString 之间保留非 ascii 字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26740785/
为什么 Qt 5.1.0 Release Candidate 函数 QString::replace(const QRegExp & rx, const QString & after) 以某种方式处
我想知道最有效的方法是将保存为 QString 的二进制文件转换为相应的十六进制并将其保存在同一个 QString 中 QString value = "10111100" 进入 value = "b
我从文件中读取了两个 QString (ValueOne,ValueTwo)(只是一个基本示例) int main(int argc, char *argv[]) { QString x =
请注意 QString 和 & 之间的空格。我想知道在QT中,QString&和QString &之间有什么区别吗? 最佳答案 不,没有区别。它是纯 C++ 语法。 C++ 可以被认为是一种与空格无关
我有这样的东西: void ReadFileAndConvert () { QFile File (Directory + "/here/we/go"); if(File.open(Q
我终于在 Eclipse 中运行了 C++/QT 项目。但是当我尝试包括例如QString 我只得到代码完成中提供的 qstring.h,手动输入 QString 也可以。 我检查了只包含 qstri
我非常想找到关于上述错误的任何信息。 我正在使用 visual studio 2010。当我在调试或发布中编译我的项目(32 位)时,我收到以下消息: 1>heterogeneous.obj : er
因为我不是 C(++) 专家,所以我被编译器的一些固执所困扰,不想将 QString 转换为 QString*。我有一个功能: bool getNextMessage(int sId, QString
比较2 QString是否更快s 包含数字,或转换那些 QString s 到数字然后比较数字? 那么哪个更快? QString str1,str2; if(str1.compare(str2)==0
我对使用指针和引用感到困惑,我遇到了一个小问题。 我有一个函数: bool myObject::isFlag( QString &pArgument) const { } 我正在使用它: QStrin
我需要一个优雅的 C++ 函数,它采用包含 unix 时间的 QString 参数(例如 1295874681)并将其转换为包含 QString 的标准时间格式(例如 Mon, 24 Jan 2011
如果 QString 是本地的,那么用 QString 发出信号的正确方法是什么。我的意思是我在 wigdetA 中有这样的功能 void wigdetA::something() { // //e.
我关注 QObject : #ifndef UETYPES #define UETYPES #include #include #include #include #include #inc
我尝试使用 foreach 遍历 QHash 并获取 QHash 中的每一对,然后获取它们的键和值,以便我可以将它们附加到字符串。 这是我的 QString Packet::Serialize() {
如何使用 QMap::const_iterator作为指针? QMap::const_iterator *i = map -> constBegin(); while (i !=
在我的项目中,我需要将十六进制 QString ("c2a774657374") 转换为 UTF-8 编码的 QString ("§test") 我当前的函数 (HexToAscii) 确实将十六进制
我想将另一个类 的 QString 转换为 Int,但它似乎失败了,因为结果是 0 而它应该是 5 并且其余代码有效.因为我是 C/Qt 的新手并且发现类有点困惑,所以我认为我的类做错了什么。 小部件
我在用 C++ 编写的 GUI 项目中使用了 Qt 4.8.4。现在我合并到 Qt 5.7 版。经过长时间调整我的代码后,我终于打开了我的 GUI。但是当我运行我的计算代码时,我仍然得到这个错误: 没
我对 qt 和 C++ 比较陌生,我很难理解为什么我可以在头文件中声明以下内容: const char* CONSIGNMENT_TAG_DONATE = "DTag"; 或 QString CONS
QString 文档 http://doc.qt.io/qt-5/qstring.html#arg说 One advantage of using arg() over sprintf() is th
我是一名优秀的程序员,十分优秀!