字符编码对程序的影响及分析
来源:互联网 发布: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字节来表示。出现错误,会导致一整行的数据被破坏。
- 字符编码对程序的影响及分析
- java中字符编码格式对中文的影响
- 资源对项目,及程序心理的影响
- 关键字volatile解释及对程序的影响
- 闰秒对linux的影响分析及解决
- 浏览器对程序的影响
- 测试php源文编码对定义在源文件中的中文字符数据写入Mysql数据库后编码的影响
- 空字符对浮动的影响
- 数据库视图对程序的影响
- SQL对程序性能的影响
- SQL对程序性能的影响
- 程序规模对构建的影响
- android sharedUserId对程序升级的影响
- Fraps 对D3D程序的影响
- 调用外部程序对输入的影响
- 处理器对程序性能的影响
- 排序数组对程序运行的影响
- cache line 对程序性能的影响
- Windows下计算文件摘要信息MD5、SHA-1、SHA-256
- 骑马修栅栏
- [BZOJ 3994][SDOI 2015]约数个数 数学+反演
- js keyup事件 在安卓和苹果手机不同使用 input propertychange
- Install MDX on Mac
- 字符编码对程序的影响及分析
- 一个简陋的自定义用线程Thread实现的计时器Timer,可以增加定时时间
- php生成pdf文件,html转pdf文件的最佳方法(转载)
- 设计模式 命令模式 之 管理智能家电
- Python发送邮件(常见四种邮件内容)
- UE4中切换关卡
- Unity 3D 海水的实现2 折射与反射 离屏相机的渲染
- linux之强大的sed
- 微信分享单独的大图片