[java] 유니코드 자음 모음으로 분리 했다 다시 붙이기  

초성검색 기능이 급 필요해져서 급하게 여기 저기 정보를 보며 붙이다보니 엄청난 개판 소스가 등장 -_-;
 
그나마 조금 정리해서 올려봤다
 
주석으로 된걸 지우면 그나마 조금더 자세하게 살펴볼수 있다.
 
유니코드는 아래 주소와 표에있는 파일을 확인하면 더 자세히 살펴볼수있다
 
http://www.unicode.org/
 
Hangul Jamo 한글 자모 영역   0x1100-0x11F9  U1100.pdf
 Hangul Compatibility Jamo 한글 호환 자모 영역  0x3130-0x318E  U3130.pdf
 Hangul Syllables 한글 영역  0xAC00-0xD7A3  UAC00.pdf
 Halfwidth Jamo 반각 자모  0xFF00-0xFFEF  UAC00.pdf
 
 
 
 
 
 
 
중요한건 이 표인데 
호환되지 않는 한글 자모영역을 기준으로 나열한다면
ㄱ = 0x1100
ㄲ = 0x1101
ㄴ = 0x1102
.......
ㅎ = 0x1112 이런순으로 간다 (18이 아니라 12인 이유는 16진수를 사용하기때문이다)
 
이런식으로 초성 18개 중성 20개 종성 27개로 나누어져있다
 
자음과 모음이 다 모여서 완전한 한개의 글씨의 시작위치는 0xAC00부터 시작되며 그 끝은 0xD79F이다
 
조금더 나아가 이해하면 저 코드로 모든 글자를 표현할수있다.
 
 
 
아래 코드는 완성형 한글을 초,중,종성으로 나누었다가 다시 완성형한글로 붙여본 코드이다
 
하도 급하게 짜다보니 주석 설명도 못붙인채 올렸다 [......]
 
간단한 구조를 적자면
 
메소드 구조로 되어있지않고 따로 입력받는 부분조차 없어서 직접 분해했다가 붙일 글자를 입력해야한다
 
그러면 길이만큼 

 

 
초성 = (((글자 - 0xAC00) - (글자 - 0xAC00) % 28 ) ) / 28 ) / 21
중성 = (((글자 - 0xAC00) - (글자 - 0xAC00) % 28 ) ) / 28 ) % 21
종성 =  (글자 - 0xAC00) % 28
의 식을 거치면 초성 중성 종성을 파악할수있다
 
다시 그 후 붙여주면 끝
 
붙일때는 0xAC00 + 28 * 21 * (초성의 index) + 28 * (중성 index) + (종성 index)
의 공식으로 하면된다.
 
! 인덱스값을 넣을때 16진수로 넣지 않게 주의하자
 

 

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
 
