30

我试图让两个连字符触发一个短破折号,三个连字符触发一个长破折号;喜欢

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

除了工作。这是我到达的地方:

:*?: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

5 回答 5

61

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

正如此评论中所指出的,张贴作为提高知名度的答案。

于 2016-09-07T22:22:13.737 回答
4

单击Save as,更改编码方案,如下图:

在此处输入图像描述

于 2020-06-13T12:04:36.233 回答
2

编辑:不要费心阅读我的答案,按照 Udo Klein 的说明进行操作,它更容易并且可以正常工作。

如何使用最后一个自动热键版本发送 unicode 字符?(无需以前的 unicode 兼容版本即可工作)

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

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

代码 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/不起作用。知道为什么吗?

于 2015-02-11T07:24:21.623 回答
1

我从AutoHotKey 论坛复制了以下代码:

;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 输出。

于 2013-04-16T11:10:36.827 回答
0

引自为什么我的脚本中的非 ASCII 字符显示或发送不正确?

简短回答:将脚本另存为带有 BOM 的 UTF-8。

尽管 AutoHotkey 支持 Unicode 文本,但它已针对向后兼容性进行了优化,这意味着默认为 ANSI 编码,而不是国际上更推荐的 UTF-8。AutoHotkey 不会自动识别 UTF-8 文件,除非它以字节顺序标记开头。

有关如何使用 UTF-8 BOM 编码保存文件,请参见此处

于 2021-09-19T13:14:15.607 回答