win32汇编MessageBox显示中文乱码
因为我对字符编码的问题完全是一个小白,所以在学习汇编的过程中出现了下面的这种错误,特意记录和学习一下。
文章目录
- 1.问题描述
- 2.解决方法
1.问题描述
在使用Windows API函数MessageBox时,出现了中文乱码现象:
源码如下所示:
;*******************************************************
;我的第一个32位汇编程序
;*******************************************************
;HelloWorld.asm
;*******************************************************
;使用nmake或下列命令进行编译和链接
;ml /c /coff HelloWorld.asm
;Link /subsystem:windows HelloWorld.obj
;*******************************************************
;模式定义,初始化参数
.386 ;使用80386处理器指令集
.model flat,stdcall ;用来定义程序工作的模式,flat:内存模式,stdcall:语言模式
option casemap:none ;是否对变量与子程序名大小写敏感,必须要进行设置
;*******************************************************
;include头文件
;*******************************************************
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
;*******************************************************
;数据段
;*******************************************************
.data
szCaption db '标题',0
szText db '你好,世界!',0
;*******************************************************
;代码段
;*******************************************************
.code
start:
invoke MessageBox,NULL,offset szText,\
offset szCaption,MB_OK
invoke ExitProcess,NULL
;*******************************************************
end start
2.解决方法
首先要特别注意的是:ANSI(American National Standards Institute,美国国家标准学会)编码并不是ASCII码,之前一直没注意啊,所以今天就出现问题了。因为我之前一直都是用utf-8编码来编写文档的,而Windows在早期的发展过程中一直使用的都是ANSI编码,这套编码好像不同的地区都有着一套不同的标准,我们国家的标准是GB2312(后面扩展为GBK字符集),不像现在的Unicode编码,所以说ANSI编码更像是一个字符编码的集合。
由于ANSI编码与utf-8编码(英文字符占一个字节,中文字符占多个字节)并不相同, 所以就会导致许多ANSI编码的软件库不能使用,而微软为了不损失掉这庞大的软件库,所以它就搞出来了一个BOM标签,也就是通过这个BOM标签来区分ANSI编码与Unicode编码,这样就可以两者兼得。
既然知道了这其中的缘由,那么就修改起来就变得比较容易了,只需要进行下面的操作就行了。
之后再重新编译链接程序,运行结果如下:
所以不得不吐槽一下Windows,有的时候程序出现问题它总给你这种感觉:别问,问就是历史遗留问题*^*。
参考资料:
https://blog.csdn.net/imxiangzi/article/details/77370160
https://www.zhihu.com/question/20650946
还没有评论,来说两句吧...