字符编码对程序的影响及分析

来源:互联网 发布:unity3d 2d骨骼 编辑:程序博客网 时间:2024/04/29 22:44

今天在调用一个动态库的时候,使用到下面的语句:

HMODULE hDLL = LoadLibrary("filedir\\dlltest.dll");

因为编译环境选择的是unicode字符集,所以当我上面的语句从一个多字节字符集的编译环境复制过来后,出现了语法错误。语法错误的提示为:

error C2664: “LoadLibraryW”: 不能将参数 1 从“const char *”转换为“LPCWSTR”

其实是在C++库函数中做了如下的处理:

#ifdef unicode#define LoadLibrary LoadLibraryW#else#define LoadLibrary LoadLibraryA#endif

也就是说如果在unicode编码集下,程序调用的是函数LoadLibraryW,该函数需要一个wchar_t(宽字符)类的参数。那么在传入”filedir\dlltest.dll”做为参数时,是一个多字节字符集的形式,不能满足参数要求。
解决方法:
需要对参数进行_T()或L处理,使之转换为宽字符的存储形式。其中_T()和L的区别参见这篇文章:
_T()与L区别
但是在修改之后动态库仍未成功加载,原来是我漏拷了两个依赖动态库,拷贝之后成功解决问题。

重点:
1、字符串在程序中的存储形式是根据字符编码的不同改变的,也就是说在Linux环境下,如果我使用参数-finput-charset= 可以指定源文件的字符集,如果未指定情况下默认是UTF-8;如果我使用参数-fexec-charset= 可以指定可执行文件中字符编码方式。
例如:我的源文件以ANCI保存,在未使用参数指定源文件字符集的情况下,为什么能正常编译呢?因为编译器会以为源文件中ANCI的字符编码是UTF-8格式的编码,所以能够正常编译。但是编译器会以UTF-8来解析,导致输出后会出现乱码。这也就是在编辑界面能看到正常的字符显示,但编译后输出乱码的原因。
2、unicode是一种字符与编码的映射表,UTF-8、UTF-16等则是依照unicode的编码规则,制定相应的字符存储方式。比如一个“中”字,在unicode编码中用“0x4E 0x2D”来表示,则UTF-8、UTF-16等编码方式按其各自的规则解码后,获得的中字编码必须为“0x4E 0x2D”。UTF-8是变长编码,节省空间并且容错性强。容错性强是因为它对每个字符的编码都用第一个字节的前几位来表示共有多少字节来表示这个字符,也就说出现错误,只会导致一个字符被破坏。UTF-16是定长编码,每个字符使用2字节来表示。出现错误,会导致一整行的数据被破坏。

0 0
原创粉丝点击