Qt中使用中文字符编译报错的问题

文章详细介绍了在使用Windows环境下的QtCreator进行开发时,遇到QString中文字符串编译错误的问题,并提供了将cpp文件编码从UTF8noBOM转换为UTF8BOM的解决方案,以确保代码正常编译。

使用的是windows环境下的Qtcreator,QT版本为5.4,编译工具为msvc2013。

在使用QString为中文字符串的时候,编译工程就报错了,改成英文字符就不会报错。

以下是代码:

编译器报错信息:

到网上找资料,说是可以通过代码将QString的编码格式转换一下,使用以下语句:

QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GB2312"));

但是Qt5.4里面没有setCodecForCStrings这个接口。

后来看到有人说是由于QtCreator生成的cpp文件默认采用UTF8 no BOM格式,需要将其转换成 UTF8 BOM格式,以下是转换方法:

在windows下,用记事本打开cpp文件,然后另存为UTF8格式的文件:

转换之后,再编译,就通过了。

可以通过Notepad++查看转换前后的cpp文件的编码格式:

转换前:

转换后:


总结,这种方法很笨,不知道有没有其他办法,不过对于多个文件的转换可以在Linux环境下批量转换。



### 关于 Qt 在 MSVC 编译环境下出现的“未声明标识符”以及中文报错问题使用 Microsoft Visual Studio Compiler (MSVC) 对 Qt 项目进行编译时,可能会遇到诸如“未声明标识符”的错误提示。这种现象通常由以下几个原因引起: #### 1. **编码问题** 当源文件或头文件中包含中文字符时,可能因编码不一致而导致编译器无法正确解析这些字符。具体表现为 `C2001` 错误(常量中有换行符)。这是因为 Windows 默认使用的 GBK 编码与 UTF-8 编码之间存在冲突[^3]。 ##### 解决方案: - 打开 Qt Creator 的菜单栏,依次选择【编辑】->【选择编码】->【SYSTEM】->【按编码保存】。 - 将文件编码转换为 GBK 或者带有 BOM 的 UTF-8 格式。对于 MSVC 来说,推荐优先尝试 GBK 编码。 ```cpp // 如果仍存在问题,可以考虑手动调整代码中的中文字符串处理逻辑 QString str = QString::fromUtf8("这是一个测试"); ``` --- #### 2. **缺少必要的宏定义或类型声明** 某些情况下,“未声明标识符”可能是由于目标平台缺乏特定类型的定义所致。例如,在 VLC-Qt编译过程中曾报告过类似的错误:“libvlc_media_read_cb: 未声明的标识符”。这通常是由于标准库或第三方依赖项中缺失了必要类型的声明[^5]。 ##### 解决方案: - 针对该类问题,可以通过显式添加所需的类型声明来修复。例如,在涉及 `ssize_t` 类型的情况下,可以在相关头文件中加入以下代码片段以解决问题: ```c++ #ifndef _SSIZE_T_DEFINED #define _SSIZE_T_DEFINED typedef __int64 ssize_t; #endif ``` 上述操作能够有效避免因跨平台差异引发的兼容性问题。 --- #### 3. **编译器选项配置不当** 如果项目的编译选项未能适配当前所选用的工具链,则可能导致各种异常行为的发生。比如安全结构化异常处理 (/SAFESEH) 设置不合理会干扰链接阶段的工作流程。 ##### 解决方案: - 使用 Visual Studio IDE 修改各子模块的工程属性,确保其满足实际需求。以下是针对 Core 工程的具体步骤说明: - 右键单击项目名称 -> 属性; - 导航至 【配置属性】->【链接器】->【命令行】; - 向【其他选项】字段追加 `/SAFESEH:NO` 参数。 重复执行这一过程直至覆盖全部受影响组件为止。 --- #### 综合建议 为了最大限度减少潜在风险因素的影响,强烈建议开发者遵循以下最佳实践原则: - 确认所有参与协作开发人员均采用统一的文字编码形式; - 提前审查外部库接口文档资料,及时补充遗漏的关键数据类型描述信息; - 谨慎评估不同版本间变更记录内容,适时更新本地工作副本以便获取最新改进成果[^4]。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值