1. 카카오톡 저장한 텍스트 파일은 OS공통 인코딩 형식과 다르다.
카카오톡 저장한 텍스트 파일을 메모장으로 열면 열리나, 엑셀이나 ahk로 열면 깨진다.


.카톡 raw -> 메모장 읽기 -> 인코딩 ok
.카톡 raw -> ahk, 엑셀 읽기 -> 인코딩 x



(1) 파일을 읽을 때 아무 것도 선언을 하지 않으면, 카카오톡 저장한 파일 형식이 깨진다!
무슨말이냐면
아무 변수도 선언 안한채로
FileRead, Var, C:\카카오톡저장.txt
MsgBox %Var%
너는 이미 깨져 있다.

(2) 마찬가지로 카카오톡 파일을 엑셀로 읽으면 파일 형식이 깨진다.
ahk랑 같은 형태로 깨진다. 오전 -> ?ㅼ쟾





2. 원본 카톡 텍스트 파일을 UTF-8로 저장하면 ahk(엑셀)에서 default 읽기 ok

.카톡 raw -> 메모장 읽기(인코딩ok) -> 메모장다른이름저장(인코딩 UTF-8) -> ahk 읽기 -> 인코딩 ok


3. OS에서 메모장에 텍스트 파일 저장하면(기본인코딩:ANSI) ahk(엑셀)에서 default 읽기 ok
.메모장 문서 작성 -> 문서1 저장(인코딩 ANSI)
.메모장 문서 작성 -> 문서2 저장(인코딩 UTF-8)

(1)ahk Default 인코딩(아무 선언도 하지 않음)
.문서1(ANSI) -> ahk 읽기 -> ok
.문서2(UTF8) -> ahk 읽기 -> ok

(2)ahk CP949 인코딩
.문서1(ANSI) -> ahk CP949 읽기 -> ok
.문서2(UTF8) -> ahk CP949 읽기 -> ok

(3)ahk UTF-8 인코딩
.문서1(ANSI) -> ahk UTF-8 읽기 -> FAIL
.문서2(UTF8) -> ahk UTF-8 읽기 -> ok

※ 부연설명 :  전체 전역에 "FileEncoding UTF-8"이라고 선언하면
이전에 Ansi(CP949추정)으로 읽어서 저장한 애들은 깨져서 나온다.
.문서1(ANSI) -> ahk UTF-8 읽기 -> FAIL


4. 카톡 raw는 추정컨대 UTF-8로 인코딩 되어 저장됨
하지만 UTF-8을 OS 내 프로그램들이 처음 읽을 때 기본적인 CP949로 읽어오려고 해서 깨지는 듯 하다.
메모장 UTF-8 명시 후 저장 - 프로그램들이 인식 / 카톡 UTF-8 형식 - 프로그램들이 미인식
(1)
.카톡Raw -> ahk 읽기(Default) -> FAIL
.카톡Raw -> ahk 읽기(CP949) -> FAIL (Default와 같음)
.카톡Raw -> ahk 읽기(UTF-8) -> ok

※ 부연 설명 : 파일인코딩 CP939나 Default나 카톡Raw 읽으면 깨지는 모양이 같다.
즉 ahk의 디폴트 인코딩은 CP939임이 확인되는 부분.

5. CP949를 939로 틀리면 아무것도 읽어오지 못한다. 


6. 핫키 간 인코딩 선언은 영향을 받지 않는다.

;성공 예시, FileRead전에 반드시 UTF-8 인코딩 해줘야함.
F2::
FileEncoding, UTF-8
FileRead, Var, C:\카카오톡저장.txt
Msgbox %Var%
return

;실패 예시, F2를 누르고 F3을 눌러도 깨지게 나옴
F2:: 
FileEncoding, UTF-8
return

F3::
FileRead, Var, C:\카카오톡저장.txt
Msgbox %Var%
return


7. 결론 : 불필요하게 전역에 UTF-8 선언할 필요도 없고
왜? 3.(3) 참조

카톡Raw파일 FileRead전에만 반드시 UTF-8 인코딩 해주면 됨.

'Programming > AutoHotKey' 카테고리의 다른 글

Send의 여러 Mode 에 대해  (0) 2019.05.10
AutoHotKey튜토리얼 알게된점 정리(계속수정)  (0) 2019.05.09
AutoHotKey Intro  (0) 2019.05.09

Send의 여러 Mode 에 대해

Programming/AutoHotKey 2019. 5. 10. 09:29 Posted by ­행복
출처

Event 모드
Event 모드는 WindowsAPI의 keybd_event, mouse_event를 이용해 한개씩 이벤트를 생성하는 방식
일정한 간격으로 개개의 조작 이벤트를 생성. 이벤트 실행 도중 유저가 실시한 조작이 개입이 가능. 이것을 막으려면 BlockInput 커멘드로 유저의 조작을 무효화 할 수 있다.

