找回密码
 点一下
查看: 2081|回复: 8

关于魔兽内码,也就是编码的转换问题.

[复制链接]
发表于 2009-5-13 21:28:15 | 显示全部楼层 |阅读模式
首先

然后
魔兽聊天是不能直接复制汉字的,需要转码.
最近用C#做练习,做个魔兽的辅助工具.
喊话功能漏字了.
例如,常用语.ini
在魔兽里只能显示常用.ini
我复制到记事本:甯哥敤璇?ini
但是我复制魔兽的常用语.ini到记事本:甯哥敤璇?ini
是一样的...为什么我程序转的UIF8在魔兽里就会漏字?

用了飞雪大人的转换,复制到魔兽是可以的.

所以到这里求助一下,看有没有人帮忙解答一下.先感激一下关注了此贴的所有人.
 楼主| 发表于 2009-5-13 21:29:15 | 显示全部楼层
我拿UltraEdit-32实验了一下
>>标识的为在UE里的操作
实验一:
常用语.ini
>>unicode转UTF8 (ASCII编辑)
甯哥敤璇?ini
UTF8转ASCII  ---粘帖时默认的操作
常用语.ini


实验二:
常用语.ini
>>unicode转UTF8 (ASCII编辑)
甯哥敤璇?ini
>>ASCII转UTF8 (Unicode编辑)
甯哥敤璇?ini
>>UTF8转ASCII
甯哥敤璇?ini
UTF8转ASCII  ---粘帖时默认的操作
常用譿ini ----漏字出现了- -#

我的程序转码可能就是走了实验二.
虽然明白,但是还是没找到解决之道.
据说,WideCharToMultiByte用来转是可以的.
但是我用了一个用这个API的VB程序实验了一下,发现也是漏字,所以没继续关注这个API.
回复

使用道具 举报

发表于 2009-5-13 21:35:21 | 显示全部楼层
宽字符么。。。
回复

使用道具 举报

 楼主| 发表于 2009-5-13 21:39:45 | 显示全部楼层
可能那个工具是用了宽字符的参数.
我也没注意.

朋友说是C#Unicode的原因,转的时候,提取到剪贴板,编码方式貌似是变化了.
他也懂C#的,弄了好久没解决,直接拿C++写了个链接库给我用了...

所以我也没深究WideCharToMultiByte.
只是没弄明白,觉得很遗憾,就来这里问问...希望有好心的高人解决俺的遗憾...
再次
回复

使用道具 举报

发表于 2009-5-13 23:01:23 | 显示全部楼层
这个我是不懂地,然后我问了飞雪殿,得到的答案是

这个是Windows的BUG,用了xp主题风格后就会丢字
回复

使用道具 举报

 楼主| 发表于 2009-5-14 01:48:16 | 显示全部楼层
这个也算是系统内码的一个问题.
在中文系统XP的记事本上复制
甯哥敤璇?ini
其实应该是宽字符的也就是两个字节.
而魔兽的是ASCII显示方式,也就是短字符(一字节)的.

问题就在于,在获取转成UTF8的字符串提取到剪贴板时保持短字符就可以.
(哦,这些都是我的见解,或许是错的,如果是这样,希望知道的告诉我)

c#怎么做我就疑惑在这里了.

所想来看看各位有没有人知道方法,或原理什么的.
因为U9和++的辅助都是解决这个问题的.

飞雪大人的转换器(有UTF8的那个TPainter)转换是可以的.
或许是转换过来的UTF8在程序文本控件上是以ASCII显示的.所以复制到魔兽正常..

继续等待解答...
回复

使用道具 举报

发表于 2009-5-14 10:31:12 | 显示全部楼层
  1. <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity processorArchitecture="*" version="5.1.0.0" type="win32" name="Microsoft.Windows.Shell.shell32"/>     <description>Windows Shell</description>  <dependency>                              <dependentAssembly>                   <assemblyIdentity                 type="win32"                name="Microsoft.Windows.Common-Controls" version="6.0.0.0"           publicKeyToken="6595b64144ccf1df" language="*"                processorArchitecture="*"   />                                </dependentAssembly>                  </dependency>                             </assembly>                              
复制代码
这是一个典型的xp风格manifest文件,在这里可以注意到有一个UTF-8。因此对于使用Windows主题风格的界面,windows实际存在一个隐式的UTF-8转换。当你把Ansi转换为UTF-8的文字放在使用了主题的文件框中时,一段本已经无法正常识别的utf-8文字再次被转换为utf-8,结果自然就是丢失部分不可识别字符了。
回复

使用道具 举报

 楼主| 发表于 2009-5-14 12:12:00 | 显示全部楼层
感谢飞雪老大的回答
系统转换一次是确实.
但是一直都不知道原来是主题的问题.

只不过不知道在程序里怎么避免而已.
回复

使用道具 举报

发表于 2009-5-14 14:52:06 | 显示全部楼层
引用第7楼linamong于2009-05-14 12:12发表的  :
感谢飞雪老大的回答
系统转换一次是确实.
但是一直都不知道原来是主题的问题.

只不过不知道在程序里怎么避免而已.
找一下编译器的选项,应该有个地方可以禁止生成manifest。或者生成exe后用资源编辑器把24号资源删掉
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-11-25 15:53 , Processed in 0.050151 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表