当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 5 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : [新版无需补丁]wine中文乱码补丁解决尝试
帖子发表于 : 2013-03-01 13:03 

注册: 2012-07-25 10:49
帖子: 40
送出感谢: 0 次
接收感谢: 0 次
见5楼

wine中文乱码补丁尝试
==========

freetype.c
附件:
freetype.c.xz [49.05 KiB]
被下载 57 次

gdi32.dll.so
附件:
gdi32.dll.so.xz [756.02 KiB]
被下载 47 次

==========
水平有限,望多多指教
欢迎提供更好的方法
==========
有些程序使用 lf.lfCharSet=0 lf.lfCharSet=1 ...造成乱码,之前见过论坛里补丁对lf.lfCharSet=0(ANSI_CHARSET)有效,对1,...无效。
==========
改dlls/gdi32/freetype.c中
代码:
       if(!TranslateCharsetInfo((DWORD*)(INT_PTR)lf.lfCharSet, &csi, TCI_SRCCHARSET)) {
            switch(lf.lfCharSet) {
           case DEFAULT_CHARSET:
                  csi.fs.fsCsb[0] = 0;
               break;
           default:
               FIXME("Untranslated charset %d\n", lf.lfCharSet);
               csi.fs.fsCsb[0] = 0;
               break;
       }
        }


代码:
/* WINE_CUSTOM_CHARSET PATCH 0.2 wine_1.5.24 liuyc BEGIN */
/*README

 * ENVIRONMENT VARIABLES
    WINE_FORCE_CODEPAGE : 0:disable 1:GetACP others:directly set codepage
    or
    WINE_CUSTOM_CODEPAGE : 1:enable
    WINE_CHARSET_XXXX : 0:disable 1:GetACP others:directly set codepage (XXXX = 0,1,2,3,...)

 *REFERENCES http://www.winehq.org/pipermail/wine-patches/attachments/20081203/b4b7e84f/attachment-0001.pdf

 * LICENSE
 *the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version.
 *This patch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more details.
*/

    UINT forcecodepage = 0;
    UINT customcodepage = 0;
    char *env_wfdc = getenv("WINE_FORCE_CODEPAGE");
    char *env_wcdc = getenv("WINE_CUSTOM_CODEPAGE");
    if(env_wfdc != NULL) forcecodepage = atoi(env_wfdc);
    if(env_wcdc != NULL) customcodepage = atoi(env_wcdc);
    if (forcecodepage != 0) {
        if (forcecodepage == 1) {
            forcecodepage = GetACP();
            FIXME("WINE_FORCE_CODEPAGE == 1, lf.lfCharSet == %d, using GetACP (%d)\n",lf.lfCharSet,forcecodepage);
        } else FIXME("WINE_FORCE_CODEPAGE == %d, overriding lfCharSet(%d)\n",forcecodepage,lf.lfCharSet);
        if(!TranslateCharsetInfo((DWORD*)(INT_PTR)forcecodepage, &csi,TCI_SRCCODEPAGE)) {
            FIXME("OMG. Even this hack doesn't work. Let's PRAY.\n");
            csi.fs.fsCsb[0] = 0;
        }
        lf.lfCharSet = csi.ciCharset;
    } else {
       if (customcodepage == 1) {
           UINT codepage = 0;
           //char *env_wedc = (char *)malloc(18*sizeof(char));
           char *env_wedc;
           //memset(env_wedc,0,sizeof(env_wedc));
           //sprintf(env_wedc,"WINE_CHARSET_%.4d",lf.lfCharSet);
           
           asprintf(&env_wedc,"WINE_CHARSET_%d",lf.lfCharSet);
           FIXME("%s\n",env_wedc);
           char *env_wdc = getenv(env_wedc);
           if(env_wdc != NULL) codepage = atoi(env_wdc);
           if (codepage != 0) {
                if (codepage == 1) {
                    codepage = GetACP();
                    FIXME("%s == 1, using GetACP (%d)\n",env_wedc,codepage);
                } else FIXME("%s == %d, overriding lfCharSet\n",env_wedc,codepage);
                if(!TranslateCharsetInfo((DWORD*)(INT_PTR)codepage, &csi,TCI_SRCCODEPAGE)) {
                    FIXME("OMG. Even this hack doesn't work. Let's PRAY.\n");
                    csi.fs.fsCsb[0] = 0;
                }
                lf.lfCharSet = csi.ciCharset;
           } else if(!TranslateCharsetInfo((DWORD*)(INT_PTR)lf.lfCharSet, &csi, TCI_SRCCHARSET)) {
               switch(lf.lfCharSet) {
                   case DEFAULT_CHARSET:
                       csi.fs.fsCsb[0] = 0;
                       break;
                   default:
                  FIXME("Untranslated charset %d\n", lf.lfCharSet);
                  csi.fs.fsCsb[0] = 0;
                  break;
          }
             }
           //free(env_wedc);
       } else if(!TranslateCharsetInfo((DWORD*)(INT_PTR)lf.lfCharSet, &csi, TCI_SRCCHARSET)) {
            switch(lf.lfCharSet) {
           case DEFAULT_CHARSET:
                  csi.fs.fsCsb[0] = 0;
               break;
           default:
               FIXME("Untranslated charset %d\n", lf.lfCharSet);
               csi.fs.fsCsb[0] = 0;
               break;
       }
        }
    }
    // WINE_CUSTOM_CHARSET PATCH 0.2 wine_1.5.24 liuyc END


