imewlconverter icon indicating copy to clipboard operation
imewlconverter copied to clipboard

win10微软拼音适用性问题

Open jiaojiaodubai opened this issue 2 years ago • 7 comments

问题描述: 使用本软件转换自定义的码表为win10微软拼音用户自定义短语时,对于中文字符,它的效果很好; 而对于非中文字符,即使关闭词条过滤,转换效果也并不理想——它会将希腊字符、拼音等转化为毫不相干的中文字符。 你们的项目对.dat文件头、词频(在这里是顺序)、拼音编码所做的工作非常出色,问题仅出现在对短语(用户想输出的词)的编码上。

一些建议: 我对本项目的源代码进行了研究(实际上我并不掌握C#,我只是懂一点Java),问题似乎出现在下面的语句中。

var py = wl.GetPinYinString("", BuildType.None); bw.Write(Encoding.Unicode.GetBytes(py)); bw.Write(BitConverter.GetBytes((short) 0)); bw.Write(Encoding.Unicode.GetBytes(wl.Word));

限于时间,我没能对此上述代码进行深入研究,但下面的信息或许对你们有所帮助。 在win10微软拼音程序正常导出的用户自定义短语的.dat文件中,它对短语的编码过程大概是这样的:

  1. 对于短语s,先把s存储为字符串;
  2. s转化为不大于4位数的16进制整型的Unicode值uhex,字母全部用大写; 3.【关键一步】:若uhex不足4位,则在uhex左侧填充若干个数字0,直到uhex变为4位数;
  3. 此时uhex的形式为形如abcd的4位16进制数,将其对调为cdab即为字符s在.dat文件中的16进制编码。 如:拼音á的字符串对应的16进制整形Unicode值为E1,其在.dat文件中的正确编码为00E1

jiaojiaodubai avatar Jun 14 '22 10:06 jiaojiaodubai

实际上你说的编码不就是 utf-16le? 另外关于转换问题最好提供一个测试词库并说明预期结果。

nopdan avatar Jun 30 '22 10:06 nopdan

详细信息已经包含在邮箱附件中,请阅读压缩包内的PDF说明文档,压缩包内还包含了相关的测试文件。

------------------ Original ------------------ From: "studyzy/imewlconverter" @.>; Date: Thu, Jun 30, 2022 06:55 PM @.>; @.@.>; Subject: Re: [studyzy/imewlconverter] win10微软拼音适用性问题 (Issue #220)

实际上你说的编码不就是 utf-16le? 另外关于转换问题最好提供一个测试词库并说明预期结果。

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you authored the thread.Message ID: @.***>

jiaojiaodubai avatar Jun 30 '22 14:06 jiaojiaodubai

你是只给作者本人发的?,他不常在线,最好公开出来,大家一起讨论。

nopdan avatar Jun 30 '22 14:06 nopdan

好的,文件如下 imewlconverter Issue #220 附件.zip

jiaojiaodubai avatar Jun 30 '22 14:06 jiaojiaodubai

看了一下是编码格式自动检测出错了,手动转为utf-16le再转换就没问题了。 src\ImeWlConverterCore\Helpers\FileOperationHelper.cs 288行

nopdan avatar Jun 30 '22 15:06 nopdan

看了一下是编码格式自动检测出错了,手动转为utf-16le再转换就没问题了。 src\ImeWlConverterCore\Helpers\FileOperationHelper.cs 288行

324行,最终问题就是如何区分 utf-8 和 gb18030。这里的实现有待改进。

nopdan avatar Jun 30 '22 15:06 nopdan

看了一下是编码格式自动检测出错了,手动转为utf-16le再转换就没问题了。 src\ImeWlConverterCore\Helpers\FileOperationHelper.cs 288行

324行,最终问题就是如何区分 utf-8 和 gb18030。这里的实现有待改进。

  1. 主流编辑器很少有判断编码这样的逻辑,建议给出转换后的预览窗口,由用户根据预览来判断是否符合其本意并决定是否切换为其他编码。
  2. 或者增加一种导入原始数据的方法:从剪贴板粘贴到文本区。

希望以上的建议对你们有用

jiaojiaodubai avatar Jun 30 '22 16:06 jiaojiaodubai