在网上找到一篇很稀有珍贵的关于游戏汉化中的双字节问题处理原理的文章。
; i% T9 x5 T/ Q) V. [6 o原文 * ^; J' h! U: q1 v
http://www.cnblogs.com/Sunwayking/articles/1380777.html ) a- j$ j" f2 ^9 m, N7 D$ |" \2 \
: u3 B3 D5 X' C1 t( |# W6 W
假设原始字库引擎如下(单字节字库引擎,不支持双字节): : Q" E% H9 `, K& }/ s4 Y+ B3 J
" {/ B2 }" z* y' ~@begin: ) X( s3 K: P$ K+ v. U3 Y; `5 i
....
8 s1 G( X! P5 C2 _+ F( d6 cmov al,byte ptr[ecx] ;把要单字节字符取出来放在al中
; E; E9 E5 C* b/ Z Y& Fmovzx eax,al ;零扩展一下
* B% B8 a1 {+ p ipush eax ;要处理的字符压栈 3 I" [) F3 M3 ~$ l
call 贴字的函数 ;查询字库并控制显卡绘制出字符 6 b- P" B$ ]$ K U9 l, ^
inc ecx & m& M; m9 c+ R' Z
jmp @begin
) e o& |: p; q- M# r- C
& \+ X/ p" u* R) ]3 |1 A ~( _% w1 @" @2 Y/ |3 `! Y: G" B8 a
现在想让他支持中文,需要对双字节特别处理: 7 c/ `/ I( K5 o2 G- Q% o
[5 ^6 ]* y, ~' f5 s$ ? d
@begin: L* d5 V4 V) W6 ~) A* {; y
.... 8 Q8 b" _1 L' W) d: P1 L
mov al,byte ptr[ecx] ;把要单字节字符取出来放在al中
' W( Q; R% m# E2 A3 O+ I) W
& u% H5 G( l8 l' T4 y, z& p' R/*双字节处理代码*/ " ~1 p1 V& L+ L) n( u
test al,80h ;判断是否是中文gb2312编码.
: r! a& H0 F$ v! b) Nje @单字节 - s* f9 ~3 O: m$ k- R! V8 ^* }
shl eax,08h # k0 {0 y, S% o+ V5 L- l$ S! X
inc ecx . o8 o* M5 Q; \) L3 D4 |9 p. v
mov al,byte ptr[ecx] ;再取出一个单字节字符放在al中
6 P& b/ q+ i9 X3 A: E( i5 X4 Pjmp @双字节 8 g- q6 V* o$ }% `* C W
/*双字节处理代码*/
* i+ c( k& o) U) c7 I k$ G. F- X& w6 [3 }' `) R- d1 R" _
@单字节: # N! n9 C) q; {8 x
movzx eax,al ;零扩展一下
* w) Z% \# I4 ]7 a H1 R9 g0 z" v@双字节:
9 p) |+ T8 a) q6 }( L2 k3 Npush eax ;要处理的字符压栈
: Y0 t1 m/ P; ccall 贴字的函数 ;查询字库并控制显卡绘制出字符
7 k$ Y* @& ^: }inc ecx
8 I3 ^3 k+ }' Ljmp @begin |