應用系統突然有了個將現有系統轉成簡體的需求,詢問 Google 大神後發現,大概有兩個方向可以進行,一個是透過.JS的方式,系統掛上個.js,家上一小段Code,畫面自動就有繁簡互換的功能出現。雖然此方式簡單易做,但是,兩岸對於IT方面的習慣詞彙畢竟不相同,如果只是用這方式,還是不符合對案使用者的習慣。另一個則是透過 Office 中 Word 的強大功能,可以真對詞彙進行轉換,而不再是逐字轉換,轉出人家看不懂的東西。
小喵找到了黑大的這一篇【CODE-封裝Office繁簡轉換服務】裡面有詳記著相關的做法,不過由於程式碼是C#,於是小喵就動手轉換一下,順便做個測試範例。
緣起
應用系統突然有了個將現有系統轉成簡體的需求,詢問 Google 大神後發現,大概有兩個方向可以進行,一個是透過.JS的方式,系統掛上個.js,家上一小段Code,畫面自動就有繁簡互換的功能出現。雖然此方式簡單易做,但是,兩岸對於IT方面的習慣詞彙畢竟不相同,如果只是用這方式,還是不符合對案使用者的習慣。另一個則是透過 Office 中 Word 的強大功能,可以真對詞彙進行轉換,而不再是逐字轉換,轉出人家看不懂的東西。
小喵找到了黑大的這一篇【CODE-封裝Office繁簡轉換服務】裡面有詳記著相關的做法,不過由於程式碼是C#,於是小喵就動手轉換一下,順便做個測試範例。
撰寫程式
為了未來的使用方便,將相關的程式撰寫成一個元件(dll),未來要使用的專案只需要加入參考,即可使用
首先,新增一個類別專案,名稱為【PUtilChineseStrConverter】,修改類別名稱為【ChineseStrConverter】
加入參考
由於這是透過Office的Word功能,所以必須加入參考
撰寫的電腦需要安裝Office,未來運作的電腦也需要有Office的環境。
撰寫類別
類別的相關內容如下:
Imports System
Imports System.Collections.Generic
Imports System.Diagnostics
Imports System.IO
Imports System.Linq
Imports System.Runtime.InteropServices
Imports System.Text
Imports Microsoft.Office.Interop.Word
Public Class ChineseStrConverter
Implements IDisposable
Private wordApp As Application = Nothing
Private doc As Document = Nothing
Public Sub New()
wordApp = New Application()
wordApp.Visible = False
doc = wordApp.Documents.Add()
End Sub
Public Function ConvChineseString(ByVal src As String, ByVal chs2cht As Boolean)
Dim Result As String = ""
Try
doc.Content.Text = src
If chs2cht = True Then
'簡轉繁
doc.Content.TCSCConverter(WdTCSCConverterDirection.wdTCSCConverterDirectionSCTC, True, True)
Else
'繁轉簡
doc.Content.TCSCConverter(WdTCSCConverterDirection.wdTCSCConverterDirectionTCSC, True, True)
End If
Result = doc.Content.Text
Catch ex As Exception
Result = ex.Message
End Try
Return Result
End Function
#Region "IDisposable Support"
Private disposedValue As Boolean ' 偵測多餘的呼叫
' IDisposable
Protected Overridable Sub Dispose(disposing As Boolean)
If Not Me.disposedValue Then
If disposing Then
' TODO: 處置 Managed 狀態 (Managed 物件)。
'確實關閉Word Application
Try
Dim dontSave As Object = WdSaveOptions.wdDoNotSaveChanges
CType(doc, _Document).Close(dontSave)
If doc IsNot Nothing Then
Marshal.FinalReleaseComObject(doc)
End If
doc = Nothing
CType(wordApp, _Application).Quit(dontSave)
Catch ex As Exception
Finally
If wordApp IsNot Nothing Then
Marshal.FinalReleaseComObject(wordApp)
End If
End Try
End If
' TODO: 釋放 Unmanaged 資源 (Unmanaged 物件) 並覆寫下面的 Finalize()。
' TODO: 將大型欄位設定為 null。
End If
Me.disposedValue = True
End Sub
' TODO: 只有當上面的 Dispose(ByVal disposing As Boolean) 有可釋放 Unmanaged 資源的程式碼時,才覆寫 Finalize()。
'Protected Overrides Sub Finalize()
' ' 請勿變更此程式碼。在上面的 Dispose(ByVal disposing As Boolean) 中輸入清除程式碼。
' Dispose(False)
' MyBase.Finalize()
'End Sub
' 由 Visual Basic 新增此程式碼以正確實作可處置的模式。
Public Sub Dispose() Implements IDisposable.Dispose
' 請勿變更此程式碼。在以上的 Dispose 置入清除程式碼 (視為布林值處置)。
Dispose(True)
GC.SuppressFinalize(Me)
End Sub
#End Region
End Class
其中,轉碼的程式其實就只有一行,以繁轉簡為例,關鍵就是以下這一行
doc.Content.TCSCConverter(WdTCSCConverterDirection.wdTCSCConverterDirectionTCSC, True, True)
不過由於程式是藉由Word的應用程式來進行轉換,運作中可以從工作管理員觀察到有個Word在背景執行,因此,還要特別注意使用完成後的回收(Dispose)的部分。
測試範例
撰寫完成後,另外寫一個Windows Form來測試,測試畫面安排如下:
測試結果發現,轉換出來的換行怪怪的
透過中段點,來查看問題,發現本來的換行(vbCrLf),被置換為 vbCr
所以,使用時,還需要特別把vbCr的部分,置換回vbCrLf
測試Windows Form的按鈕按下相關程式碼如下:
Imports PUtilChineseStrConverter
Public Class Form1
Private Sub btnCvrt_Click(sender As Object, e As EventArgs) Handles btnCvrt.Click
Using oCvnt As New ChineseStrConverter
Dim Chs2Cht As Boolean = False
Select Case ComboBox1.SelectedText
Case "繁→簡"
Chs2Cht = False
Case "簡→繁"
Chs2Cht = True
End Select
Me.txtRlt.Text = oCvnt.ConvChineseString(Me.txtOrg.Text, Chs2Cht).replace(vbCr, vbCrLf)
End Using
End Sub
End Class
處理過換行後,執行的結果如下畫面:
末記
黑大的文章有提到,Word 的轉換效率,在眾多的繁簡轉換工具中,不算優,但卻是唯一可以轉換詞彙的,而這也是小喵所看重的,將他寫成元件,以利其他有需要時,加入參考即可使用。由於小喵工作環境VB.NET限定,所以轉為VB.NET的Code,特別記錄下來提供自己未來參考,也提供有需要的人參考)
參考資料:
以下是簽名:
- 歡迎轉貼本站的文章,不過請在貼文主旨上加上【轉貼】,並在文章中附上本篇的超連結與站名【topcat姍舞之間的極度凝聚】,感恩大家的配合。
- 小喵大部分的文章會以小喵熟悉的語言VB.NET撰寫,如果您需要C#的Code,也許您可以試著用線上的工具進行轉換,這裡提供幾個參考
Microsoft MVP Visual Studio and Development Technologies (2005~2019/6) | topcat Blog:http://www.dotblogs.com.tw/topcat |