如何在AutoHotKey中使用UTF-8?

33

我正在尝试让两个连字符触发一个短划线,三个连字符触发一个长划线;就像这样:

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

除了工作以外。我到这里:

:*?:11::

SendLevel 1

Send 2

return

SendLevel 0

:*?:21::3

这个有效(11会产生2,111会产生3)

:*?:--::

SendLevel 1

Send –

return

SendLevel 0

:*?:–-::—

这是相同的脚本,但将“1”替换为“-”,将“2”替换为“--”,将“3”替换为“—”——“--”应生成“–”,“---”应生成“—”,但它不起作用,因为我使用的版本(来自autohotkey.com的AutoHotKey_L v1.1.09.04)不完全支持Unicode。


你已经回答了自己的问题,它无法工作是因为我所使用的版本不完全支持Unicode,你还在寻找什么答案? - user1944441
版本号 - Eamon Moloney
5个回答

71

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

此评论所指出的那样,把它作为答案发布可以更加突出显示。


2
从我的角度来看,最好的答案。此外,这是有意设计的。证明引用([来源](https://www.autohotkey.com/docs/AHKL_ChangeLog.htm#v1.1.08.00)):“将默认脚本代码页更改为ANSI,因为以前的行为是常见的混淆源。现在,UTF-8文件必须具有字节顺序标记(BOM)才能被正确识别。” - john c. j.
1
非常感谢!救了我的一天。我已经厌倦了 AHK 的“代码页”,它没有提供任何自动替换的结果。 - Dimiano
Notepad++ 中如何更改文件编码? - Stevoisiak
3
在Notepad++中打开标记为“编码”的菜单,然后选择所需的编码选项。 - Ro Yo Mi
1
如果您使用的是普通的Microsoft记事本,则UTF8-BOM不会显示为编码选项。对我来说,使用Unicode格式有效。 - Kes Perron
@SMPerron Unicode 是 UTF-16。在大多数 Notepad 版本中,UTF-8 是带有 BOM 的 UTF-8。Windows 10 版本 1903 使编码名称更加准确,其中 UTF-8 是不带 BOM 的新默认设置。然而,AutoHotkey 仍需要 BOM。 - Lexikos

6

点击 另存为,并如下图所示更改编码方案:

enter image description here


这个答案补充了 https://dev59.com/kGUo5IYBdhLWcg3w9jV4#39379877 的内容,通过明确解释如何更改文件的编码方式。 - Sebastian Nielsen

2

编辑:不要浪费时间看我的回答。相反,阅读社区维基回答(由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. 在“代码B”(在您的脚本顶部)中:将您找到的Unicode粘贴到2.之后的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不能,并且也许会告诉我们如何使其适用于该网站上的任何Unicode字符。 例如,这个http://unicode-table.com/en/0609/就无法工作。有什么想法吗?


希望有人能够找出为什么这段代码不能针对每个Unicode字符工作,并完成这段代码。 - Mojtaba Rezaeian

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
}
< p > PutUni 函数将会把所需的输入“翻译”成所需的Unicode输出。 < /p >

8
我刚刚使用了Send命令,但只有在我将编码从UTF8改为UTF8+BOM后才起作用。 - berezovskyi
我通常使用石田Unicode转换器,将内容粘贴在上方,获取与JS/Java/C有关的结果,并进行一些小的更改,如括号和前导零,即\u{3B3}Send {U+03BF} - Frank N
06-13-2020: 不起作用。错误:“参数#2无效。具体来说:Unicode。”https://gyazo.com/09218ffc4171756817df9546890b6062是的,我确实将文件保存为UTF-8。 - Sebastian Nielsen

0

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

简短回答:使用带BOM的UTF-8保存脚本。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接