AutoHotkey輸出中文的方法

AutoHotkey無法直接送出Unicode的中文,以前使用剪貼簿來輸出中文,現在找到直接輸出的新方法了。

方法一:使用剪貼簿的方法

::,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個分號處的說明。

##

您可能也會有興趣的類似文章

簡睿

服務於軟體業的資訊老兵。興趣廣泛,學習力佳,樂於分享所知所學。

您可能也會喜歡…

19 個回應

  1. bennyfung711表示:

    果然厲害 測試再度成功 答案非常有用
    跳脫字元四個字早就加入個人詞庫裡面
    但始終不知道有甚麼用 現在終於明白

  2. bennyfung711表示:

    已經建立的腳本如下:
    1.ahk
    2.ahk
    3.ahk

    我想實現的目標是:
    退出目前腳本 1.ahk 便會自動執行腳本 2.ahk
    退出腳本 2.ahk 便會自動執行腳本 1.ahk

    好想知道有無類似「F12::ExitApp」
    這種快捷的方法去呼叫 1.ahk 和 2.ahk

    執行 3.ahk 去呼叫 1.ahk 和 2.ahk 時
    不想 3.ahk 的圖示出現在桌面的右下角
    腳本應該怎樣寫呢

    • 簡睿表示:

      第一個需求範例如下,請自行測試:

      1.ahk:
      F11::MsgBox 1.ahk, press F11

      F12::
      run 2.ahk
      ExitApp

      —-

      2.ahk:
      F11::MsgBox 2.ahk, press F11

      F12::
      run 1.ahk
      ExitApp

      .ahk副檔名關聯到autohotkey.exe

      最後的需求:

      .ahk開頭加上

      #NoTrayIcon

      就不會有系統匣圖示。

      • bennyfung711表示:

        測試成功
        解答得十分到位
        第一次看到範例時
        的確有點疑惑和不大相信
        但測試之後結果是全部命中
        心中的難題一掃而空

        還有個小小的問題一直困擾著我
        就是想把「;」及「’」這兩個鍵的位置互相交換
        但始終不得其法 有空再為我傷腦筋吧 不用急 祝好

  3. bennyfung711表示:

    如果我想按下Alt不放,鍵入鍵盤九宮格的45408後才放開Alt,這樣輸出個「常」字.我應該怎樣做?

    • bennyfung711表示:

      如果在「倉頡輸入」的狀態下,我想鍵入「F」「B」「R」「L」「B」及空白鍵,這樣輸出個「常」字.請問腳本應該怎樣寫呢?

      • 簡睿表示:

        安裝Autohotkey_L即可支援Unicode了,可直接輸出中文,例如下列按Ctrl+Alt+w就輸出 常:

        ^!w::
        send 常
        return

  4. bennyfung711表示:

    簡睿你好,大家都好:
    無意中又再發現「注意」「總開支」會出現問題(例如下面的設定),請問應如何解決呢?(不用急)

    :*:EYZ::
    clipboard = 注意
    send ^v
    return

    :*:VAJZ::
    clipboard = 總開支
    send ^v
    return

  5. bennyfung711表示:

    無意中發現「常」字會出現問題(例如下面的設定),請問應如何解決呢?

    ::,AAJHRF::
    clipboard = 日日都笑口常開
    Send ^v
    return

    ::,ABYJFB::
    clipboard = 閒話家常
    Send ^v
    return

  6. yehmy表示:

    現有的輸入法用到真實keyboard,我希望改變鍵盤的按鍵排列,所以想改用螢幕小鍵盤.

  7. yehmy表示:

    請問版主,如果要做一個螢幕小鍵盤,用來輸入”任意”的中文字,不是特定幾個字,
    是否變成要設計一套中文輸入法?
    那就工程浩大,我也頭大了!

    • 簡睿:表示:

      這現有的輸入法不就可以了嗎?

      或者顯示注音符號或倉頡字根,可以讓使用者用點選的來組字,就像Windows Mobile上的輸入法。

      不過,組字還需要更多系統API,單純的Autohotkey應該是無能為力。

  8. Bear表示:

    發現用方法一常常,輸入快一點,就會有之前剪貼簿的文字出現,如輸入addr’後出現地址,但立刻輸入me’沒有出現我的名字,而是地址,但如果用方法二,每輸入一個字詞都要用那麼長串的程式碼嗎?我用兩個字詞以上,reload時就會說錯誤…..不知這樣說,版大了解嗎?

  1. 2021/07/11

    […] 转自:http://jdev.tw/blog/713/autohotkey-output-chinese修改了AHK的代码增加了一段能在新版AU3中使用的代码 […]

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *