[mac] sublime text3 한글 붙여넣기 풀어서 넣어지는 문제

[mac] sublime text3 한글 붙여넣기 풀어서 넣어지는 문제

맥북에서 sublime text3(서브라임 택스트)를 사용하다가 문제가 생겼습니다.

맥의 finder에서 파일명을 복사하다가 한글이 분해(?)되는 문제입니다.

스크린샷 이라는 글자가 ㅅㅡㅋㅡㄹㅣㄴㅅㅑㅅ 으로 변하는 마법…

 

기본적으로 지원하는 메모 앱에서는 정상 동작해서 좀 찾아봤더니 맥은 윈도우즈나 리눅스(linux)와는 별도의 UTF8 방식을 채용하고 있었습니다.

맥은 UTF8을 사용하지만 NFD(Normalization Form Canonical Decomposition)라는 방식으로 정규화를 하고,

일반적인 UTF8은 NFC(Normalization Form Canonical Composition)방식을 사용하기 때문에 서브라임에서 한글이 전부 풀어지는 문제가 발생한 것이었습니다.

 

해결책을 찾던 중 한 일본인의 Sublime text3 Plugin 을 발견!!

https://github.com/astronaughts/SublimeNFDToNFCPaste

설치는 sublime text 3 실행 > Preferences > Browse Packages 를 눌러서 sublime의 플러그인 설치 경로를 알아내거나

/Users/admin/Library/Application Support/Sublime Text 3/Packages

위의 경로로 들어가면 됩니다.

 

해당 경로에서

# git clone https://github.com/astronaughts/SublimeNFDToNFCPaste SublimeNFDToNFCPaste

실행하시면 됩니다;; 쉽죠? ㅎㅎㅎ

소스 한번 확인해봤더니 달랑 5줄 ㅎㅎㅎ

class NfdToNfcPasteCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        paste = sublime.get_clipboard()
        sublime.set_clipboard(unicodedata.normalize('NFC', paste))
        self.view.run_command('paste')

붙여넣기할때 NFC로 문자열을 변경해주네요.

앞으로 유용하게 쓸꺼 같습니다.

 

참고

유니코드 정규화 한글

유니코드 정규화 영어

한글 깨지는 UTF8 문서에 BOM 추가

Add UTF-8 BOM

가끔 UTF-8문서에 한글이 들어가 있을 경우에 파일을 열면 한글이 깨져서 나올때가 있다.

이는 한글이 들어있는 UTF8로 인코딩된 파일에 BOM이 없어서 UTF8로 읽어야하는지를 몰라서 발생하는 현상이다. BOM이라는 놈이 직접 넣어주기엔 매번 귀찮다.

그래서 이렇게 웹에서 자바스크립트로 BOM을 넣어주도록 했다.

텍스트 파일에 간단히 BOM을 넣어주고 싶을 경우 이용하자.

 

Select a text file:

[tip] jquery input text에 숫자나 알파벳만 입력 받기

jquery 를 이용해서 html input tag에 숫자와 알파벳만 입력받도록 만든다.

웹 개발을 하다보면 인풋태그에 원하는 값만을 입력 받고 싶을 때가 있다.

현재 게임 운영툴을 개발하면서 숫자만 입력 받고 싶은 경우가 생겼다.

라이브러리를 찾아보았으나 한글이 입력되거나 특수문자가 입력되는 경우가 발생했다.

그래서 기존 라이브러리에 코드를 추가해서 한글이나 특수문자를 막고 숫자만 입력받는 로직을 만들었다.

필요하신분은 참고 하시길.

참고로 숫자입력만 허용하는 로직만 테스트된 상태며, 테스트는 구글 크롬에서만 하였다. (현재 운영툴이 크롬을 대상으로 개발하고 있기 때문)
익스플로러에서는 안됐던 듯 싶다.

사용법은 아래 링크타고 가서 원래 라이브러리파일을 다운 받으면 index.html에 상세히 있다.

https://github.com/johnantoni/jquery.alphanumeric

수정한 코드.

(function($){

	$.fn.alphanumeric = function(p) { 

		p = $.extend({
			ichars: "!@#$%^&*()+=[]\\\';,/{}|\":<>?~`.-_ ",
			nchars: "",
			allow: ""
		  }, p);	

		return this.each
			(
				function() 
				{

					if (p.nocaps) p.nchars += "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
					if (p.allcaps) p.nchars += "abcdefghijklmnopqrstuvwxyz";

					s = p.allow.split('');
					for ( i=0;i<s.length;i++) if (p.ichars.indexOf(s[i]) != -1) s[i] = "\\" + s[i];
					p.allow = s.join('|');

					var reg = new RegExp(p.allow,'gi');
					var ch = p.ichars + p.nchars;
					ch = ch.replace(reg,'');

					$(this).keydown
						(
							function (e)
								{

									if (!e.charCode) k = String.fromCharCode(e.which);
										else k = String.fromCharCode(e.charCode);
									// Korean filtering,  modified by ktg. 
									// if (k.charCodeAt(0) == 229) e.preventDefault();
									// exception not ascii code, and shift + number keys
									if (33 <= e.which && e.which <= 40) return;
									// 컨트롤 c,v,x,a는 허용
									if (e.ctrlKey && (k.match(/(c|v|x|a)/i) != null)) return;
									// 아스키코드 이외의 글자는 막기
									if (k.charCodeAt(0) > 127) e.preventDefault();
									// 특수문자 막기
									if (e.shiftKey&&k.match(/\d+/g)!=null) e.preventDefault();

									if (ch.indexOf(k) != -1) e.preventDefault();
									if (e.ctrlKey&&k=='v') e.preventDefault();

								}

						);

					$(this).bind('contextmenu',function () {return false});

				}
			);

	};

	$.fn.numeric = function(p) {

		var az = "abcdefghijklmnopqrstuvwxyz";
		az += az.toUpperCase();

		p = $.extend({
			nchars: az
		  }, p);	

		return this.each (function()
			{
				$(this).alphanumeric(p);
				// 복사 붙여넣기 방지 로직
				$(this).keyup
					(
						function (e)
							{
								var newVal = $(this).val().replace(/[^0-9\s]/gi,"");
								if (newVal != $(this).val()) {
									$(this).val( $(this).val().replace(/[^0-9\s]/gi,"") );
								}
							}
					);
			}
		);

	};

	$.fn.alpha = function(p) {

		var nm = "1234567890";

		p = $.extend({
			nchars: nm
		  }, p);	

		return this.each (function()
			{
				$(this).alphanumeric(p);
			}
		);

	};	

})(jQuery);