public class Testjvm {
private static final char[] CHO = 
/*ㄱ ㄲ ㄴ ㄷ ㄸ ㄹ ㅁ ㅂ ㅃ ㅅ ㅆ ㅇ ㅈ ㅉ ㅊ ㅋ ㅌ ㅍ ㅎ */
{0x3131, 0x3132, 0x3134, 0x3137, 0x3138, 0x3139, 0x3141, 0x3142, 0x3143, 0x3145,
0x3146, 0x3147, 0x3148, 0x3149, 0x314a, 0x314b, 0x314c, 0x314d, 0x314e};
private static final char[] JUN = 
/*ㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣ*/
{0x314f, 0x3150, 0x3151, 0x3152, 0x3153, 0x3154, 0x3155, 0x3156, 0x3157, 0x3158,
0x3159, 0x315a, 0x315b, 0x315c, 0x315d, 0x315e, 0x315f, 0x3160, 0x3161, 0x3162,
0x3163};
/*X ㄱㄲㄳㄴㄵㄶㄷㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅄㅅㅆㅇㅈㅊㅋㅌㅍㅎ*/
private static final char[] JON = 
{0x0000, 0x3131, 0x3132, 0x3133, 0x3134, 0x3135, 0x3136, 0x3137, 0x3139, 0x313a,
0x313b, 0x313c, 0x313d, 0x313e, 0x313f, 0x3140, 0x3141, 0x3142, 0x3144, 0x3145,
0x3146, 0x3147, 0x3148, 0x314a, 0x314b, 0x314c, 0x314d, 0x314e};
 
 
public static void main( String [] arg )throws Exception {
 
List<Map<String, Integer>> list = new ArrayList<Map<String, Integer>>();
String tempStr = "안녕하세요";
String lastStr = "";
System.out.println(tempStr);
for(int i = 0 ; i < tempStr.length();i++)
{
Map<String, Integer> map = new HashMap<String, Integer>();
char test = tempStr.charAt(i);
 
if(test >= 0xAC00)
{
char uniVal = (char) (test - 0xAC00);
 
char cho = (char) (((uniVal - (uniVal % 28))/28)/21);
char jun = (char) (((uniVal - (uniVal % 28))/28)%21);
char jon = (char) (uniVal %28);
 
 
System.out.println(""+test+"// 0x" + Integer.toHexString((char) test));
 
System.out.println(""+ CHO[cho]+"// 0x" + Integer.toHexString((char) cho) );
System.out.println(""+ JUN[jun]+"// 0x" + Integer.toHexString((char) jun) );
if((char)jon != 0x0000)
System.out.println(""+ JON[jon]+"// 0x" + Integer.toHexString((char) jon) );
 
 
map.put("cho", (int) cho);
map.put("jun", (int) jun);
map.put("jon", (int) jon);
list.add(map);
}
}
 
for(int i = 0; i < list.size() ; i++)
{
int a = (int)(list.get(i)).get("cho");
int b = (int)(list.get(i)).get("jun");
int c = (int)(list.get(i)).get("jon");
 
char temp = (char)(0xAC00 + 28 * 21 *(a) + 28 * (b) + (c) );
 
lastStr = lastStr.concat(String.valueOf(temp));
//System.out.println(""+ (char)(0xAC00 + 28 * 21 *(a) + 28 * (b) + (c) ));
 
}
 
System.out.println(""+ lastStr);
/*System.out.println(""+ (((Map)(list.get(0))).get("cho"))  );
System.out.println(""+ ((Map)(list.get(0))).get("jun") );
System.out.println(""+ ((Map)(list.get(0))).get("jon") );*/
 
 
 
 
}
}
 
결과 화면 (완성형글자의 우측에는 유니코드 자모음 글자의 우측은 초중종성의 index넘버 이다)
 



출처: https://hanpsy.tistory.com/2 [한싸이]

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
27 [java][maven] jar 파일 의존성 한번에 다운로드 maven 사용 졸리운_곰 2023.08.24 192
26 Prometheus + Grafana로 Java 애플리케이션 모니터링하기 file 졸리운_곰 2020.12.17 279
25 Blockchain Implementation With Java Code file 졸리운_곰 2019.06.16 338
24 Java 코드로 이해하는 블록체인(Blockchain) 졸리운_곰 2019.06.16 377
23 순수 Java Application 코드로 Restful api 호출 졸리운_곰 2018.10.10 415
22 WebDAV 구현을 위한 환경 설정 file 졸리운_곰 2017.09.24 268
21 [Java] Apache Commons HttpClient로 SSL 통신하기 졸리운_곰 2017.03.27 784
20 JSoup를 이용한 HTML 파싱 졸리운_곰 2017.03.04 320
19 jsoup을 활용해서 Java에서 HTML 파싱하는 방법 정리 file 졸리운_곰 2017.03.04 579
18 NSA의 Dataflow 엔진 Apache NiFi 소개와 설치 file 졸리운_곰 2017.01.23 630
17 wordpress-java-integration 자바와 워드프레스 통합 졸리운_곰 2016.12.30 298
16 Create New Posts in Wordpress using Java and XMLRpc 졸리운_곰 2016.11.14 268
15 자바로 POST 방식으로 통신하기, java httppost 클래스를 활용한 예제 졸리운_곰 2016.11.14 647
14 [Java]아파치 HttpClient사용하기 file 졸리운_곰 2016.11.14 301
13 Building a Search Engine With Nutch Solr And Hadoop file 졸리운_곰 2016.04.21 435
12 Nutch and Hadoop Tutorial file 졸리운_곰 2016.04.21 391
11 Latest step by Step Installation guide for dummies: Nutch 0. file 졸리운_곰 2016.04.21 305
10 Nutch 초간단 빌드와 실행 졸리운_곰 2016.04.21 681
9 Nutch로 알아보는 Crawling 구조 - Joinc 졸리운_곰 2016.04.21 536
8 A tiny bittorrent library Java: 자바로 만든 작은 bittorrent 라이브러리 file 졸리운_곰 2016.04.20 418
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED