• 7007阅读
  • 6回复

求助关于中文编码问题,尤其是tr()里面的,试过各种解决方法,都不行,请各位指点,客官们请进~~~ [复制链接]

上一主题 下一主题
离线黑白一丁
 
只看楼主 倒序阅读 楼主  发表于: 2013-05-20
1、main函数里面已加载:
QTextCodec *codec = QTextCodec::codecForName("UTF-8");
QTextCodec::setCodecForLocale(codec);
QTextCodec::setCodecForCStrings(codec);
QTextCodec::setCodecForTr(codec);

2、文件都已转成UTF-8格式

问题代码如下:
        QMessageBox::warning(0, QString("测试"),"擦,就不出现!");
        process.setWindowTitle("参数分析");
        process.setLabelText(tr("正在计算第 %1/%2 个物性参数\n 请稍候...").arg(i+1).arg(nRes));
        process.setRange(0,nRes);
        process.setCancelButtonText(tr("取消"));
        qApp->processEvents();
        process.show();
        process.setValue(i);
        if(process.wasCanceled())
        {
            break;
        }
所出现的问题:
1、在第一行“测试”中,输入中文字符“测试”后,如果不按一下“shift”键将输入法切换成英文,编译就不通过,错误如下:
QxHanModel.cpp(426) : error C2146: syntax error : missing ')' before identifier '鎿︼紝灏变笉鍑虹幇'
QxHanModel.cpp(426) : error C2001: newline in constant
QxHanModel.cpp(435) : error C2143: syntax error : missing ')' before '{'
QxHanModel.cpp(435) : error C2143: syntax error : missing ';' before ')'
QxHanModel.cpp(435) : warning C4390: ';' : empty controlled statement found; is this the intent?
QxHanModel.cpp(435) : error C2143: syntax error : missing ';' before '{'

2、在“擦,就不出现”后的感叹号,如果是中文状态的“!”,而不是英文状态的“!”,编译亦不通过,错误如下:
QxHanModel.cpp(426) : error C2001: newline in constant
QxHanModel.cpp(427) : error C2146: syntax error : missing ')' before identifier 'process'
3、中文字符“参数分析”,如果不按一下“shift”键,或者在中文字符后加个英文的空格,亦或者加个数字或者英文字符,出现的问题与1中问题一样

4、process.setLabelText(tr("正在计算第 %1/%2 个物性参数\n 请稍候...").arg(i+1).arg(nRes));这行代码中,采用了tr()的方式,但是运行出来是这德行,如图所示,求解释,同求解决途径。注意:在“正在计算第”后已经入英文空格,在“请稍候”后,已加入英文"...",否则,问题同1.
离线dbzhang800

只看该作者 1楼 发表于: 2013-05-20
注意几点:

1. 凡是同时出现3个 setCodecForXXX 的文章,最好不要看。一个setCodecForCStrings足够

2. 不要试图用tr() 包裹中文。直接使用QString()

3. 如果使用的是VC2005或2008,应该使用GBK而不是utf8,其他环境(包括VC2003或VC2010及以后版本)应该考虑使用utf8,以便于和GCC,Intel等非VC编译器保持一致。
离线jdwx

只看该作者 2楼 发表于: 2013-05-20
按照标准的办法,翻译一下不是很难吧。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线vbroot

只看该作者 3楼 发表于: 2013-05-22
我已习惯翻译了
离线skertone

只看该作者 4楼 发表于: 2013-05-26
引用第1楼dbzhang800于2013-05-20 16:16发表的  :
注意几点:
1. 凡是同时出现3个 setCodecForXXX 的文章,最好不要看。一个setCodecForCStrings足够
2. 不要试图用tr() 包裹中文。直接使用QString()
.......



版主能不能把 编辑器编码方式、界面显示编码方式、  数据库字段编码方式、tr()编码方式 四种编码相互关系说一下啊,现在我找不着资料搞明白,统统复制哪三行代码放在main() 里面治标不治本啊。

按现阶段我的理解:
1.编辑器编码方式:Windows下默认 GB2312/GBK   Linux下 utf-8  , 如果要跨平台使用代码 应统一设成 utf-8
2.界面显示编码, Qt 均使用 utf-8,  所以存在默认转换问题, 你编辑器中打个 QString s("测试");  Qt 都要将其转换成 utf-8才能显示,所以Qt 需要知道编辑器的编码配置,这就有了 传说中的 三行代码.
  另: 这时进行的Qt编码转换是 运行期进行的,还是编译期进行的呢?
3.数据库字段编码,这个设计数表时可明确指定。现在我都用utf-8 。 如果数据库是GBK什么的,有几个层次的解决方案呢?
   另: 这里我觉得用utf-8 这种变长编码效率应该会比 GBK低