조작의 간격은 SetKeyDelay, SetMouseDelay커맨드로 설정할 수 있다.

예)
+q::
SetKeyDelay, 500
Send qwerty
return
-> qwerty가 0.5초 간격으로 출력, 도중에 사용자가 키입력을 하면 매크로 실행 도중 입력이 된다.


Input 모드
입력의 재생속도가 매우 빠르다. 사용자가 수행한 입력은 매크로가 끝난뒤에 실행된다.
다른 프로그램이 하위레벨키훅(?)을 사용하고있으면 Input모드의 성능이 크게 저하된다. 때문에 다른 AutoHotkey스크립트가 동작하는 경우, Input모드는 자동으로 Event모드로 변경된다. 또한 Windows95/NT에서는 Input모드를 이용하지 못하고 Event모드로 변경된다.

Play 모드
Play모드에서는 일련의 조작이 액티브 윈도우에 보내진다.
input 모드보다 저속이지만, SetKeyDelay, -1. -1이 설정된 Event모드보다는 고속으로 동작한다.
SetKeyDelay,10,10,Play로 설정하면, Event모드와 같게키 조작동안 일정한 간격을 열리게 할 수 있다.
재생중에 유저가 실시한 조작은 동작 종료 뒤로 밀린다.
다만 윈도우 키를 포함한 시스템 hot키는 동작하기 때문에 시작 메뉴 등에 의해 방해받는 경우가 있다.
AutoHotKey가 키보드 훅을 사용하는 경우 자동으로 윈도우 키가 비활성화되어 오동작을 방지한다.
Play모드로 windows키(LWin,RWin)을 눌러도 Win+R등의 hot key는 반응하지 않는다.
또 CapsLock, NumLock, ScrollLock 키의 토글 상태를 변경하는 것도 할 수 없다.
재생중 Ctrl+Alt+Del이나 Ctrl+Esc를 누르면 재생 도중 종료되어, 스크립트의 다음이 실행된다.
플레이 모드에서 생성한 키가 눌린 상태는 GetKeyState등에서 검출할 수 없다.
스크립트가 자신의 윈도우에 보내졌을때는 예외적으로 검출할 수 있지만, Rshift등과 같이 키의 좌우를 구별할 수 없다.

Remarks
어느 모드도, 특정의 애플리케이션을 능숙하게 조작할 수 없는 경우가 있다.
 조작하고 싶은 애플리케이션에 따라 구분하여 사용할 필요가 있다.

https://autohotkey.com/docs/Tutorial.htm#s11

1. 핫키 입력은 핫키뒤에 :: (콜론 두개 붙임)
return문 위까지 여러개의 줄이 순차적으로 수행됨

2. send명령은 print문처럼 출력하려면 send, 뒤에 문장만쓰면되는데 여기에 특수문자는 {}로 묶어서 써야함. 안묶을시 문자열입력 말고 키입력도 가능함.

가령 ^j::
send, ^j하면 루프에 빠뜨릴수도 있음

3. msgbox, 뒤에는 {}로 안묶어도 바로 써놓은 내용이 텍스트로 만들어져서 출력됨.

4. 핫키입력은 윈도우 디폴트 키보다 핫키가 우선순위가 적용됨. 가령 #D::를 동작하는 순간 바탕화면 보기가 수행이 되지않음

5. ahk_class는 대소문자 구별함
가령, 그림판의 클래스를 가저와서 동작하게 하려면
#IfWinActive ahk_class MSPaintApp인데 MSPaintApp이 한글자라도 대소문자 틀리면 해당 내용 아래의 조건식이 동작안함.

6. 프로그램은 한글영어 구별함
예제 Untitled - Notepad를 그대로
WinActivate, Untitled - Notepad
#IfWinActive Untitled - Notepad
쓰고 메모장에서 실행해도 효과 없음
제목 없음 - 메모장이라고 해야함
참고로 위의 구문은 Notepad를 활성화시키라는 명령이고
두번째조건문은 활성화 되어있다면 아래의 스크립트를 수행하라는 명령이다.

7. 명령어는 대소문자 구별 없음
send나 Send나 동일
변수도 대소문자 구별 없음 MyVar나 Myvar나 같은 변수임.

8. Bold태그 예제
^b::  ; CTRL+B hotkey
Send, {Ctrl down}c{Ctrl up}  ; Copies the selected text. ^c could be used as well, but this method is more secure.
SendInput, [b]{Ctrl down}v{Ctrl up}[/b] ; Wraps the selected text in BBCode tags to make it bold in a forum.
return  ; This ends the hotkey. The code below this point will not get triggered.

(1) return문이 hotkey 적용을 끝낸다는 뜻이구나
(2) enter키가 문단끝에 포함시 [/b]가 아래로 내려감. 즉 버그 수정이 필요한 미완의 구문
(3) Send와 SendInput의 차이는 무엇일까


