tft每日頭條

 > 科技

 > 簡繁轉換易錯字梳理

簡繁轉換易錯字梳理

科技 更新时间:2024-08-11 03:18:10

簡繁轉換易錯字梳理(利用API來實現中文簡繁轉換)1

Word裡有一個簡繁轉換功能,很靓仔,一秒鐘全文轉換完畢

Excel中也有這個功能,不過是外置COM加載項的形式,用起來就沒有Word裡那麼靓仔了

這個功能呢,說到底其實就一個API

聲明如下:

Private Declare Function LCMapStringA Lib "kernel32" ( _ ByVal Locale As Long, _ ByVal dwMapFlags As Long, _ ByVal lpSrcStr As String, _ ByVal cchSrc As Long, _ ByVal lpDestStr As String, _ ByVal cchDest As Long) As Long

參數很簡單:

第1個:Locale,代表語言環境,有簡繁轉換需求的場景,基本上不需要管這個參數

第2個:dwMapFlags,這個是轉換目标的标識符,我們這裡隻需要關注兩個

Const LCMAP_SIMPLIFIED_CHINESE = &H2000000 '繁體轉簡體

Const LCMAP_TRADITIONAL_CHINESE = &H4000000 '簡體轉繁體

第3個:源字符串指針

第4個:源字符串長度

第5個:目标字串指針

第6個:目标字串長度

說來說去,就第2個參數有用

但是呢,在調用的時候要注意,VB6的字符串的典型問題。

先看代碼

Private Declare Function LCMapStringA Lib "kernel32" ( _ ByVal Locale As Long, _ ByVal dwMapFlags As Long, _ lpSrcStr As Any, _ ByVal cchSrc As Long, _ lpDestStr As Any, _ ByVal cchDest As Long) As Long Private Declare Function lstrlenA Lib "kernel32" (ByVal lpString As String) As Long Private Const LCMAP_SIMPLIFIED_CHINESE = &H2000000 '繁體轉簡體 Private Const LCMAP_TRADITIONAL_CHINESE = &H4000000 '簡體轉繁體 Function ConvertChinese(ByVal srcString As String, ByVal bSimplified As Boolean) As String Dim lngLength As Long Dim strBuffer As String lngLength = lstrlenA(srcString) '不使用lenB If lngLength = 0 Then GoTo lExit '不使用Exit Function strBuffer = Space(lngLength - 1) If bSimplified Then LCMapStringA 0&, LCMAP_SIMPLIFIED_CHINESE, ByVal srcString, lngLength, ByVal strBuffer, lngLength '轉簡體 Else LCMapStringA 0&, LCMAP_TRADITIONAL_CHINESE, ByVal srcString, lngLength, ByVal strBuffer, lngLength '轉繁體 End If ConvertChinese = strBuffer lExit: End Function

調用也很簡單:

Debug.Print ConvertChinese("中華人民共和國LoveLive", False)

輸出結果:在我的垃圾筆記本上時間消耗大概是0.01毫秒

中華人民共和國LoveLive

這裡做兩處解釋:

一、這裡我用了lstrlenA這個API來計算長度,為啥不用len或者lenB呢,具體原因,你自己可以改了試試,這是VB媽媽的特征決定的,隻有這樣才行,要不然結果裡就會有多餘的字符串

有的人說,沒關系,有多餘的,我最後處理完,先處理一下再返回

還是那句話,您說得都對,您開心就好,我臉上笑嘻嘻,心裡MMP

二、我的API改了聲明,byval lpSrcStr As String改成了ByRef lpSrcStr As Any

這是為了提高效率,你說傳字符串和傳其指針到底哪一個效率高呢?

雖然由于VB媽媽的原因,這裡也并沒有傳遞字符串本身的指針,而是傳遞了字符串緩沖區的指針

但是這樣也能快不一些

當然,也有些人說用W版的函數還能更快,好的,我也寫了W版的

Private Declare Function LCMapStringW Lib "kernel32" ( _ ByVal Locale As Long, _ ByVal dwMapFlags As Long, _ lpSrcStr As Any, _ ByVal cchSrc As Long, _ lpDestStr As Any, _ ByVal cchDest As Long) As Long Private Const LCMAP_SIMPLIFIED_CHINESE = &H2000000 '繁體轉簡體 Private Const LCMAP_TRADITIONAL_CHINESE = &H4000000 '簡體轉繁體 Function ConvertChinese(ByVal srcString As String, ByVal bSimplified As Boolean) As String Dim lngLength As Long Dim strBuffer As String lngLength = Len(srcString) '不使用lenB If lngLength = 0 Then GoTo lExit '不使用Exit Function strBuffer = Space(lngLength) If bSimplified Then LCMapStringW 0&, LCMAP_SIMPLIFIED_CHINESE, ByVal StrPtr(srcString), lngLength, ByVal StrPtr(strBuffer), lngLength '轉簡體 Else LCMapStringW 0&, LCMAP_TRADITIONAL_CHINESE, ByVal StrPtr(srcString), lngLength, ByVal StrPtr(strBuffer), lngLength '轉繁體 End If ConvertChinese = strBuffer lExit: End Function

調用同上,時間消耗大概是上面的一半左右

也是兩個地方簡單解釋:

一、這裡少了一個API,為什麼呢,因為W版的函數,就不需要VB媽媽代管AU<->UA轉換了,所以算字符個數就可以了

二、因為現在是W版函數了,需要用StrPtr直接獲取字符串的數據地址,為啥呢,因為沒有AU轉換了

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved