마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

한글깨짐문제) 안녕하세요 -> HUX8�. 이렇게 나타납니다.

0 추천

안드로이드 NDK를 이용하여 MFC제작된 프로그램으로부터 한글을 수신받는 프로그램을 제작 중입니다.

MFC 프로그램은 제가 작성한 프로그램이 아니고 현재 소스도 가지고 있지 않아요. 

있는 거라고는  유니코드라는 정보밖에 알 수가 없는 상황이고요;;

전송할 문자열 정보 :Unicode (Wide Char) String

 

계속 수신받은 문자들을 char배열에 넣어서 cpp에서 로그켓불러 출력해보니  다음과 같이 나타납니다..

원본 메시지 : 안녕하세요. 무엇을 도와드릴까요?

받은 메시지 : HUX8�. 4�D �@ܴL�? 

 

막무가내로 NDK cpp코드에서 받은 문자배열을 env->NewStringUTF(받은 문자들); 로 바꿔서

자바로 전달 후 다음과 같은 내용의 자바코드 내 함수를 호출하여 인코딩 변경을 시도 했지만 

	public static void printRecvMSG(String msg) {
		AppLog.logString("---------CALL JNI--------------------------");
		AppLog.logString("MSG : "+msg);
		String word = msg;
		try {
			AppLog.logString("utf-8 -> euc-kr        : " + new String(word.getBytes("utf-8"), "euc-kr"));
			AppLog.logString("utf-8 -> ksc5601       : " + new String(word.getBytes("utf-8"), "ksc5601"));
			AppLog.logString("utf-8 -> x-windows-949 : " + new String(word.getBytes("utf-8"), "x-windows-949"));
			AppLog.logString("utf-8 -> iso-8859-1    : " + new String(word.getBytes("utf-8"), "iso-8859-1"));			
			AppLog.logString("iso-8859-1 -> euc-kr        : " + new String(word.getBytes("iso-8859-1"), "euc-kr"));
			AppLog.logString("iso-8859-1 -> ksc5601       : " + new String(word.getBytes("iso-8859-1"), "ksc5601"));
			AppLog.logString("iso-8859-1 -> x-windows-949 : " + new String(word.getBytes("iso-8859-1"), "x-windows-949"));
			AppLog.logString("iso-8859-1 -> utf-8         : " + new String(word.getBytes("iso-8859-1"), "utf-8"));
			AppLog.logString("euc-kr -> utf-8         : " + new String(word.getBytes("euc-kr"), "utf-8"));
			AppLog.logString("euc-kr -> ksc5601       : " + new String(word.getBytes("euc-kr"), "ksc5601"));
			AppLog.logString("euc-kr -> x-windows-949 : " + new String(word.getBytes("euc-kr"), "x-windows-949"));
			AppLog.logString("euc-kr -> iso-8859-1    : " + new String(word.getBytes("euc-kr"), "iso-8859-1"));
			AppLog.logString("ksc5601 -> euc-kr        : " + new String(word.getBytes("ksc5601"), "euc-kr"));
			AppLog.logString("ksc5601 -> utf-8         : " + new String(word.getBytes("ksc5601"), "utf-8"));
			AppLog.logString("ksc5601 -> x-windows-949 : " + new String(word.getBytes("ksc5601"), "x-windows-949"));
			AppLog.logString("ksc5601 -> iso-8859-1    : " + new String(word.getBytes("ksc5601"), "iso-8859-1"));
			AppLog.logString("x-windows-949 -> euc-kr     : " + new String(word.getBytes("x-windows-949"), "euc-kr"));
			AppLog.logString("x-windows-949 -> utf-8      : " + new String(word.getBytes("x-windows-949"), "utf-8"));
			AppLog.logString("x-windows-949 -> ksc5601    : " + new String(word.getBytes("x-windows-949"), "ksc5601"));
			AppLog.logString("x-windows-949 -> iso-8859-1 : " + new String(word.getBytes("x-windows-949"), "iso-8859-1"));
			
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
			AppLog.logString("--ERROR-----------------------------------------");
		}		
		AppLog.logString("-------------------------------------------");		
	}

 

