论坛风格切换切换到宽版
  • 15242阅读
  • 22回复

无须添加代码而让程序显示出Utf-8编码的汉字,是如何实现的? [复制链接]

上一主题 下一主题
离线dzyedzye
 

发帖
11
金钱
110
威望
11
只看楼主 倒序阅读 0 发表于: 2012-03-23

  寒秋老师在《把Utf-8的编码写入到文件中 http://bbs.hanzify.org/read-htm-tid-66051-fpage-3.html》中提到:“……这些程序通常无法显示汉字。有些汉化者修改了程序,自己补写了对符串的处理。然而有很多程序似乎无法这样修改。我后来跟踪了程序对字符的处理后,发现只须改动一个地方,就可让程序显示出Utf-8编码的汉字,而无须别外添加汇编代码。
  本人也碰到类似问题,有个软件(inpaint4.3)是采用US—ASCII编码,而不是UNICODE编码,英文字符串无论是用GBK、UNICODE还是UTF—8格式的中文字符替代,结果都显示为乱码,实在令人头痛。曾经尝试修改代码页如 PUSH  03A8  也无法正确显示汉字。
  在这里想请教寒秋老师和各位大侠,像这种无须添加代码而让程序显示出Utf-8编码的汉字,是如何实现的?它的原理又是怎样的?汇编代码又是怎样的形式?

离线dzyedzye

发帖
11
金钱
110
威望
11
只看该作者 1 发表于: 2012-03-23
如图,菜单全是乱码:


离线dzyedzye

发帖
11
金钱
110
威望
11
只看该作者 2 发表于: 2012-03-23
相关的汇编:

:00477A22 E809D7FFFF              call 00475130     &File
:00477A27 8BCE                    mov ecx, esi
:00477A29 E8A2D9FFFF              call 004753D0     File

…………

:00473171 B92037B600              mov ecx, 00B63720          ;MainWindow

…………

0047516C  E80F9F1600                        call    SUB_L005DF080  QMenuBar

……
离线dzyedzye

发帖
11
金钱
110
威望
11
只看该作者 3 发表于: 2012-03-24
晚上无事,找到了寒秋老师的方法,确实在那个程序中简单有效。
对一个模块进行改造:
0073AFB0                           SUB_L0073AFB0:
0073AFB0  51                                push    ecx
0073AFB1  56                                push    esi
0073AFB2  57                                push    edi
0073AFB3  C7442408903E9300                  mov    dword ptr [esp+08h],L00933E90
0073AFBB  B8903E9300                        mov    eax,L00933E90
0073AFC0  B901000000                        mov    ecx,00000001h
0073AFC5  F0                                lock
0073AFC6  0FC108                            xadd    [eax],ecx
0073AFC9  8B7C2418                          mov    edi,[esp+18h]
0073AFCD  85FF                              test    edi,edi
0073AFCF  7518                              jnz    L0073AFE9
0073AFD1  8B442408                          mov    eax,[esp+08h]
0073AFD5  8B742410                          mov    esi,[esp+10h]
0073AFD9  8906                              mov    [esi],eax
0073AFDB  BA01000000                        mov    edx,00000001h
0073AFE0  F0                                lock
0073AFE1  0FC110                            xadd    [eax],edx
0073AFE4  E96B010000                        jmp    L0073B154
                   ……      ……     ……
0073B16E  5F                                pop    edi
0073B16F  8BC6                              mov    eax,esi
0073B171  5E                                pop    esi
0073B172  59                                pop    ecx
0073B173  C3                                retn
  
那么这种手段是否有普遍意义呢?能否推广到此类US-ASCII编码的程序中呢?等有时间再加验证。
离线dzyedzye

发帖
11
金钱
110
威望
11
只看该作者 4 发表于: 2012-03-25
今晚在找一个模块的功能,call 00473160
无意中创建了一个“无语言版”,没有菜单,没有文字提示,连弹出窗口都无文字了。
没有鸟文,是不是不用汉化了?



离线dzyedzye

发帖
11
金钱
110
威望
11
只看该作者 5 发表于: 2012-03-26
寒秋老师的方法在这里同样有效。
虽然还是要找一下,但毕竟简便。

现在能够正确显示UTF—8汉字了。
离线寒秋

发帖
231
金钱
780
威望
78
只看该作者 6 发表于: 2012-03-26
其实就是找出显示资源的跳转,让它强迫使用Utf-8编码来显示。
因为默认都是用Ascii显示的,所以没改的话,就会是乱码。
离线dzyedzye

发帖
11
金钱
110
威望
11
只看该作者 7 发表于: 2012-03-26
回 6楼(寒秋) 的帖子
谢谢寒秋老师。
====================

这种程序是很BT的,主窗口、菜单、标题、按钮、状态行、文本……,分别采用相同或不同的显示方式,
同是窗口标题,可用几种不同的显示方式;按钮文字也可是如此,比如OK,翻译成“好”,有的地方能正确显示,而有的地方却是乱码。


离线dzyedzye

