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编译后,消失的中文又回来了。