2012-02-10 6 views
4

공유 환경 설정 메뉴에 UTF8이 사용되도록하려면 어떻게해야합니까? 나는 사용자가 다른 것들 사이에서 그들의 이름을 설정할 수있는 안드로이드 환경 설정 메뉴가 있습니다.android, UTF8 - 공유 환경 설정에 UTF8이 사용되도록하려면 어떻게해야합니까?

내가 선호 메뉴가 파일에 고해상도/XML 폴더라는 설정을 UTF8 인코딩을 사용하여 XML에 배치하고이처럼 보이는

UTF8 형식으로 공유 환경 설정에 저장된 데이터를 변환하는 방법을 알고 있어야합니다 :

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen 
    xmlns:android="http://schemas.android.com/apk/res/android"> 
    <EditTextPreference 
     android:key="@string/name_key" 
     android:title="@string/hof_name_title" 
     android:summary="@string/hof_name_summary" 
     android:defaultValue="Anonymous" /> 
    <CheckBoxPreference 
     android:key="@string/new_game_preference_key" 
     android:title="@string/new_game_preference_title" 
     android:summary="@string/new_game_preference_summary" 
     android:defaultValue="false" /> 
</PreferenceScreen> 

public class PrefsActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener{ 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
       WindowManager.LayoutParams.FLAG_FULLSCREEN); 
     super.onCreate(savedInstanceState); 
     addPreferencesFromResource(R.xml.settings); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     // Unregister the listener whenever a key changes 
     getPreferenceScreen().getSharedPreferences() 
       .unregisterOnSharedPreferenceChangeListener(this); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     // Set up a listener whenever a key changes 
     getPreferenceScreen().getSharedPreferences() 
       .registerOnSharedPreferenceChangeListener(this); 
    } 

    @Override 
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, 
      String key) { 
//  Util.log_debug_message("@@@@ Changed prefrence key = " + key); 
     if (key.equalsIgnoreCase(getString(R.string.name_key))){ 
      update_webserver(); 
     }else if (key.equalsIgnoreCase(getString(R.string.new_game_preference_key))){ 
      update_webserver(); 
     } 
    } 

    protected void update_webserver(){ 
     Intent webServerReg = new Intent(this, RegService.class); 
     webServerReg.putExtra(Config.C2DM_REG_ID_EXTRA, C2DMessaging.getRegistrationId(this)); 
     startService(webServerReg);  
    } 
} 

난 그 텍스트를 보장 할 <?xml version="1.0" encoding="utf-8"?>을 설정하면 fo를 UTF8로 인코딩 될 것으로 가정 처리하는 클래스 rmat하지만 이것이 항상 그런 것은 아닙니다. 나는 모든 종류의 형식으로 가치를 얻고있다. 몇 가지 예

"\ NFE \ xF1a", "L \ xFAcia", "$ '\ xE5이 xEE \'",

또는

"- $ B- O : -) : - P = -OB -) : - D : -Q : -X : - : - | \ n : '(: - XDo_O : -X : -C : -X : O : - X : -O : -) : -) : -) - :) : - D : OX- (o_O : -V : - @ : -V : -X : -Do_O :: -C \ xBF \ xA1 \ xA1 \ xA2 \ xA5 \ xA1 \ xAE \ xA7> < [\ xA3 ~? = ~ \xB0]\xA3?\xA7\xA1\\\xAB\xBB\xAE^``]]||||}{_|] | || \ xB0 \ xB0? "

예. 마지막 예에서 하나의 루비 (rubish) 집합입니다.

문제는 내가 유효한 기대

