在网上找到一篇很稀有珍贵的关于游戏汉化中的双字节问题处理原理的文章。
4 x3 x' |- p# ~7 |0 A原文 % F4 c; T% t) S' X; e
http://www.cnblogs.com/Sunwayking/articles/1380777.html $ C) }. m+ ]; T5 s- v1 r& ^
$ J+ w" H6 C* d6 Y" h5 ^假设原始字库引擎如下(单字节字库引擎,不支持双字节): 0 _' a$ _ z( i% T5 @, G
4 [ f9 Q; d1 s1 \2 F@begin: 8 O2 E( s) I; z+ X
....
8 l; ]$ i2 {3 l; }mov al,byte ptr[ecx] ;把要单字节字符取出来放在al中
. a: y0 V6 z6 B; ]4 h& ]. k+ bmovzx eax,al ;零扩展一下
0 R# i: @- l* g) ^push eax ;要处理的字符压栈 4 |3 N3 G; [' N1 v- {" H# y
call 贴字的函数 ;查询字库并控制显卡绘制出字符
) N4 x7 K4 Y! S3 y3 x2 Tinc ecx ! n* w( F/ ^$ R
jmp @begin # X+ \- Y% F; ? ]8 J9 k
8 h8 H) k7 Y; `. ~3 h% [4 i: [
2 K% Q0 H" i6 O" Q5 `. m现在想让他支持中文,需要对双字节特别处理:
5 F* J" B8 J, w4 K8 A" Y3 E% u% j
4 ~* f$ ^" y! V8 r6 \@begin: 1 q; g p* y+ s: R. [5 T$ _
....
: f1 c& E' `; b4 `1 h3 r1 Omov al,byte ptr[ecx] ;把要单字节字符取出来放在al中 * x: d( ?* {. T K
: O8 U. G9 C$ f R& Y3 ^
/*双字节处理代码*/ 0 w8 J/ A( ^2 d' J5 y1 q
test al,80h ;判断是否是中文gb2312编码.
6 { t& M. Y, e0 H* F. m! eje @单字节
% H- v! S3 k5 T7 _6 ashl eax,08h
6 i+ _; O- U: G2 B" G, b R) `2 Linc ecx 3 @2 M5 h6 D8 v' g. q
mov al,byte ptr[ecx] ;再取出一个单字节字符放在al中 2 z/ e; A( h' N" [/ S+ w' ?
jmp @双字节 9 i7 i, F: _& @5 t' s- x, E) r
/*双字节处理代码*/ : d4 e+ d8 g& N+ b
9 C0 n- C! u$ s, G' _! q% S; {
@单字节:
: Y3 H. a6 s& U _( Wmovzx eax,al ;零扩展一下
5 l1 U1 R1 K# B' v& H9 ?$ C@双字节: 9 C& o1 O/ h, S+ B6 {* p6 U4 t
push eax ;要处理的字符压栈
! I: _+ {7 f3 f. ycall 贴字的函数 ;查询字库并控制显卡绘制出字符
4 w; ]: M+ e' Y1 K* c- P% {inc ecx
4 @! f& R* r) {2 Kjmp @begin |