_________________
本论坛注册登陆有问题? 删cookie

http://liuycme.tk-----MyWebsite


最后由 liuyc 编辑于 2013-05-18 0:05,总共编辑了 2 次

页首
 用户资料  
 
2 楼 
 文章标题 : Re: wine中文乱码补丁解决尝试
帖子发表于 : 2013-03-02 20:23 
头像

注册: 2009-05-08 14:12
帖子: 526
地址: http://weibo.com/u/2201287863
送出感谢: 2
接收感谢: 4
测试一下,看看通达信还有没有部分乱码


_________________

只用Ubuntu/Unity:安全、高效、自由、简洁!
http://weibo.com/u/2201287863
----------------------------------------------------
用了4年Ubuntu,发现离开windows也可以活得很好
看球赛、炒股、聊天、office等等都不算问题了
一切都是习惯,困难解决了就好



页首
 用户资料  
 
3 楼 
 文章标题 : Re: wine中文乱码补丁解决尝试
帖子发表于 : 2013-03-03 21:46 
头像

注册: 2009-05-08 14:12
帖子: 526
地址: http://weibo.com/u/2201287863
送出感谢: 2
接收感谢: 4
附件:
tdx.png
tdx.png [ 259.96 KiB | 被浏览 1626 次 ]



我将gdi32.dll.so.xzj解压后替换/usr/lib/i386-linux-gnu/wine/gdi32.dll.so,还是乱码
freetype.c不知道怎么用


_________________

只用Ubuntu/Unity:安全、高效、自由、简洁!
http://weibo.com/u/2201287863
----------------------------------------------------
用了4年Ubuntu,发现离开windows也可以活得很好
看球赛、炒股、聊天、office等等都不算问题了
一切都是习惯,困难解决了就好



页首
 用户资料  
 
4 楼 
 文章标题 : Re: wine中文乱码补丁解决尝试
帖子发表于 : 2013-03-03 21:48 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 274
改那假注册表的字体就是。没见过要打补丁的。这2句,能兼容多少编码。。。


_________________
● 鸣学


页首
 用户资料  
 
5 楼 
 文章标题 : Re: [新版无需补丁]wine中文乱码补丁解决尝试
帖子发表于 : 2013-05-18 0:06 

注册: 2012-07-25 10:49
帖子: 40
送出感谢: 0 次
接收感谢: 0 次
用1.5.25及以后版本应该无问题
gdi32: Fix the GdiGetCodePage() support ANSI_CHARSET font associated charset.


_________________
本论坛注册登陆有问题? 删cookie

http://liuycme.tk-----MyWebsite


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 5 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 3 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译