消失不见的字符串——Tiny C Compiler的坑

        Tiny C Compiler以快速编译著称,其编译速度比GCC快5到6倍。我喜欢它的简洁高效,但在最近的编程实践中,我遇见了一个很头疼的问题,也是一个老生常谈的问题。没错,那就是编码错误。

问题描述

        做办公室工作的我开发了一款简易的文件分类程序,它能够将相同日期的文件打包放进同一个文件夹里面。然而,当遇到中文路径的时候,程序依然能正常运行,但是所有相关的中文都消失不见了。

        查阅相关资料后尝试通过设置本地代码页、chcp指令、setlocale都无济于事。把编译后的程序拖进X64DBG发现字符串是完整的,因此怀疑是打印字符串相关的函数没有对UTF-16 LE的支持。

问题解决

        一个exe文件要生成,必须经过预处理、编译、汇编、链接四个步骤。而不同的编译器,其链接库的版本是不一样的。GNU Compiler Collection (GCC) 通常链接 GNU C Library (glibc),而Tiny C Compiler使用的库则是Libtcc,其作者已经停止维护了,缺乏对多字节的支持。

        一个来自Quora的回答能更好地说明这个问题

        事实上C/C++默认是不支持其他编码格式的。比如,字符串函数在大多数编译器里仅仅支持ANSI。微软的编译器MSVC,它的库函数支持UTF-16并且其函数有足够安全的版本,符合C11/C++11标准。MSVC还提供了编码转换函数,比如从UTF-8转换到UTF-16的A2W宏,但MSVC的功能性都是基于Windows API。也许其他编译器会支持wchar_t类型。

        在使用GCC编译后,消失的中文又回来了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值