9. SciTe4AutoHotkey에서
수정 후 F5로 소스코드를 빌드하면
"An older instance of this script is already running. Replace it with this instance?
Note: To avoid this message,l see #SingleInstance in the help file.
너무 당연한 이야기지만"예"를 눌러야 변경한게 적용이 됨. 읽지않고 귀찮아해서 간과할수 있던 사실임.

10. 핫키를 쓸때는 마지막키에 쎄미콜론을 붙여야 문법이 성립됨
0 & 1 :: -> 에러
0 & 1:: ->옳은 문법

11. & ampersand를 쓸 때의 문제점
& 엠퍼센드는 앞의 키를 누른 상태에서 뒤의 키를 눌렀을 때 발동 되는 것인데
앞의 키를 핫키로 써버리면 그 키를 그냥 눌렀을때는 아무런 동작을 하지 않는 문제점을 가지게 됨. 이를 해결하려면 그 숫자::그숫자 구문을 한줄 추가로 해결이 가능
무슨말이냐하면
0 & 1:: -> 0을 못쓰게됨
` & 1:: -> `을 못쓰게 됨
0::0을 한줄추가하면 -> 0을 누를때 0이 나옴
`::` 한줄추가 -> `을 누를때 `가 나옴
단, 길게 누를때 계속 글자가 반복 출력되는 것은 이제 못하게 됨. 가령
000000000000````````````````이렇게 누르고 있을때 출력못하고 0` 하나씩만 찍히고 만다.


12. 변수 대입과 출력 방법
변수에 대입에는 두 가지 방볍이 있다. =과 :=이 그것이다.
c언어처럼 별도로 자료형을 선언하거나 하지 않는다.
변수 대입에 문자열 입력시 =는 ""없이 써도 되나 := 사용시 반드시 ""를 붙여야 한다.
변수 대입에 :=을 사용하는 경우, 함수나 수식 계산의 결과값을 변수에 저장할 수 있다.   
변수 출력은 변수 앞뒤로 %를 둘러싸면 된다.
 예)
Var1 = Hello World!   ; 옳음
Var2 := "Hello World!" ; 옳음
Var3 := Hello World! ; 틀림, !개수에따라 결과값은 홀수개 1과 짝수개 0이 반복

MyVar = Var1 ; Var1이라는 값이 들어감
MyVar := Var1 ;Var1변수가 가진 값이 들어감, 따라서 이렇게 써야 옳음

MyVar := 6 + 8 / 3* 2 - Sqrt(9)
MyVar := "The value of 5 + " MyVar2 " is: " 5 + MyVar2

13. MsgBox로 함수나 변수의 결과값을 보고싶으면 %를 붙이면 된다. 이 때 %의 앞 뒤로는 한칸 이상 띄워야 한다. ,는 붙여도 안붙여도 결과는 같고 수식이나 변수를 그대로 출력해버린다.
MsgBox The Value is %Var%.
MsgBox, The Value is %Var%.
MsgBox % "The Value is" . Var . "."
;.은 따옴표로 구성된 문자열과 변수를 이어주는 건데 생략도 가능
MsgBox % 6 + 8 / 3 * 2 - Sqrt(9)
;바로 수식의 결과값이 표시됨
MsgBox MyVar
MsgBox %MyVar%
 MsgBox % MyVar

MsgBox % SubStr("123abc789", 4, 3) ; Returns abc
MsgBox SubStr("123abc789", 4, 3) ; Returns SubStr("123abc789", 4, 3)


14. Run, 명령어로 프로그램, 인터넷URL(웹브라우저), 폴더를 오픈할 수 있다.
 예)
Run, %A_MyDocuments%
Run(,) C:\

15. 각종 변수
ClipBoard = 실제 클립보드에 저장된 값
A_Mydocuments = 내 문서 경로
A_Now = 현재날짜시간분초
20190510150838


^q::
Send %A_Now%
Send {Enter}
SendInput %A_MyDocuments%
Send {Enter}
Send %A_MyDocuments%
Send {Enter}
SendInput %A_Hour%
Send {Enter}
SendInput %Clipboard%
return


16. StringReplace : 클립보드에 \n을 \r\n으로 교체 가능한 문법 예시
SpringReplace

17. 사용자에게 input값을 받는 강력한 InputBox라는 명령어가 있다. 마치 c언어의 scanf같은데 차이점은 scanf의 경우 사용자에게 할 질문을 printf로 먼저 출력하고 scanf로 입력대기 상태가 되는데 InputBox는 한문장으로 질문과 입력이 가능하다.
InputBox, Var , 팝업창제목,팝업창내용
의 형식을 가지며, 사용자에게 입력가능한 팝업이 뜬다. 입력한 값은 Var변수에 저장된다.

AutoHotKey Intro

Programming/AutoHotKey 2019. 5. 9. 14:04 Posted by ­행복
요즘핫한 이슈 - RPA
RPA 를 대체하는 솔루션이 뭐가 있을까?
라는 의문에서 출발함

늘 잔머리를 굴리고자 하는 경향이 있었으나, 발전시키지 못함.
메크로? 예전에 수강신청 할때나 썼던 메크로는
자유도가 낮다. 남이 맨들어 놓은거 갖다쓰므로

수강신청시 여석이 없습니다 라고 IE에서 경고 메시지가 랜덤한 위치에 뜬다. Chrome에서는 F11전체화면으로 하면 경고메시지의 확인버튼을 일정한 위치로 맞출 수 있다. 나는 능력이 있음에도 그당시엔 말로만 실천은 없었고 이와 같은 간단한 잔머리에서 그쳐버림.
지금해보니 IE에서도 창위치를 고정하는 툴이 있었는데...왜 이런걸 안쓸까? 전사에 설치하고 쓰는사람 조사해보니 10명도 안됨 충격 이게 이회사의 현실인가. 하긴 나도 투자에 미쳐서 나도 발전이 없는 똑같은 놈들이었으니까! 부단히 컴퓨터 할생각을 못했지. 왜? 이미 신입때 6개월 배운걸로 먹고 사니까. 매너리즘.

그러던 중 RPA가 회사에 도입됨. X도아닌 프로그램인데 자유도가 높은대신 복잡하고 무엇보다 이회사 밖에서 쓸수없거나 비싼돈 내고 써야 하는 솔루션이라는게 굉장히 빡이침.

가장 빡이쳤던건 대학수강신청때 썼던 메크로랑 기능상 별차이가 없는데 이것때문에 업무자동화의 틀을 마련했다는 내용으로 혁신을 했다고 수상하는 꼴이 뵈기싫어서
너ㅅㄲ가 만든게 아니더라도 그것이랑 기능 거의 흡사한 무료툴 분명히 세상에 있을거야
그리고 반드시 너의 툴보다 빠르고 훌륭한 방법으로 업무 자동화를 완성 시킬거다
너에게 그리고 회사에 보여주겠다
라는 생각으로 열심히 구글링한 결과 AutoHotKey라는 엄청난 프로그래밍 툴이 있었음. 무려 게이머들이 오토 메크로 돌려서 사냥할때 쓰던 2000년대 초반부터 쓰던 툴인데 미쳐가지고 나는 이걸 2019년이 되어서야 암. 이상한게 시중에 JAVA나 Python같은 책은 겁나 많은데 이건 한개도 없으니 서점에 갔어도 모를 수밖에. 나름 강력한 프로그래밍언어인데 Windows를 무시하는 풍조 때문인지 뭣때문인지 도대체 모르겠는데 생각보다 사람들이 모름. 왜냐면 게임광 xx이형도 (몰라서) 안알려줄 정도니까 사실상 이걸 돌리면 인생이 바뀔 정도의 강력한 툴인데 그래서 이거 역량 강화에 올인

그동안 파이썬이니 뭐니 부담만 갖고 내 운영환경에서 실전에서 못써먹는 언어에 연관성도 없는데 따로 공부하려니 되질 않았지...
결국 업무역량은 가장 내업무연관성이 높은걸 꾸준히 해야한다.
마찬가지로 리눅스 찬양자 윈도우 비관론자에게 일침 남이 만든 OS 안쓴다고 경시하지만 윈도우라도 제대로 활용해보셨는지?
결국 전세계의 대부분의 사용자들은 윈도우 OS를 쓴다. 어디 수요 하나 없겠는가. 구린OS윈도우도 명령 프롬프트없이 강력하게 활용하는 방법을 내가 찾아내서 보여주겠다. 그리고 이걸로 밥 빌어먹고 살아보겠다.

찾아낸건 3가지
autohotkey.com
scite4autohotkey
pulover's macro creator

첫번째건 본좌 프로그래밍 언어
두번째건 본좌언어 활용플랫폼 자바-이클립스 같은 관계
세번째건 첫번째언어를 바탕으로 만들어진, 좀더 시각화하고 GUI에서 쉽게 해주는거 기타 상용개발솔루션같은느낌

첨부터 세번째껄로 해보려고하니 너무 진입장벽이 높았다. 어렵다기보다 시간소비가 너무 많이 들고 GUI에서 동작안하는 것들이 좀 있어서
튜토리얼 좀 보다가 역시 개발의 본질은 CLI 이지 하면서 두번째꺼 오늘부터 깔아서 2일차 실습중

좀 개발이 어려운 건 세번째걸로 GUI에 그려가면서 만들어진 메크로를 ahk로 변환하면 됨