在网上找到一篇很稀有珍贵的关于游戏汉化中的双字节问题处理原理的文章。 : U6 K* Y/ H+ Z. n& K
原文
" H4 ~& K) m5 o4 A+ Vhttp://www.cnblogs.com/Sunwayking/articles/1380777.html
4 t% A: R+ o/ s5 p: N% O
1 n5 i2 M3 ?* M' C0 d假设原始字库引擎如下(单字节字库引擎,不支持双字节):
8 J0 e& A- V& Z
- A0 O4 \3 |3 r. B: }4 i$ U@begin: 7 F8 r) c6 t5 w* Z4 ]. B
....
; Y/ T; u! C y jmov al,byte ptr[ecx] ;把要单字节字符取出来放在al中
6 H/ N. ^8 _' p1 u+ b+ E; Kmovzx eax,al ;零扩展一下 & Q3 c. J1 W+ i0 Q: ~. w& K
push eax ;要处理的字符压栈 ' B7 m& }% O# D$ b/ v6 r N2 ~
call 贴字的函数 ;查询字库并控制显卡绘制出字符
" ~" F* V' I: u2 u( Pinc ecx ! c- m7 o; f# b( Q. N7 I! i, ]
jmp @begin 5 ?% \, v* c7 J$ F
! ]2 d1 g; ?) ?( X# q
- \1 d3 B- j/ I- m3 r) n现在想让他支持中文,需要对双字节特别处理: * ]* b' ?4 q6 L+ W
! N }! y: D& B@begin: + Y w* ^ A! P+ D. H# B2 i
....
) D2 g, x, T5 [1 U) F; Smov al,byte ptr[ecx] ;把要单字节字符取出来放在al中 0 N j, d5 q: E
2 P# b, O$ x. q9 |8 Y& E& y/*双字节处理代码*/ 5 O& @/ r: N3 `4 w6 R! F0 v
test al,80h ;判断是否是中文gb2312编码. 1 H. j# K: \! L
je @单字节 7 O9 P4 U3 w( w
shl eax,08h
' e) i7 W5 y/ V* b" Y# A+ ~inc ecx
: {. x' _) U% e$ k* Mmov al,byte ptr[ecx] ;再取出一个单字节字符放在al中
$ B9 @7 W6 Z Qjmp @双字节 6 K; Y3 S0 u' t$ K
/*双字节处理代码*/ + L1 L: o9 l& h
: _* k8 f& g* X1 c% z+ z
@单字节: * B( J1 `' ^, V0 q5 r: k
movzx eax,al ;零扩展一下
8 }# h+ J# [: F) z5 Q@双字节:
4 ?& A" z5 a! ?$ d3 opush eax ;要处理的字符压栈 $ K; s: }) D2 R$ N) j
call 贴字的函数 ;查询字库并控制显卡绘制出字符 ' N$ R0 e3 y4 `/ a( g. v
inc ecx
1 z, O8 z% i& f+ }& Vjmp @begin |