문자셋(Character Set)

X-PUSH 서버는 다음과 같은 기본 원칙으로 전달된 문자열을 처리합니다.

메시지 공급자가 전달한 bit 스트림을 그대로 넥사크로 클라이언트에 전달

X-PUSH 서버는 메시지 공급자가 특정 문자셋으로 인코딩하여 전달한 내용을 그대로 넥사크로 클라이언트에 전달하기 때문에, 서버 자체로는 특별한 문자셋 설정이 필요 없습니다. 대신 문자열을 인코딩하고 디코딩하는 메시지 공급자와 넥사크로 어댑터는 반드시 같은 문자셋으로 설정해야 합니다.

X-PUSH 배포 시에 제공되는 메시지 공급자 API와 넥사크로 클라이언트의 어댑터 기본 설정값은 "utf-8"이며, 보통의 경우 따로 설정하거나 신경 쓰지 않아도 됩니다. 만약 메시지 공급자 API를 사용하지 않거나 기타 언어로 메시지 공급자를 개발할 경우 X-PUSH 서버에 전달할 문자열을 "utf-8"을 사용하여 인코딩하여야 합니다.

"utf-8"이 아닌 다른 문자셋을 사용하여 메시지를 공급한다면 넥사크로 클라이언트의 어댑터에서도 같은 문자셋을 설정하여야 합니다.

그리고 Message Formatter를 사용할 경우 Message Formatter가 전달받는 byte[]는 메시지 공급자가 전달한 것 그대로이며, 이를 String객체로 변환할 경우 역시 같은 문자셋을 사용하여야 합니다.

정리하면 다음 3곳에서 문자셋을 설정하거나 고려하여야 합니다.

Message Provider에서의 문자셋

PushMessage 인스턴스를 생성한 후에 setCharsetName() 메소드를 사용하여 문자셋을 설정합니다. 설정하지 않을 경우 기본값 "utf-8"이 사용됩니다.

pushMessageProvider.connect(host, port, id, password);

PushMessage pushMessage = new PushMessage();

// set character set. default is "utf-8"
pushMessage.setCharsetName("utf-8");

// set message type.
pushMessage.setTopicType("OPDT");

// set mesage id.
pushMessage.setTopicId("ALL");

// add data as defined in layout
pushMessage.addData("ALL");
SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss");
String currentTime = "CURRENT TIME : "+formatter.format(new Date());

// send message
pushMessageProvider.sendPushMessage(pushMessage);

// close connection
pushMessageProvider.close();

Embedded Message Provider의 경우에도 PushMessage 클래스를 사용하여 문자셋을 설정할 수 있습니다.

넥사크로 클라이언트에서의 문자셋

넥사크로플랫폼에서 기본 문자셋이 UTF-8로 지정되어 있습니다. 지정된 값은 각 프로젝트 생성 시 아래 파일에서 확인할 수 있습니다.

[project folder]\globalvars.xml

Message Formatter에서의 문자셋

X-PUSH 서버에 전달된 bit 스트림은 byte[]의 형태로 List에 담겨 Message Formatter에 전달됩니다.

다음 예제와 같이 new String(byte[] bytes, String charsetName) 메소드를 사용하여 bit 스트림을 디코딩하고, 포맷된 문자열을 String.getBytes(String charsetName) 메소드를 사용하여 인코딩합니다. 물론 이때 사용되는 문자셋은 메시지 공급자와 넥사크로 클라이언트에서 사용된 문자셋과 같아야 합니다.

public List<byte[]> format(UserProfile userProfile, final String topicType,
final String topicId, List<byte[]> valueBytesList) {

	List<byte[]> formattedValueBytesList = new ArrayList<byte[]>();

	for(int i=0; i<valueBytesList.size(); i++) {
		byte[] valueBytes = valueBytesList.get(i);
		byte[] formattedValueBytes = new byte[0];
		try {
			String value = new String(valueBytes, "utf-8");
			String formattedValue
				= value.replace("current time", (new Date()).toString());
			formattedValueBytes = formattedValue.getBytes("utf-8");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		formattedValueBytesList.add(formattedValueBytes);
	}
	return formattedValueBytesList;
}