2016년 1월 22일 금요일

임의의 중국어 문장 만들기

회사에서 만드는 시스템에 중국어 버전을 준비하는 중이다. 영어를 중국어로 번역하는 작업은 외부에 맡겨놓은 상태인데, 번역이 완료되서 올 때까지 테스트를 기다릴 수 없다. 다국어처리가 안된 영어 문장이 시스템에 남아있는 것을 찾아야 하고, 로케일 설정이 변경되었을 때 서버와 브라우저에서 변경되는 부분도 미리 테스트해야 하기 때문이다. 그래서 적당한 길이의 중국어 문장을 만들어서 테스트하기로 했다.

1.
일단 how to generate random chinese로 구글링하면 온라인으로 중국어를 만드는 것들만 나온다. 중국이름이나 중국어용 로렌 입섬같은 것들... 그래서 검색어 끝에 java를 붙이면 3번째 결과에 java code가 나온다.

2.
소스코드를 보면, 중국어는 유니코드 4E00-9FA5 영역을 사용한다. 중국어로 배정된 구간은 9FFF까지이지만, 뒷부분은 아직 실제 글자가 지정되지 않아서 9FA5까지만 영역으로 잡은 듯 하다. 실제로는 더 다양한 영역에 중국어가 존재하지만, 대부분의 글자가 이 영역에 있다고 한다. 그 사이의 랜덤값을 만들어서 중국어 글자를 만들어 내고 있다. 복사해서 적용하니 한글자씩만 만들길래 반복문을 붙여서 원하는 것은 얻어냈다.

3.
소스코드가 좀 불필요한 부분이 있는 듯 하여 리팩토링을 진행했다.
private static int chineseStart = Integer.parseInt(String.valueOf(0x4e00));
private static int chineseEnd = Integer.parseInt(String.valueOf(0x9FA5));
private static String randomChinese(){
Random random = new Random();
int position = random.nextInt(chineseEnd-chineseStart)+chineseStart;
System.out.println(position+"--"+chineseEnd);
String code = Integer.toHexString(position);
return decode("\\u"+code);
}
일단 sysout을 지우고, 상수는 대문자밑줄로 변경, String으로 바꿨다가 다시 int로 바꾸는 것도 제거, 함수명도 get스럽게 변경, 불필요한 decode함수호출을 제거하고 바로 char캐스팅을 넣고, 지역변수제거하면 이렇게 된다.
private static int CHINESE_START = 0x4e00;
private static int CHINESE_END = 0x9FA5;
private static char getRandomeChineseCharacter(){
return (char)(new Random().nextInt(CHINESE_END - CHINESE_START) + CHINESE_START);
}

3.
반복문을 돌면서 중국어문장을 얻어내는 함수는 이렇게 된다.
private static String getRandomChineseSentence(int length) {
StringBuilder ret = new StringBuilder();
for (int i = 0; i < length; i++) {
ret.append(getRandomeChineseCharacter());
}
return ret.toString();
}

4.
미리 등록해서 사용하던 영어문장과 비슷한 길이의 중국어문장을 만들어내기 위해 영어문장길이에 3을 더하고 다시 3으로 나눈 길이만큼의 중국어를 생성했다.
String randomChinese = getRandomChineseSentence((text.length() + 3) / 3);

5.
문장에 매개변수를 넣기위해 {0}, {1}, {2}스럽게 넣었던 것들은 일괄로 앞에 붙여주었다.
if( text.contains("{3}") ) {
randomChinese = "{3} " + randomChinese;
}
if( text.contains("{2}") ) {
randomChinese = "{2} " + randomChinese;
}
if( text.contains("{1}") ) {
randomChinese = "{1} " + randomChinese;
}
if( text.contains("{0}") ) {
randomChinese = "{0} " + randomChinese;
}

6.
영어문장있는 DB에서 읽어서 랜덤중국어문장을 만들어, 로케일만 다르게 해서 DB에 넣었다.


댓글 없음:

댓글 쓰기