2008年03月1日
AutoHotkey輸出中文的方法
由於AutoHotkey無法直接送出Unicode的中文,以前使用剪貼簿來輸出中文,現在找到直接輸出的新方法了。
下載測試.ahk檔案:zh.ahk
##
方法一:使用剪貼簿的方法
::,tw::
oldClip = %Clipboard% ;; 把目前的剪貼簿內容先存起來
clipboard = 台灣 ;; 把要輸出的文字存入剪貼簿
Send ^v ;; 送出Ctrl+V貼上剪貼簿內容
Clipboard = %oldClip% ;; 再把剪貼簿還原
return
方法二:求出中文字的ASCII碼,直接送出這些碼
- 本方法來自對岸的高手:在脚本中使用Send发送中文
- 我們以「中文」兩個字來說明,首先將這兩個字存成一個文字檔,檔名取為test.txt
- 在DOS視窗下,用 debug test.txt 命令進入除錯模式,減號出現後輸入 d 並按Enter鍵
- 開頭4個字元就是「中文」二字的ASCII碼,「中」字是A4 A4,「文」字是A4 E5
- 另外也可以用EmEditor來查閱中文字碼,將游標停在查閱字元前再按〔Ctrl+W〕,EmEditor即顯示該字元的Unicode碼與ASCII碼
- 16進位的A4A4是10進位的42148,A4E5則是42213,若按Alt+42148則輸出「中」字,Alt+42213則輸出「文」字
- 因此寫一個函數(_sendRaw)做上述字碼換算,再用Send送出
_sendRaw程式碼
::/zh::
_sendRaw("中文")
return
_SendRaw(Keys)
{
Len := StrLen(Keys) ; 得到字串的長度,注意一個中文字元的長度是2
KeysInUnicode := "" ; 將要發送的字元序列
Char1 := "" ; 暫存字元1
Code1 := 0 ; 字元1的ASCII碼,值介於 0x0-0xFF (即1~255)
Char2 := "" ; 暫存字元2
Index := 1 ; 用於迴圈
Loop
{
Code2 := 0 ; 字元2的ASCII碼
Char1 := SubStr(Keys, Index, 1) ; 第一個字元
Code1 := Asc(Char1) ; 得到其ASCII值
if(Code1 >= 129 And Code1 <= 254 And Index < Len) ; 判斷是否中文字元的第一個字元
{
Char2 := SubStr(Keys, Index+1, 1) ; 第二個字元
Code2 := Asc(Char2) ; 得到其ASCII值
if(Code2 >= 64 And Code2 <= 254) ; 若條件成立則說明是中文字元
{
Code1 <<= 8 ; 第一個字元應放到高8位上
Code1 += Code2 ; 第二個字元放在低8位元上
}
Index++
}
;; MsgBox %Code1%
if(Code1 <= 255) ; 如果此值仍<=255則說明是非中文字元,否則經過上面的處理必然大於255
Code1 := "0" . Code1
;;; KeysInUnicode = "" ;;; 若發現送出的中文變成ASCII數值,把此行開頭的分號刪掉
KeysInUnicode .= "{ASC " . Code1 . "}"
if(Code2 > 0 And Code2 < 64)
{
Code2 := "0" . Code2
KeysInUnicode .= "{ASC " . Code2 . "}"
}
Index++
;;; Send %KeysInUnicode% ;;; 若發現送出的中文變成ASCII數值,把此行開頭的分號刪掉
if(Index > Len)
Break
}
Send % KeysInUnicode ;;; 若發現送出的中文變成ASCII數值,把此行開頭加上分號
Return ""
} ;; _sendRaw
測試
輸入 /zh 則輸出 中文 二字。下載測試.ahk檔案:zh.ahk
備註
若有發現最後輸出的是類似 中42213 的文字,可能是輸出速度過快造成問題,可試著把Send指令移到迴圈裡,請看3個分號處的說明。##
