+ -
当前位置:首页 → 问答吧 → 关于MASM32的UNICODE中文乱码

关于MASM32的UNICODE中文乱码

时间:2011-03-08

来源:互联网

a.asm源代码如下:

.386
.model flat, stdcall
option casemap :none ; case sensitive

include windows.inc
include kernel32.inc
include user32.inc
include ucmacros.asm

includelib kernel32.lib
includelib user32.lib

.data

WSTR szCaption, "test-测试中文"
WSTR szText, "test-测试中文"

.code

start:

 invoke MessageBoxW, NULL, addr szText, addr szCaption, MB_OK
 invoke ExitProcess, NULL

 end start

----------------------------------

编译命令行
ml /c /coff a.asm
link /SUBSYSTEM:WINDOWS a.obj

结果看图。

MS-WinXP SP3 Pro + MASM32v10

是命令行漏了参数?还是要自己手动用API设语言?那又是哪个API?

发不了图,图在这里:zhidao.baidu.com/question/233324458.html

作者: yunbookf   发布时间: 2011-03-08

这个 unicode 的定义,对汉字来说,是错误的吧。象上面的字符串,在 exe 文件里看,被定义成了下面的形式:
74 00 65 00-73 00 74 00-2D 00 B2 00-E2 00 CA 00 t e s t - ▓ Γ ╩
D4 00 D6 00-D0 00 CE 00-C4 00 00 00-74 00 65 00 ╘ ╓ ╨ ╬ ─ t e
73 00 74 00-2D 00 B2 00-E2 00 CA 00-D4 00 D6 00 s t - ▓ Γ ╩ ╘ ╓
D0 00 CE 00-C4 00 00 00-00 00 00 00-00 00 00 00 ╨ ╬ ─
将“测”字分解成了 B2 00 E2 00 ,这个不是“测”字的 unicode ,而只是将其 gb 码 B2 E3 简单地分解成了两个字节;其实“测”字的 unicode 应该是 6D4Bh 。

作者: zara   发布时间: 2011-03-08

试试下面这个资源里的 unicode 宏定义?它里面说是 Masm32 自带的不支持汉字,它的这个支持。
http://download.csdn.net/source/2413270

作者: zara   发布时间: 2011-03-08

不用那么麻烦,这么定义就可以了:
Assembly code

unicode         macro name,string,zero
name label byte
                irpc c,<string>
                db '&c', 0
                endm

                ifnb <zero>
                   dw zero
                endif
endm

;使用方法
unicode szCaption, <test-测试中文>,0


作者: aiwnx   发布时间: 2011-03-08

引用 3 楼 aiwnx 的回复:
不用那么麻烦,这么定义就可以了:

Assembly code

unicode macro name,string,zero
name label byte
irpc c,<string>
db '&amp;c', 0
endm

i……


不好意思,试了一下,这种办法也不支持中文的unicode。。。
但是2#楼提供的uncode.inc文件貌似不全,无法参加编译啊

作者: aiwnx   发布时间: 2011-03-08

刚才去看了下那个资源,那个确实是不完整的。其实是下面这个资源,这个资源包括了上面那个的 unicode.inc 文件。需要留意下它的数据定义方式和 Masm 的不一样。
http://download.csdn.net/source/2821354
Assembly code
; 现在这样就可以了
.386
.model flat, stdcall
option casemap :none ; case sensitive

include windows.inc
include kernel32.inc
include user32.inc
include macros.inc  ; 这里用的是资源里的宏定义文件,不是 Masm32 的!

includelib kernel32.lib
includelib user32.lib


.data
szCaption    WSTR    ("test-测试中文Caption", 0)
szText        WSTR    ("test-测试中文Text", 0)


MessageBoxW PROTO :DWORD,:DWORD,:DWORD,:DWORD


.code

start:

 invoke MessageBoxW, NULL, addr szText, addr szCaption, MB_OK
 invoke ExitProcess, NULL

 end start

作者: zara   发布时间: 2011-03-08