로그 결과는 요렇게 나오고 한글로 전혀 돌아가지 않고 4주 째 혼나고 있습니다.

cpp코드나 java 코드 어디서든 다시 한글로 돌릴 수 있는 방법이 없을까요? 

어떤 언어 인코딩 차이여야 저렇게 깨지는지라도 누가 좀 알려주세요ㅠㅠ

부탁드립니다.

 
익명사용자 님이 2014년 6월 10일 질문

3개의 답변

+1 추천
거 로그캣 글꼴이 아마 한글 지원안하는거 아닌가요?

 

http://ramses8.tistory.com/575
건방진프로그래머 (26,630 포인트) 님이 2014년 6월 10일 답변
링크대로 바꾸어 보았는데도 똑같이 깨져서 나옵니다.
ndk에서 문자를 받는 순간부터 깨져있는 것 같아요
0 추천
한글이 인코딩이 깨지면 알수없는 한글문자나 특수문자 등이 출력되지 않나요?

수신을 받을때 어떤 변환을 하는지 확인해보시고, 수신받을때의 메세지가 문제없다면 송신시의 문제가 아닐까 싶습니다.

한글로 이루어진 문자를 인코딩 문제가 발생하였는데 영어가 나온다는게 좀 걸리네요.

단순히 네이버 홈페이지를 인코딩을 바꿔봐도 한글로 이루어진 부분은 특수문자+한글로 보일 겁니다..
인연 (31,880 포인트) 님이 2014년 6월 11일 답변
C++ 프로젝트에서 <안녕하세요. 무엇을 도와드릴까요?> 를 WideCharToMultiByte 함수 이용해서 변형 시켰을 때 <H휱켡?햻?> 라고
 나타나더라고요...
저도 이상한 한글문자나 특수문자가 주로 출력되는 것으로 알고 있습니다만 구글에 hux8이라고 한국어웹으로 검색한 결과 저와 동일하게 깨지는 경우가 종종 있더라구요 ;

현재 수신은 recv(sockfd, ptr, MAX_PacketSize, 0);
형식으로 독특한 점이 딱히 없습니다.
recv 함수로 프로토콜을 포함한 대량의 Byte로 수신받아 일일히 쪼개서 전송한 텍스트 문자부분만 추출하고 있고요 .
먼저 간단히 C++ 프로젝트에서 작성해봤었는데 그때는
<안녕하세요. 무엇을 도와드릴까요?> 가
<?????. ??? ???????>이런 형식으로 깨졌었는데
_wsetlocale(LC_ALL, L"korean"); 이렇게 설정해 주니까
제대로 변형되어  cmd창에 출력되었습니다.
하지만 현재 ndk에서 _wsetlocale을 지원하지 않고
깨지는 형식도 달라서 위와 같이 자바로 불러서 다 변형해보고 있지만
원래 텍스트로 돌아가지 않네요 ㅠㅠ
NDK에서 지원을 하지 않는다고 하더라도... 일단 C에서 되니 작성하여 돌리면 되긴하겠는데.. 문제는 그 방법이 맞아야 할텐데 말이에요..
아무튼 송신하는 쪽에서 이러쿵 저러쿵 바꾸는게 있긴있나보네요. 메뉴얼에도 표기되어있지 않던가요?
0 추천
widechartomultibyte 시도해보세요 혹시 모르니깐요
안티푸라면 (6,700 포인트) 님이 2014년 6월 11일 답변
사용하려했으나 WideCharToMultiByte는 윈도우 함수라  ndk 환경 내에서는 사용이 불가능하다고 하네요ㅠㅠ
그래서 윈도우에서 간단한 c++ 프로젝트로 돌려봤는데
안녕하세요. 무엇을 도와드릴까요?         가
H휱켡?햻?                                                   이렇게 나타납니다.
H까지는 똑같은데 이 인코딩형식 문제인지 모르겠네요..ㅠㅠ
...