如何在AutoHotKey中使用Unicode?

时间:2013-03-26 11:14:13

标签: autohotkey

我试图让两个连字符触发短划线,三个连字符触发长划线;像

:*?:---=::—
:*?:--=::–

除了工作。这是我要去的地方:

:*?:11::

SendLevel 1

Send 2 

return



SendLevel 0

:*?:21::3 

这是有效的(11产生2,111产生3)

:*?:--::

SendLevel 1

Send –

return



SendLevel 0

:*?:–-::—

这是相同的脚本,但'1'已被' - '取代,'2'已被' - '取代,'3'已被'-'-“ - ”取代“ - ”和“---”应该生成“ - ”,但它不起作用,因为在我使用的版本中不完全支持Unicode(来自autohotkey.com的AutoHotKey_L v1.1.09.04)。

4 个答案:

答案 0 :(得分:37)

  

.ahk文本文件需要使用 UTF8-BOM 编码而不是UTF8保存

正如this comment所指出的那样,张贴作为更具可见性的答案。

答案 1 :(得分:2)

点击Save as,然后如下所示更改编码方案:

enter image description here

答案 2 :(得分:1)

我从AutoHotKey forums

复制了以下代码
;IMPORTANT, you must save this script as UTF-8 to make it work.

::!?::
::?!::
PutUni("‽")
Return

::neko::
PutUni("猫")
Return

:?:damn::
PutUni("✩☠#‼")
Return

;Paste UTF8 string (Hex encoded or not) as unicode.
;If you don't use Hex encoding, you must save your script as UTF8
PutUni(DataIn)
{
    SavedClip := ClipBoardAll
    ClipBoard =
    If RegExMatch(DataIn, "^[0-9a-fA-F]+$")
    {
        Loop % StrLen(DataIn) / 2
        UTF8Code .= Chr("0x" . SubStr(DataIn, A_Index * 2 - 1, 2))
    }
    Else
        UTF8Code := DataIn

    Transform, ClipBoard, Unicode, %UTF8Code%
    Send ^v
    Sleep 100 ;Generous, less wait or none will often work.
    ClipBoard := SavedClip
    Return
}

PutUni函数会将所需的输入“转换”为所需的Unicode输出。

答案 3 :(得分:1)

编辑:不要费心阅读我的回答,按照Udo Klein的说法进行操作,这样做会更容易,而且工作正常。

如何使用上一个autohotkey版本发送unicode字符? (不需要以前的unicode兼容版本)

很难找到明确的信息。所以要让初学者(像我一样)明白:

  1. 复制/过去"代码A"在脚本的末尾(它应该用ANSI编码)
  2. 复制/通过"代码B"在您的脚本顶部
  3. 在此处找到您的unicode字符代码http://www.utf8-chartable.de/unicode-utf8-table.pl
  4. 复制U +后的4个数字
  5. 代码B中的
  6. (在脚本的顶部):更改所需的密钥(在" ::"之前)
  7. 代码B中的
  8. (在脚本的顶部):通过你在2.在0x之后找到的unicode(而不是" 2260")
  9. 保存您的脚本
  10. 双击脚本图标,它将替换/更新以前的版本
  11. 代码A:

    SendUnicodeChar(charCode)
    {
    VarSetCapacity(ki, 28 * 2, 0)
    EncodeInteger(&ki + 0, 1)
    EncodeInteger(&ki + 6, charCode)
    EncodeInteger(&ki + 8, 4)
    EncodeInteger(&ki +28, 1)
    EncodeInteger(&ki +34, charCode)
    EncodeInteger(&ki +36, 4|2)
    
    
    DllCall("SendInput", "UInt", 2, "UInt", &ki, "Int", 28)
    }
    
    
    EncodeInteger(ref, val)
    {
    DllCall("ntdll\RtlFillMemoryUlong", "Uint", ref, "Uint", 4, "Uint", val)}
    

    代码B:

    !+^D::  ; when press CTRL+ALT+SHIFT will output "≠"
    { 
    SendUnicodeChar(0x2260) 
    }
    return
    

    (观看空间!)

    需要改进:

    不知何故,这个脚本对于本网站http://unicode-table.com/给出的所有unicode都不起作用,但是有人可能会很友好地告诉我们为什么有些unicode正在工作而其他人不在,以及也许如何让它适用于本网站的任何unicode角色。 例如http://unicode-table.com/en/0609/这个不起作用。知道为什么吗?