public void update(String regId) throws AuthenticationException { 
    JSONObject mu_to_send = createJsonToPost(regId, false); 
    HttpResponse response; 
    try { 
     response = HttpRequest.httpPutJSONObject(this, 
       Config.UPDATE_USER_URL, mu_to_send); 
     int responseCode = response.getStatusLine().getStatusCode(); 
     String responseJson; 
     try { 
      responseJson = EntityUtils.toString(response.getEntity()); 
      String msg = ""; 

      if (responseCode == 201) { 
       // mobile_user = new 
       // JSONObject(responseJson).getJSONObject("mobile_user"); 
       // Broadcast.sendBroadcast(this, 
       // ResponseReceiver.ACTION_RESP, 
       // Intent.CATEGORY_DEFAULT, Config.C2DM_MESSAGE_EXTRA, 
       // Config.BROADCAST_WEBSERVER_USER_CREATED); 
      } else { 
       msg = "Failed to register with server! HTTP response code = " 
         + responseCode; 
      } 
     } catch (ParseException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } catch (ClientProtocolException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } catch (IOException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 

} 

public JSONObject createJsonToPost(String regId, boolean set_password) { 
    JSONObject holder = new JSONObject(); 
    JSONObject data = new JSONObject(); 
    try { 
     data.put("auth", regId); 
     data.put("name", C2DMessaging.getName(this)); 
     data.put("receive_new_game_notification", 
       C2DMessaging.getGameStartedNotificationPreference(this)); 
     holder.put("mobile_user", data); 
    } catch (JSONException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    return holder; 
} 

public static HttpResponse httpPutJSONObject(Context context, String url, 
     JSONObject data) throws ClientProtocolException, IOException, 
     AuthenticationException { 
    DefaultHttpClient httpclient = getHttpClient(context); 
    HttpPut httpput = new HttpPut(url); 
    httpput.addHeader("User-Agent", Config.USER_AGENT); 
    httpput.addHeader("Accept", "application/json"); 
    httpput.addHeader("Content-type", "application/json"); 
    httpput.addHeader(new BasicScheme().authenticate(
      getCredentials(context), httpput)); 
    StringEntity se = new StringEntity(data.toString()); 

    httpput.setEntity(se); 
    return httpclient.execute(httpput); 
} 

이 내 웹 서버에 문제가 모든 종류의 원인이 다음 코드를 사용하여 내 웹 서버에 json으로 HTTP의 POST와 같은 신물질 또는 PUT 요청을 보내려고 할 때 시작했다 JSON (즉, UTF8) JSON은 UTF8로 인코딩 된 상태로 보내야합니다.

그래서

1) 당사 <?xml version="1.0" encoding="utf-8"?> 실제로 설정하지 않습니다 UTF8 인코딩? 레이아웃에서 사용될 때?

2) 유효한 UTF8 형식의 문자를 웹 서버에 보내려면 어떻게해야합니까? 이 작업은 put 요청이나 공유 환경 설정에 저장되는 코드 또는 json 개체를 채우는 코드 또는 아마도 위의 의 조합으로 처리해야합니까? 또는 다른 것?

이것은이 RoR에 질문 Rails 3 - How to handle PG Error incomplete multibyte character

+3

을 참고하시기 바랍니다 - 나는 믿는다 설정이 " "는 레이아웃 파일 내용이 utf-8로 인코딩되었음을 모든 xml 파서에 지시하는 것입니다. 즉, 그것은 전적으로 XML 레이아웃 파일 자체의 속성이며 레이아웃을 사용할 때 안드로이드의 동작에 어떤 영향을 미치지 않는다고 생각합니다. –

답변

2

의 핵심은 UTF-8Unicode의 차이를 이해하는 것입니다에서에 따라입니다.

  • Java는 유니 코드를 사용하여 메모리의 문자 및 문자열을 처리합니다. 각 문자는 2 바이트로 저장됩니다.
  • 텍스트가 프로세스 (예 : 웹 서버) 또는 사이에서 전송 될 때 디스크에 쓰거나 디스크에서 읽으면 내부 표현이 over-the-wire 형식으로 변환됩니다. 이것은 인코딩 또는 디코딩입니다. UTF-8은 가장 인기이지만, 다른 포맷은 다음과 같습니다 :
    • UTF-16
    • ISO 8859-1
    질문에

, 당신은 XML 파일로 인코딩되는 것을 언급 utf-8 : 좋습니다. 외장 문자를 파일에 넣을 수는 있지만 특정 XML 파일에 대해서만 인코딩을 지정합니다.

이러한 XML 파일은 Android 리소스로 컴파일되며 올바른 값을 포함합니다 (디버거를 원할 경우 확인하거나 빌드 체인에서 중간 Java 리소스 파일을 보존하여 확인할 수 있음).

HTTP 서버와 데이터를주고받는 데이터는 특히 네트워크상의 바이트와 Java String 사이의 데이터가 변환되는 곳에서 발생합니다. 현재 요청에서 설정하지 않습니다.이 작업은 Apache HTTPClient의 설명서에 설명 된대로 수행 할 수 있습니다.

서버가 이미 이것을 요구하거나 가정 할 수도 있지만 요청시 명확하게 설명하는 것이 좋습니다.

(미안하지만, 저는 Ruby on Rails를 모르므로 특별히 도움을 줄 수있는 방법을 모르겠습니다).

안드로이드 끝으로 돌아가서 HTTP 라이브러리가 UTF-8 디코더로 응답을 디코딩하는지 확인해야합니다. 당신이 직접 처리 할 경우 사용하는 문자열 생성자이 하나라는 것을 확인하고 인수는 "UTF-8"입니다 :

일단

클라이언트와 서버는 UTF를 사용하는 -8, 문제가 해결됩니다.

여기 디버깅하는 데 도움하려면

, 내가 제안 :

  1. 클라이언트와 프로그램 실행 HTTP 코드
  2. 에 가능한 한 가깝게 관련 문자열을 인쇄 서버 클라이언트의 로깅 문장의 수 디버깅 프록시를 통해 통신하도록 구성됩니다. 요청과 응답을 검사하여 실제로 UTF-8인지 확인하십시오.프록시은 다음과 같습니다

+0

답변 해 주셔서 감사합니다.하지만 변환 방법은 아직 확실하지 않습니다. 공유 환경 설정에 UTF-8 형식으로 저장된 데이터? – jamesc

+0

짧은 - 당신은하지 않습니다. 약간 더 길다 : 1) 안드로이드가 공유 환경 설정으로 또는 환경 설정에서 전달한 데이터는 유니 코드이고 옳은 자바 문자열입니다 (손상된 것으로 보이는 경우 손상된 데이터가 먼저 삽입 되었기 때문입니다). 여기서 UTF-8을 사용하는 것은 불가능합니다. Java는 그것을 이해하지 못합니다. 2) 공유 환경 설정에 저장된 데이터는 Android에 의해 * 유지됩니다 * 내부적으로 Android에서 처리됩니다. 거의 확실하게 UTF-8 문제는 웹 서버와의 인터페이스에 있습니다. –

+0

UTF-8은 * 보내는 * 또는 * 수신 * 데이터 일 때 사용되는 특정 인코딩 (문자를 나타내는 와이어의 바이트)입니다. 바이트 배열을 받거나 하나의 배열을 제공해야하는 경우에만 사용됩니다. 또한 웹을 통해 데이터를 보내는 동안 사용되며 특히 UTF-8 인코딩을 사용하도록 HTTP 요청을 만드는 라이브러리에 알려야 할 수도 있습니다. –

관련 문제