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

UTF-8과 EUC-KR 인코딩 문제

0 추천
안녕하세요.

 

인코딩 문제로 질문을 드립니다.

 

안드로이드에서 EditText를 통해서 입력 받은 데이터를 서버로 전송해야 합니다.

 

문제는 안드로이드에서 입력된 한글 데이터 중 샾, 힣, 뷁 같은 UTF-8 로는 표현되지만

 

EUC-KR로는 표현 안되는 값이 포함되면 서버에서 에러가 발생합니다.

 

서버에서 처리해 주면 좋을 텐데 서버 개발자가 힘들다고 단말에서 해당 문자를 제거해주길 원합니다.

 

그래서 java 에서 아래와 같이 테스트 해보니될 것 같았습니다.

String word = "샵, 샾, 뷁, 힝, 힣";
        try {
            
            String euckr = new String(word.getBytes("euc-kr"), "euc-kr");
            String utf = new String(word.getBytes("utf-8"), "utf-8");

            System.out.println("origin : " + word);
            System.out.println("euc-kr : " + euckr);
            System.out.println("utf : " + utf);
            
            CharsetEncoder en =  Charset.forName("euc-kr").newEncoder();
            for(int i=0; i<word.length(); i++) {
                char ch = word.charAt(i);
                boolean can = en.canEncode(ch);
                System.out.println(ch + " is can encode.  ( "+can+" )");
            }
        }
        catch(Exception e) {e.printStackTrace();}

 

결과 값이 아래처럼 나왔습니다.

origin : 샵, 샾, 뷁, 힝, 힣
euc-kr : 샵, ?, ?, 힝, ?
utf : 샵, 샾, 뷁, 힝, 힣

샵 is can encode.  ( true )
샾 is can encode.  ( false )
뷁 is can encode.  ( false )
힝 is can encode.  ( true )
힣 is can encode.  ( false )

그래서 이 코드를 바탕으로 안드로이드에 적용해 보았으나

 

안드로이드에서는 먹히지가 않습니다.

 

어떻게 해야 안드로이드에서 EUC-KR에 없는 문자를 제거할 수 있을까요?
원조안드로이드 (58,190 포인트) 님이 2014년 6월 30일 질문
하.. 서버 개발자 노답.. OTL
서버를 UTF-8 로 개발해주세요. 누가 요즘 EUC-KR 로 개발한답니까?
답이 안보이네요; 이건 서버쪽 수정이 맞을듯...

1개의 답변

+1 추천
String word = "샵, 샾, 뷁, 힝, 힣";
        try {
            
            String euckr = new String(word.getBytes("euc-kr"), "euc-kr");
            String utf = new String(word.getBytes("utf-8"), "utf-8");
            String covnert = new String(utf.getBytes(), "euc-kr");
            System.out.println("origin : " + word);
            System.out.println("euc-kr : " + euckr);
            System.out.println("utf : " + utf);
            System.out.println("covnert : "+covnert);
            CharsetEncoder en =  Charset.forName("euc-kr").newEncoder();
            for(int i=0; i<covnert.length(); i++) {
                char ch = covnert.charAt(i);
                boolean can = en.canEncode(ch);
                System.out.println(ch + " is can encode.  ( "+can+" )"+" // unicode : "+unicodeEscaped(covnert.charAt(i)));
            }
        }
        catch(Exception e) {e.printStackTrace();}
 
public static String unicodeEscaped(char ch) {
     if (ch < 0x10) {
         return "\\u000" + Integer.toHexString(ch);
     } else if (ch < 0x100) {
         return "\\u00" + Integer.toHexString(ch);
     } else if (ch < 0x1000) {
         return "\\u0" + Integer.toHexString(ch);
     }
     return "\\u" + Integer.toHexString(ch);
 }
 
public static String unicodeEscaped(Character ch) {
     if (ch == null) {
         return null;
     }
     return unicodeEscaped(ch.charValue());
 }

일단 컨버팅을 한번더 해주고 유니코드로 비교까지 해봤는데 어찌 좀 도움이 되실런지..

갈무리 (12,430 포인트) 님이 2014년 6월 30일 답변
답변감사합니다.

결국 캐릭터 셋을 다른거로 변경하여 해결 봤습니다.

String regex = "[^- a-zA-Z0-9ㄱ-ㅎ가-힣ㅏ-ㅣ]";
String name = mNameEditText.getText().toString();
String clearUserName = "";
try {
    String userName = new String(name.getBytes("ISO-2022-KR"), "ISO-2022-KR");
    clearUserName = new String(userName.getBytes("utf-8"), "utf-8");
    clearUserName = clearUserName.replaceAll(regex, "");
}

의문점은 왜 안드로이드 euc-kr 캐릭터셋이 제대로 동작하지 않나 입니다.
...