Ответ 1
Текстовый файл .ahk должен быть сохранен с кодировкой UTF8-BOM, а не UTF8
Как указано в этом комментарии, размещение в качестве ответа для большей наглядности.
Я пытаюсь сделать два дефиса триггером короткой тире, и три дефиса запускают длинную тире; как
:*?:---=::—
:*?:--=::–
кроме работы. Вот где я получил:
:*?:11::
SendLevel 1
Send 2
return
SendLevel 0
:*?:21::3
это работает (11 производит 2, 111 производит 3)
:*?:--::
SendLevel 1
Send –
return
SendLevel 0
:*?:–-::—
Это тот же самый script, но '1 был заменен на' -, '2 заменен на' -, а '3 был заменен на' - '- "должен произвести" - "и" --- "должен производить" -", но это не работает, потому что Unicode полностью не поддерживается в используемой мной версии (AutoHotKey_L v1.1.09.04 от autohotkey.com).
Текстовый файл .ahk должен быть сохранен с кодировкой UTF8-BOM, а не UTF8
Как указано в этом комментарии, размещение в качестве ответа для большей наглядности.
У Autohotkey_L была поддержка юникода: http://l.autohotkey.net/. Новые версии Autohotkey предоставляют поддержку unicode из коробки: http://ahkscript.org/download/.
Я скопировал код ниже с Форумы 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.
EDIT: не утруждайте себя чтением моего ответа, следуйте инструкциям Удо Клейна, это намного проще, и он работает так, как должен.
как отправить символы Unicode с использованием последней версии autohotkey? (нет необходимости использовать предыдущую совместимую с Unicode версию)
Довольно сложно найти четкую информацию. Поэтому, чтобы дать понять начинающим (как и я):
Код 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
(смотреть пространство!)
Необходимое улучшение:
каким-то образом этот script не работает для всего юникода, данного на этом веб-сайте http://unicode-table.com/, но кто-то может быть достаточно добрым чтобы рассказать нам, почему некоторые юникоды работают, а другие нет, и, возможно, как заставить его работать для любых символов Юникода этого веб-сайта. Это, например, http://unicode-table.com/en/0609/ не работает. Любая идея почему?