qt-vs 常量中有换行符

本文介绍了解决Visual Studio编译器处理中文字符时出现乱码及编译错误的方法,包括设置正确的编码格式及如何修改源代码中的中文字符。

以下内容转载或参考自

http://blog.youkuaiyun.com/xuancailinggan/article/details/50373415

http://blog.youkuaiyun.com/xuly_29/article/details/52247567


说来惭愧,好多群友问这个问题,因为我用的minGW编译器,所以这个问题对我来说是不存在,后来终于想尝试用下vs版的qt了。

好了不多说,上代码:

就这一句话,直接报错说常量中有换行符,我滴天,其实呢,这个是编译器作怪,vs版本的编译器不认汉字!坑爹吧……

修改一下设置:

然后重新编译,正常情况下是可以的哦。但是显然不可以,这里是QT的一个bug,你需要找到汉字,随便找几个就行,重新打一下,然后编译就好了。

来下总结吧:

首先,要想用中文,你要设置编码是带bom的,这样写出来的代码没有任何问题。

如果你已经开写,或者用的别人的代码,你需要设置以后再选几个字重新打一下。选几个就行,别几万的汉字你都打了……那还不如重写呢。

正常运行了吧,不过下面这个还是乱码的,vs坑爹啊……支持开源,果断minGW吧,少年们。







在使用gcc/mingw或clang作为编译器时不会出现,如果把环境换成以MSVC编译就出现此错误.

具体为:

C4819:该文件包含不能在当前代码页(936)中表示的字符.请将该文件保存为Unicode格式以防止数据丢失.

C2001:常量中有换行符

问题所在是源代码中的中文字符.


如果在QT Creator里Select Encoding...

经常会出现错误: Error:Could not decode "XXX.cpp" with "XXX"-encoding . Editing not possible.

并且源代码中的中文会变乱码.

解决方法:

用Visual Studio打开出错源代码.

文件->高级保存选项->编码,

把编码由"Uncode (UTF-8 无签名) - 代码页65001"

换成

"Uncode (UTF-8 带签名) - 代码页65001"

确定后保存.

在QT Creator里可以正确显示中文并且不会出错"常量中有换行符"的错误


Qt框架中,若需要在常量字符串中表示换行符,可以使用标准C++中的换行符 `\n`,该符号在字符串中表示一个换行位置。然而,如果在使用中文字符时出现 `error: C2001: 常量中有换行符` 错误,则通常是由于文件编码格式或编译器对字符集的处理方式不一致导致的[^1]。 ### 在Qt中正确使用换行符 #### 1. 使用 `\n` 表示换行符常量字符串中插入换行符的标准方式是使用 `\n`。例如: ```cpp QMessageBox::information(this, "提示", "第一行内容\n第二行内容"); ``` 此方式适用于ASCII字符集,但如果包含中文字符,则需要确保文件编码和编译器字符集设置一致。 #### 2. 设置文件编码为 UTF-8 并添加执行字符集声明 如果项目中使用了中文字符,并且编译时提示“常量中有换行符”,则可能是由于源文件的编码格式未被编译器正确识别。可以在源文件顶部添加以下预处理指令以指定执行字符集为 UTF-8: ```cpp #pragma execution_character_set("utf-8") ``` 此方法适用于 MSVC 编译器环境,可避免因中文字符导致的换行符识别问题[^1]。 #### 3. 使用 MSVC 编译器参数指定字符集 对于 MSVC 编译器,可以在 `.pro` 文件中添加以下编译选项,以确保源文件和执行字符集均为 UTF-8: ```qmake QMAKE_CXXFLAGS += /source-charset:utf-8 /execution-charset:utf-8 ``` 此设置可以避免在多个源文件中重复添加 `#pragma execution_character_set` 指令[^2]。 #### 4. 使用 QString::fromLocal8Bit 转换本地编码 如果源文件保存为本地编码(如 GBK 或 GB2312),而 Qt 内部使用 UTF-8 编码,则可以使用 `QString::fromLocal8Bit` 对中文字符串进行转换: ```cpp QMessageBox::information(this, QString::fromLocal8Bit("提示"), QString::fromLocal8Bit("第一行内容\n第二行内容")); ``` 该方法可确保中文字符在不同编码环境下正确显示[^3]。 #### 5. 保存文件时使用 UTF-8 编码(无 BOM) 在 Qt Creator 中,可以通过以下步骤确保文件以 UTF-8 编码保存: - 打开文件后,点击菜单栏中的 **编辑**。 - 选择 **Select Encoding**。 - 在弹出窗口中选择 **UTF-8** 编码。 - 点击 **按编码保存**。 建议使用 UTF-8 无 BOM 格式保存源文件,以避免编译器误读文件开头的 BOM 字符导致错误[^5]。 --- ### 示例代码 ```cpp #include <QMessageBox> QMessageBox::information(this, "提示", "第一行内容\n第二行内容"); ``` 如果使用中文且出现编译错误,可结合以下方式: ```cpp #pragma execution_character_set("utf-8") #include <QMessageBox> QMessageBox::information(this, "提示", "第一行内容\n第二行内容"); ``` 或使用转换函数: ```cpp QMessageBox::information(this, QString::fromLocal8Bit("提示"), QString::fromLocal8Bit("第一行内容\n第二行内容")); ``` --- ### 总结 在 Qt 中使用换行符时,确保源文件编码、编译器设置和字符串处理方式一致是关键。推荐使用 UTF-8 编码格式,并通过 `#pragma execution_character_set("utf-8")` 或 MSVC 编译器参数设置执行字符集,以避免“常量中有换行符”错误的发生。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值