4.tr() 编码:这个应该是给Qt  Hook一个函数或者在字串使用前 留个机会改变它 从而实现多语言显示。这个东东显然需要知道转换前的编码,这也就是哪三行代码的作用吧,所以说哪三行代码可能 仅一行还是不行吧?????
  另:这个tr()  是否可默认? 也就是说输入代码时不需要 tr("str"); 但编译器肯定能知道你这个 "str" 是一个 +ro 或 const 字串类型 自动补上 tr()代码呢?  又即 输入的是 "str" 编译后相当于 tr("str")
5.

  
离线jdwx

只看该作者 5楼 发表于: 2013-05-26
代码里只写ASCII字符,什么gbk、utf-8的全都是一样的。
可以用标准的国际化处理中文。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线dbzhang800

只看该作者 6楼 发表于: 2013-05-27
引用第4楼skertone于2013-05-26 11:50发表的  :
版主能不能把 编辑器编码方式、界面显示编码方式、  数据库字段编码方式、tr()编码方式 四种编码相互关系说一下啊,现在我找不着资料搞明白,统统复制哪三行代码放在main() 里面治标不治本啊。
.......


其实,这四者之间没多少联系。
编辑器编码(input-charset) :UTF-8、GBK
界面显示或Qt程序内部或QString内部:Unicode
数据库:自己设定
tr() 编码:不建议修改它!在Qt5中,可以直接使用UTF-8;在Qt4中,如果你真的想用它包裹GBK中文(对日韩也是同样)然后国际化,会遇到一些问题的。

引用第4楼skertone于2013-05-26 11:50发表的  :

按现阶段我的理解:
1.编辑器编码方式:Windows下默认 GB2312/GBK   Linux下 utf-8  , 如果要跨平台使用代码 应统一设成 utf-8
.......


这是不对的,其实如果你在简体中文系统使用VC2005或VC2008,你只能使用GBK。(似乎在西欧的Windows系统中使用它们,可以用UTF-8)

直到VC2010,问题才稍微得到改观

引用第4楼skertone于2013-05-26 11:50发表的  :
版主能不能把 编辑器编码方式、界面显示编码方式、  数据库字段编码方式、tr()编码方式 四种编码相互关系说一下啊,现在我找不着资料搞明白,统统复制哪三行代码放在main() 里面治标不治本啊。

按现阶段我的理解:

2.界面显示编码, Qt 均使用 utf-8,  所以存在默认转换问题, 你编辑器中打个 QString s("测试");  Qt 都要将其转换成 utf-8才能显示,所以Qt 需要知道编辑器的编码配置,这就有了 传说中的 三行代码.
  另: 这时进行的Qt编码转换是 运行期进行的,还是编译期进行的呢?
.......

这是不对的。Qt不需要知道编辑器的编码(input-charset),是你的C++编译器需要知道它。

Qt需要知道的是exec-charset.

input-charset 到 exec-charset的转换是C++编译器完成的,在编译期

而 C++ exec-charset 到 Qt 的 Unicode 的转换是运行期完成的。(如果你的编译器支持C++11,这个也可以在编译器直接完成,通过 QStringLiteral)

引用第4楼skertone于2013-05-26 11:50发表的  :
3.数据库字段编码,这个设计数表时可明确指定。现在我都用utf-8 。 如果数据库是GBK什么的,有几个层次的解决方案呢?
   另: 这里我觉得用utf-8 这种变长编码效率应该会比 GBK低
.......

和Qt没多少关系。

其实我们现在说的GBK,一般都是指GB18030,它也是变长编码。

引用第4楼skertone于2013-05-26 11:50发表的  :

4.tr() 编码:这个应该是给Qt  Hook一个函数或者在字串使用前 留个机会改变它 从而实现多语言显示。这个东东显然需要知道转换前的编码,这也就是哪三行代码的作用吧,所以说哪三行代码可能 仅一行还是不行吧?????
  另:这个tr()  是否可默认? 也就是说输入代码时不需要 tr("str"); 但编译器肯定能知道你这个 "str" 是一个 +ro 或 const 字串类型 自动补上 tr()代码呢?  又即 输入的是 "str" 编译后相当于 tr("str")

.......

只是显示中文的话,和tr没什么关系。不想国际化的话,个人认为就不该用tr。

tr也不会默认,它就是一个普通的函数。

事实上,我只见过有2个网友使用用来翻译CJK编码的字符(一个国内,一个日本)。这个东西可变的意义真的不大。Qt5也没有保留setCodecForTr。
快速回复
限100 字节
 
上一个 下一个