How to ensure that UTF8 is used for a general preference menu? I have an Android settings menu that allows the user to specify their name, among other things.
I need to know how to convert data stored in general settings to UTF8 format
The preferences menu is laid out in xml using utf8 encoding in a file with parameters in the res / xml folder and looks like this:
<?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>
The class that handles this is
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();
I assumed that setting <?xml version="1.0" encoding="utf-8"?> Ensures that the text will be encoded in UTF8 format, but this is not always the case. I get values ββin all formats. Some examples
"\ nFe \ xF1a", "L \ xFAcia", "$ '\ xE5 \ xEE'",
or
": - $ B-) O: -): - P = -ob -): - D: -Q: -X: -: - |! \ P: '(: - * XDo_O: -X: -C: -X: O: -X = -O; -): -): -); -): - D: OX- (o_O: -V: - @: - V: -X: -Do_O :: - \ XBF \ xa1 \ xa1 \ XAB \ Xbb \ XAE \ xA9 ^ \ xA5 \ xA5 [\ XA2} \ XA2 \ XA2 \ xA5 \ XA3 $ \ XBF \ xa1 \ XAE \ xA7> <??? [\ XA3 ~? = ~~ \xB0]\xA3?\xA7\xA1\\\xAB\xBB\xAE^``]]||||}{_| ] ||| \ XB0 \ XB0? "
Yes, this is one set of rubies in the last example.
Problems that I run when trying to send nmes as json HTTP POST or PUT request to my web server using the following code
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); }
This causes all kinds of problems on my web server, which expects valid JSON (i.e. UTF8) since JSON should be sent to UTF8 first.
So,
1) Why <?xml version="1.0" encoding="utf-8"?> Not set the UTF8 encoding? when used in layout?
2) What is the best way to ensure that I always receive valid UTF8 format characters sent to my web server? Should this be handled by a put request or code that preserves shared access or either code that populates a json object, or perhaps a combination of the above? or something else?
This is the next question from RoR Rails 3 - How to handle an incomplete multibyte PG error character