Как использовать Unicode в AutoHotKey?

Я пытаюсь сделать два дефиса триггером короткой тире, и три дефиса запускают длинную тире; как

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

кроме работы. Вот где я получил:

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

Ответы

Ответ 1

Текстовый файл .ahk должен быть сохранен с кодировкой UTF8-BOM, а не UTF8

Как указано в этом комментарии, размещение в качестве ответа для большей наглядности.

Ответ 3

Я скопировал код ниже с Форумы 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.

Ответ 4

EDIT: не утруждайте себя чтением моего ответа, следуйте инструкциям Удо Клейна, это намного проще, и он работает так, как должен.

как отправить символы Unicode с использованием последней версии autohotkey? (нет необходимости использовать предыдущую совместимую с Unicode версию)

Довольно сложно найти четкую информацию. Поэтому, чтобы дать понять начинающим (как и я):

  • скопируйте/запустите "код А", который в конце вашего script (он должен быть закодирован в ANSI)
  • скопируйте/минуйте "код B" в верхней части вашего script
  • найдите здесь код символа юникода http://www.utf8-chartable.de/unicode-utf8-table.pl
  • скопируйте 4 цифры после U +
  • в коде B (вверху вашего script): измените необходимый ключ (перед "::" )
  • в коде B (вверху вашего script): мимо юникода, который вы нашли на 2. ПОСЛЕ 0x (вместо "2260" )
  • сохраните script
  • дважды щелкните значок вашего script, он заменит/обновит предыдущую версию

Код 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/ не работает. Любая идея почему?