发帖
11
金钱
110
威望
11
只看该作者 8 发表于: 2012-03-26
这种软件的开发平台,实在是太烂了,重复的废代码特别多。
举例说:
004010ED  68F0D8AF00                        push    SSZ00AFD8F0
004010F2  E829B75700                        call    SUB_L0097C820
004010F7  894508                            mov    [ebp+08h],eax
004010FA  83C404                            add    esp,00000004h
004010FD  8BC4                              mov    eax,esp
004010FF  8965E8                            mov    [ebp-18h],esp
00401102  6A00                              push    00000000h
00401104  8D5508                            lea    edx,[ebp+08h]
00401107  83CB02                            or    ebx,00000002h
0040110A  52                                push    edx
0040110B  8BCF                              mov    ecx,edi
0040110D  C645FC05                          mov    byte ptr [ebp-04h],05h
00401111  895DF0                            mov    [ebp-10h],ebx
00401114  C70000000000                      mov    dword ptr [eax],00000000h
0040111A  E891AC1900                        call    SUB_L0059BDB0
0040111F  EB02                              jmp    L00401123
00401121                           L00401121:
00401121  33C0                              xor    eax,eax
00401123                           L00401123:
00401123  89461C                            mov    [esi+1Ch],eax
00401126  C745FC00000000                    mov    dword ptr [ebp-04h],00000000h
0040112D  F6C302                            test    bl,02h
00401130  741B                              jz     L0040114D
00401132  8B4508                            mov    eax,[ebp+08h]
00401135  83E3FD                            and    ebx,FFFFFFFDh
00401138  83C9FF                            or    ecx,FFFFFFFFh
0040113B  F0                                lock
0040113C  0FC108                            xadd    [eax],ecx
0040113F  750C                              jnz    L0040114D
00401141  8B5508                            mov    edx,[ebp+08h]
00401144  52                                push    edx
00401145  E866955700                        call    SUB_L0097A6B0
0040114A  83C404                            add    esp,00000004h
0040114D                           L0040114D:
0040114D  8B4E1C                            mov    ecx,[esi+1Ch]
00401150  6A01                              push    00000001h
00401152  E8299E1900                        call    SUB_L0059AF80
00401157  6A14                              push    00000014h
00401159  E8945B6400                        call    SUB_L00A46CF2
0040115E  8BF8                              mov    edi,eax
00401160  83C404                            add    esp,00000004h
00401163  897DE4                            mov    [ebp-1Ch],edi
00401166  C645FC07                          mov    byte ptr [ebp-04h],07h
0040116A  85FF                              test    edi,edi
0040116C  7436                              jz     L004011A4
0040116E  6AFF                              push    FFFFFFFFh
========================
和下面一段:
00401072  6860D9AF00                        push    SSZ00AFD960
00401077  E8A4B75700                        call    SUB_L0097C820
0040107C  894508                            mov    [ebp+08h],eax
0040107F  83C404                            add    esp,00000004h
00401082  8BC4                              mov    eax,esp
00401084  8965E4                            mov    [ebp-1Ch],esp
00401087  6A00                              push    00000000h
00401089  8D4D08                            lea    ecx,[ebp+08h]
0040108C  51                                push    ecx
0040108D  BB01000000                        mov    ebx,00000001h
00401092  8BCF                              mov    ecx,edi
00401094  C645FC02                          mov    byte ptr [ebp-04h],02h
00401098  895DF0                            mov    [ebp-10h],ebx
0040109B  C70000000000                      mov    dword ptr [eax],00000000h
004010A1  E80AAD1900                        call    SUB_L0059BDB0
004010A6  EB02                              jmp    L004010AA
004010A8                           L004010A8:
004010A8  33C0                              xor    eax,eax
004010AA                           L004010AA:
004010AA  894614                            mov    [esi+14h],eax
004010AD  C745FC00000000                    mov    dword ptr [ebp-04h],00000000h
004010B4  F6C301                            test    bl,01h
004010B7  741B                              jz     L004010D4
004010B9  8B5508                            mov    edx,[ebp+08h]
004010BC  83E3FE                            and    ebx,FFFFFFFEh
004010BF  83C8FF                            or    eax,FFFFFFFFh
004010C2  F0                                lock
004010C3  0FC102                            xadd    [edx],eax
004010C6  750C                              jnz    L004010D4
004010C8  8B4D08                            mov    ecx,[ebp+08h]
004010CB  51                                push    ecx
004010CC  E8DF955700                        call    SUB_L0097A6B0
004010D1  83C404                            add    esp,00000004h
004010D4                           L004010D4:
004010D4  6A14                              push    00000014h
004010D6  E8175C6400                        call    SUB_L00A46CF2
004010DB  8BF8                              mov    edi,eax
004010DD  83C404                            add    esp,00000004h
004010E0  897DE4                            mov    [ebp-1Ch],edi
004010E3  C645FC04                          mov    byte ptr [ebp-04h],04h
004010E7  85FF                              test    edi,edi
004010E9  7436                              jz     L00401121
004010EB  6AFF                              push    FFFFFFFFh
=========================
猛一看,还真像孪生兄弟,
离线dzyedzye

发帖
11
金钱
110
威望
11
只看该作者 9 发表于: 2012-03-26
这个变态的平台,跳转经常出现连跳,往往下一个跳转点只有一句,就是跳到另一个地方。
这种乱打补丁的做法,怎么开发商好意思拿出产品来?
看这种代码毫无美感可言,简直是种折磨。

不玩它了,告一段落。

要下载此汉化版的,请到115网盘。地址:
http://115.com/file/ansnxrqe