中文样式转换器与服务






4.76/5 (30投票s)
2003年12月2日
11分钟阅读

641382

5340
中文风格和编码转换器,包括其上的服务
中文介绍 (内容与英文介绍略有不同,特别是中文部分!) (47.9KB)
引言
Microsoft .net 框架功能强大,不仅在于设计,更在于其提供的功能。
本文将介绍如何使用此功能,并提供将其构建为服务的想法(因为我们生活在面向服务的编程世界中)。 此外,我还提供了打包成安装包的示例,希望您能与我一起享受它。
让我们先从中文风格转换开始
l 中文风格转换
中文的风格(简体和繁体)可能非常不同(即使其中一些看起来相同)。
举例来说,就意思而言
中国是一个美丽的国家。 (简体中文)
中國是一個美麗的國家。(繁体中文)
但是它们的意思是相同的,几乎所有中国人都知道上面句子中每个对应的汉字都是相同的,即使汉字看起来有差异。
有些人习惯一种风格,而另一些人则喜欢另一种。 这就导致 IT 人员需要提供一些功能来在这些风格之间转换文字的显示方式。 已经有很多工具提供了此功能,但在 .net 世界中,最简单免费的工具就是 Microsoft .net 框架中的 Microsoft.VisualBasic.Strings.StrConv 函数。
我们只需要以 Microsoft.VisualBasic.Strings.StrConv (string sourceString, Microsoft.VisualBasic.VbStrConv targetStyle, int localID) 的格式使用此函数,然后 sourceString 的风格就会被更改为指定的 targetStyle 并作为字符串返回。 这是一个例子:
using Microsoft.VisualBasic;
……
string source = “中国是一个美丽的国家。”;
string target = Strings.StrConv(source, VbStrConv.TraditionalChinese, 0);
Then the result (target string) would be中國是一個美麗的國家。.
如果想转换为简体中文风格,只需在 StrConv 函数的第二个参数中使用 VBStrConv.SimplifiedChinese 即可。
很简单,对吧? 是的,这就是中文风格转换的乐趣所在。
l 编码转换
我们生活在一个多语言的世界里。 各种语言可能有不同的写法。 并且为了将其转换为电子数据,过去,许多语言都有自己的编码系统。 到了现在,我们甚至有了 Unicode 编码系统,它试图包含几乎所有的语言,即使是 Unicode,我们也有 UTF-8、UTF-16 和 UTF-7 格式。
这可能令人头疼,但这是事实。 即使对于中文,这两种风格也有两种不同的编码系统,一种是 code page 936(最常用的简体中文编码系统,但当然,此风格的中文也有其他编码页),另一种是 code page 950(最常用的繁体中文编码系统,同样,此风格的中文也有其他编码页)。
以之前的例子为例,让我们看一下下表
|
中 |
国 |
是 |
一 |
个 |
美 |
丽 |
的 |
国 |
家 |
936 |
D6D0 |
B9FA |
CAC7 |
D2BB |
B8F6 |
C3C0 |
C0F6 |
B5C4 |
B9FA |
BCD2 |
UTF-8 |
E4B8AD |
E59BBD |
E698AF |
E4B880 |
E4B8AA |
E7BE8E |
E4B8BD |
E79A84 |
E59BBD |
E5AEB6 |
UTF-16 |
2D4E |
FD56 |
2F66 |
004E |
2A4E |
8E7F |
3D4E |
8476 |
FD56 |
B65B |
|
中 |
國 |
是 |
一 |
個 |
美 |
麗 |
的 |
國 |
家 |
936 |
D6D0 |
87F8 |
CAC7 |
D2BB |
8280 |
C3C0 |
FB90 |
B5C4 |
87F8 |
BCD2 |
950 |
A4A4 |
B0EA |
AC4F |
A440 |
ADD3 |
ACFC |
C452 |
AABA |
B0EA |
AE61 |
UTF-8 |
E4B8AD |
E59C8B |
E698AF |
E4B880 |
E5808B |
E7BE8E |
E9BA97 |
E79A84 |
E59C8B |
E5AEB6 |
UTF-16 |
2D4E |
0B57 |
2F66 |
004E |
0B50 |
8E7F |
979E |
8476 |
0B57 |
B65B |
看到了吗?即使是简单的中文,在每种编码系统中也可能完全不同。 但别担心,大多数程序员都已经学会了处理编码。 在 Microsoft .net 框架中,处理编码转换非常简单,只需调用 System.Text.Encoding.Convert 方法即可。其用法可以是 System.Text.Encoding.Convert(Encoding source, Encoding target, byte[] source Bytes)(此方法是重载的,更多细节请参考文档),例如:
using System.Text;
……
byte[] source = Encoding.Unicode.GetBytes(“中国是一个美丽的国家”);
byte[] target = Encoding.Convert(Encoding.Unicode, Encoding.UTF8, source);
然后我们就得到了从 Unicode 到 UTF-8 编码格式的目标字节数组。
不算什么,只是对于简单的字符串,我们用了两页来描述风格和编码转换的基本知识。 现在让我们把它们结合起来。
l 将风格和编码转换结合起来
我希望创建一个类,让程序员只需调用一次即可完成中文风格和编码的转换。 由于源数据有多种格式(字符串、字节数组、流和文件格式),因此我为不同的场景制作了多个重载方法。 这是多对多关系场景,通过这些重载方法,我们可以将多种格式的中文转换为目标风格和指定的编码,当然,也可以是指定的格式。
我不会在这里复制代码,只提供截图,有关代码的更多详细信息,请查看 Converter.cs 文件(我已将此类继承自 System.MarshalByRefObject,以便可以将其托管在 .net remoting 中)。
让我们深入了解核心转换部分
如果用户想更改风格,那么我们需要将源字节转换为目标风格,然后需要做一些工作来调整从简体到繁体的转换(我将在后面详细描述)。 最后,我们将 Unicode 字节转换为目标编码并返回结果。
l 调整从简体中文到繁体中文的转换
在将简体中文转换为繁体中文时有一些技巧。 简体风格的相同汉字在转换为繁体风格后,根据不同的情况可能会有所不同,例如:
Simplified Chinese |
Traditional Chinese |
头发 |
頭髮 |
发达 |
發達 |
注意 |
注意 |
备注 |
備註 |
因此,我们需要创建转换表并将其保存到 XML 文件中,读取它并存储在内存中,然后在进行编码转换之前执行替换操作。 是的,这需要我们每天向 XML 文件添加更多转换案例,但由于 Microsoft 没有为我们做这件事,所以我们只能自己处理。
在进行替换操作时,我们希望考虑中文汉字之间的空格情况以调整格式,例如头发 & 头 发。 所以我创建了
一个函数来处理这种情况(只是尝试前进指针以检查下一个字节是否为空格)。
由于我们将动态修改 XML 文件,因此我还创建了 ChineseMappingXMLFilename 属性,并创建了一个 Setting 类,该类使用 FileWatcher 来监视 ChineseMappingXMLFilename 属性中指定的 XML 文件,然后此 Converter 类可以动态反映 XML 文件的更改。
l 制作消耗工具
得到 Converter 类后,我们就可以使用它了。 我只是创建了一个简单的 Conversion Pad 来使用它。 我创建了另一个 winform 控件库来使用它,并创建了另一个 winform 应用程序来使用这个 winform 控件。 并为该 winform 应用程序添加了消耗转换服务的 3 种方式:本地程序集、.net remoting、Web 服务。
介绍中文风格和编码转换就到这里了。 现在,我们将继续探讨如何将其变成一个服务。 有很多方法可以为其他程序提供服务,我将简单地将它们制作成 COM+ 应用程序、.net remoting、Web 服务。
l COM+ 应用程序
COM+ 应用程序在 DCOM 架构世界中非常有用。通过将转换托管在 COM+ 应用程序中,我们可以在旧版程序(用 VB6、VFP 或其他 COM 编程语言编写的程序)甚至 VB 脚本中使用它! 创建一个 COM 接口,然后让包装类继承自 System.EnterpriseServices.ServicedComponent,并设置 COM+ 应用程序的其他属性。 这样就可以了。 但如果我们希望在实现方面得到帮助,我们可以创建一个 Installer 类来创建和删除 COM+ 应用程序,只需添加几行代码即可:
然后,我们就可以通过简单的脚本部署此 COM+ 应用程序并使用它了。
dim objConverter
set objConverter = createobject("ChineseUtilComPlus.ConverterService")
msgbox objConverter.StringToStringEncodingIntegerFormat("中国是一个美丽的国家", 2, 936, 65001, 936)
set objConverter = nothing
l .net remoting
我们经常使用 IIS 或 Windows 服务来托管 .net remoting 服务,我希望将 Converter 类托管在 Windows 服务中。 在构建继承自 System.ServiceProcess.ServiceBase 的包装类之后,并允许在配置文件中指定 Chinese mapping XML 文件,我需要做更多工作来侦听 HTTP 和 TCP 通道的请求,并允许在配置文件中进行配置。
这样就可以了。 我还制作了 Installer 类,以使实现更加简单。对于 Windows 服务安装程序来说,这很简单,只需按照 MSDN 中的示例代码操作即可,无需再关心其他任何事情。
l Web服务
将 Converter 类托管在 Web 服务中,以便在其他兼容 SOAP 的程序中使用它会很有用。 在制作包装类之前,我放弃了让 System.Text.Encoding 能够被序列化为 XML 格式。 因此,我希望 Converter 可以通过指定编码为 int 或 string 格式的方法来调用,然后尝试使用 System.Text.Encoding.GetEncoding 函数来获取 System.Text.Encoding 实例。 对于 Web 服务,我们不得不放弃更多东西,例如由于序列化和安全问题,而不公开流或文件格式转换。 因此,最终,我只公开了字节数组和字符串的转换。
l 部署
构建服务很容易,因为所有需要做的就是遵循 MSDN 中的指南,但是为了方便部署,MSDN 在使用 Visual Studio.net 2003 构建 Windows Installer 格式的安装包方面帮助不大。
我花了很长时间研究并尝试使用 VS.net 2003 来创建一个可以部署所有服务或选定服务的安装包。 最后,我有了我的设计,为每个服务(包括我的示例转换 Pad)制作了 Merge Module,然后制作了一个 Setup Package 项目来包含所有 Merge Module,并加上一些选择界面。 使用选择界面的属性,我可以过滤出仅安装到计算机的选定 Merge Module,这样就可以实现仅安装选定服务的目的。
我不会使用任何其他安装工具,因为我希望继续使用所有来自 Microsoft 的解决方案,一旦拥有了 VS.net 2003,其余的就相当简单了。
l 还有什么可以做的?
是的,经过这么多页关于我的中文转换器工具的介绍,你可能已经感到厌烦和疲惫了。 但是,我建议您在希望获得有关将函数变成服务的想法时,查看设置包的代码和源文件。 你会发现,由于时间不足,我只写了简单的代码,其中许多部分都可以做得更完善。
例如,我们可以添加更多的选择界面,让用户选择使用 HTTP 或 TCP 协议或两者兼而有之来侦听请求;通过在文本框中输入数字来指定端口; 为 Converter 类制作异步函数;在转换 pad winform 中添加对文件夹中所有文件的转换等等。
目前就这些了,我可能在接下来的几个月里会花更多时间来完善这个工具。 所以请继续关注这个免费的中文转换工具。 在阅读了我糟糕而无聊的英文介绍后,祝您做个好梦。