• 14717阅读
  • 15回复

[提问]急!!在线等:中文字符如何从QString类型转换成std::string类型呢? [复制链接]

上一主题 下一主题
离线zorachung
 
只看楼主 倒序阅读 楼主  发表于: 2006-10-25
— 本帖被 XChinux 从 Qt基础编程 移动到本区(2013-04-01) —
QString类型转换成std::string类型所用到的toStdString()这个函数好像对于中文字符不起作用噻,是因为它是宽字节字符吗?那如何使中文字符从QString类型转换成std::string类型呢?
[ 此贴被XChinux在2006-10-25 10:07重新编辑 ]
离线XChinux

只看该作者 1楼 发表于: 2006-10-25
先把QString转换成GBK的,然后再转为std::string的试试
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线zorachung
只看该作者 2楼 发表于: 2006-10-25
谢谢XChinux解答:)你说的先转换成GBK,是在main.cpp里面加上QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));吗?然后用

QString Utf8_To_GB(QString strText)
{
  return QString::fromUtf8(strText.toLocal8Bit().data());
}

进行格式转换,再用toStdString()转换吗?

我试了一下,不行呀:《另外“GBK”和“GB18030”啥区别呢?
离线XChinux

只看该作者 3楼 发表于: 2006-10-25
不要用我以前发的那个Utf8_To_GB的函数,那是个投机的办法,且与源码文件的内码相关。

最好使用QTextCodec进行转换,如下例子,假设utf8String为你原来的UTF8字符串,则:

QTextCodec *codec = QTextCodec::codecForName("GBK");
QByteArray gbkString = codec->fromUnicode(utf8String);


这样就能直接用gbkString的方法(转化为char *的)来为std::string赋值或初始化了
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线XChinux

只看该作者 4楼 发表于: 2006-10-25
一般来说,GB2312, GBK, GB18030,前者是后者的子集
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线zorachung
只看该作者 5楼 发表于: 2006-10-25
按照你的方法尝试了一下,还是没有成功,utf8String初始化为中文字符,然后利用 QByteArray gbkString = codec->fromUnicode(utf8String);后在QMessageBox里面打算显示gbkString,出来的还是乱码,这是为啥子?
离线XChinux

只看该作者 6楼 发表于: 2006-10-25
QMessageBox里显示的是要UTF8的,显示gbkString当然显示不了了。gbkString是供std::string初始化使用的
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线zorachung
只看该作者 7楼 发表于: 2006-10-25
噢,我是原打算用QMessageBox做个测试的,我确实需要一个std::string的串,它作为一个参数传进我的函数里,但是在mac系统下用xcode编译无法看到串的具体字符,既然QMessageBox看不到,只能用cout来看了吧?
离线zorachung
只看该作者 8楼 发表于: 2006-10-25
对于中文字符,我是不是要先把UTF8转成UTF16呢?
离线wangowen

只看该作者 9楼 发表于: 2006-10-25
不知道你有没有注意QString的构造函数没有,肯定是不能购用中文直接初始化它。
char *s="中文";
QString str=QString::fromLocal8Bit(s);
离线eruter
只看该作者 10楼 发表于: 2008-09-19
遇到同样问题,搜了了一些帖子,竟然没看到解决方案。
试了下,这样可以。
QString alarmGrapName = nameEditAlarmGrap->text();    //QLineEdit* nameEditAlarmGrap ;
std::string  grapName =  (const char *)(alarmGrap.local8Bit());
离线ww_317
只看该作者 11楼 发表于: 2008-09-22
楼上傻啦,人家2006年的问题也在回答
离线muyu005
只看该作者 12楼 发表于: 2008-09-23
遇到问题能解决就是好样的,为什么要管问题是哪年的!谁能保证不会遇到几年前别人碰到的问题呢!
离线donixli1314

只看该作者 13楼 发表于: 2009-08-20
dll里的函数:
void WINAPI TestParam (const string& name, const string& psword)
{
  if (0 == name.compare ("Adams") && 0 == psword.compare ("111111"))
  {
    printf ("input correct!\n");
  }
  else
  {
    printf ("input incorrect!\n Please input again.\n");
  }
}

我做的转换如下:
//我的参数:用户名和密码都保证是英文的
typedef void (WINAPI *Test_API) (const std::string& nn, const std::string& pp);
..................
Test_API     test_api = ...........;

QString name ("Adams");
QString psWd ("111111");

std::string  uName  = name.toStdString ();
std::string  uPswod = psWd.toStdString ();

test_api (uName , uPswod)的调用输出结果是 input incorrect! Please input again
离线rqzrqh

只看该作者 14楼 发表于: 2009-08-20
06年的帖
离线donixli1314

只看该作者 15楼 发表于: 2009-08-21
温故知新撒
快速回复
限100 字节
 
上一个 下一个