改寫AutoHotkey輸出中文字串的寫法

由PTT看到Lumania (小糠榔)寫的輸出中文Unicode字串的AutoHotkey腳本,簡潔清楚(腳本裡使用了較新的函數,因此你的AutoHotkey必須是1.0.47+以上的版本):

2010/11/17 補充:
AutoHotkey已有UTF-8的分支,不必再使用這些方法了。請參考支援Unicode的Autohotkey終於浮上抬面!

 
SendBig5(xx)
{
  if (i:=StrLen(xx)) =0
     return
  loop
  {
     j:=1
     if((tmp1 := NumGet(xx, 0, 'UChar')) & 0x80)
     {
        tmp1:= (tmp1 < < 8) | NumGet(xx, 1, 'UChar')
        j:=2
     }
     sendinput, {ASC %tmp1%}
     stringtrimleft, xx, xx, j
     if (i-=j)=0
       break
  }
}

再用F12按來鍵來測試:

 
f12::
  sendBig5('中文測試')
  return

程式主要的邏輯是用{ASC nnnnn}輸出Unicode。依據官網文件的說明,nnnnn為1到255是ASCII碼,0128到0255是ANSI碼,而256到65535就是Unicode碼。 可惜有部份程式無法接受256~65535轉Unicode的作法,例如PSPad Unicode版本和Word 2003 SP3都不行(怪異的是PowerPoint 2003、Excel 2003卻又可以),因此我再修改了一下,用剪貼簿的方法解決此問題:

 
SendBig5(xx)
{
  WinGetClass,sClass,A
  ;;MsgBox %sClass%
  ;; PSPad Unicode || Word 2003
  if (sClass='TfPSPad.UnicodeClass' || sClass='OpusApp') {
    send_symbol_clp(xx)
    return
  }

  if (i:=StrLen(xx)) =0
     return
  loop
  {
     j:=1
     if((tmp1 := NumGet(xx, 0, 'UChar')) & 0x80)
     {
        tmp1:= (tmp1 < < 8) | NumGet(xx, 1, 'UChar')
        j:=2
     }
     sendinput, {ASC %tmp1%}
     stringtrimleft, xx, xx, j
     if (i-=j)=0
       break
  }
}

; 透過剪貼簿送出一組中文符號,如send_symbol_clp('。')
send_symbol_clp(symbol) {
  oldClip := ClipboardAll ;;%Clipboard%
  Clipboard =
  Clipboard = %symbol%
  ClipWait
  Send ^v
  ;;sleep 1000
  Clipboard = %oldClip%
  ;;oldClip =
  return ''
}


##

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

簡睿

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

您可能也會喜歡…

4 個回應

  1. nicklien1214表示:

    sorry, again for 同樣的主題

    我上一篇寫的是 (at line #3 #4)
    & l t ; 8 和 單引號
    結果呈現
    <8 和 ‘

    所以此站會作一些有時候反而壞事的自動轉換 站主可考慮處理一下

  2. nicklien1214表示:

    Thx for sharing; but
    code無法直接run

    <8

    似乎應該改為
    <<8
    "

  1. 2010/09/14

    […] 原版的 AutoHotkey 不支持 unicode ,给中文用户带来极大不便。比如,sendinput 输入中文时,必须借助剪贴板 或 自定义函数。 […]

發佈留言

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