Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/207.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java android,UTF8-如何确保UTF8用于共享首选项_Java_Android_Utf 8 - Fatal编程技术网

Java android,UTF8-如何确保UTF8用于共享首选项

Java android,UTF8-如何确保UTF8用于共享首选项,java,android,utf-8,Java,Android,Utf 8,如何确保UTF8用于共享首选项菜单?我有一个android首选项菜单,允许用户设置自己的名字,以及其他内容 我需要知道如何将存储在共享首选项中的数据转换为UTF8格式 首选项菜单在res/xml文件夹中的一个名为settings的文件中使用utf8编码以xml格式显示,如下所示: <?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.c

如何确保UTF8用于共享首选项菜单?我有一个android首选项菜单,允许用户设置自己的名字,以及其他内容

我需要知道如何将存储在共享首选项中的数据转换为UTF8格式

首选项菜单在res/xml文件夹中的一个名为settings的文件中使用utf8编码以xml格式显示,如下所示:

<?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>
我假设设置
将确保文本以UTF8格式编码,但情况并非总是如此。我得到各种格式的值。一些例子

“\nFe\xF1a”、“L\xFAcia”、“$”\xE5\xEE“

“:-$B-):-p=-OB-:-D:-Q:-X:-!:-\n:”(:-*XDo:-X:-C:-X:O:-X=-O;-):-):-):-:-D:OX:-O:-V:-V:-X:-Do:-C:-
\xBF\xA1\xA1\xAB\xBB\xAE\xA9^\xA5\xA5?[\xA2}?\xA2\xA2\xA5\xA3?$\xBF\xA1\xAE\xA7>关键是理解和之间的区别

  • Java使用Unicode处理内存中的字符和字符串。每个字符存储在两个字节中
  • 当文本在进程之间传输(如传输到web服务器)或从磁盘写入/读取时,内部表示将转换为有线格式。这是编码或解码。UTF-8是最流行的格式,但其他格式包括:
    • UTF-16
    • ISO 8859-1
在您的问题中,您提到XML文件是用utf-8编码的:这很好,您可以在文件中放入外来字符,但这只指定了特定XML文件的编码

这些XML文件将被编译成Android资源,并将包含正确的值(如果您愿意,可以在调试器中进行检查,或者通过保存构建链中的中间Java资源文件进行检查)

几乎可以肯定的是,问题在于向HTTP服务器发送数据和从HTTP服务器接收数据的位置,特别是在网络上的字节和Java
字符串之间转换数据的位置。目前,您没有在请求中设置它-这可以按照的文档中所述进行

尽管服务器可能已经需要/假设了这一点,但在请求中清楚地说明这一点无疑是一件好事

您还需要确保服务器(中的服务器):

  • 他在等UTF-8
  • 使用UTF-8解码器解码请求
  • 使用UTF-8编码对响应进行编码
(对不起,我不知道RubyonRails,所以我不知道如何在这方面提供具体帮助)

回到Android端,您还需要确保您的HTTP库正在使用UTF-8解码器解码响应。如果您自己处理此问题,请确保您使用的字符串构造函数是此构造函数,并且参数是“UTF-8”:

一旦客户端和服务器都使用UTF-8,您的问题就会得到解决

为了帮助调试,我建议:

  • 服务器和客户端上的许多日志记录语句,这些语句打印的相关字符串尽可能接近HTTP代码
  • 使用配置为通过调试代理进行对话的客户端运行。检查请求和响应,并检查它们是否确实是UTF-8。代理包括:


  • 仅供参考-我相信设置此选项:"是指示任何xml解析器布局文件内容是以utf-8编码的。换句话说,它完全是xml布局文件本身的属性,我不相信它在使用该布局时对Android的行为有任何影响……感谢您的回答,但我仍然不清楚如何转换存储在共享首选项中的数据转换为UTF-8格式?简言之,您不需要。稍长一点:1)Android向共享首选项传递和从共享首选项传递的数据是Java字符串,它们是Unicode并且是正确的(如果它们看起来损坏,那是因为之前插入了损坏的数据)。这里根本不可能使用UTF-8-Java不会理解它。2)存储在共享首选项中的数据由Android内部保存,由Android处理。几乎可以肯定,UTF-8的问题在于与web服务器的接口。请记住,UTF-8是一种特定的编码(导线上表示字符的字节)在发送或接收数据时使用。仅当您接收字节数组或需要提供字节数组时才使用。在通过web发送数据时也使用它,您可能需要告诉创建HTTP请求的库专门使用UTF-8编码。我可以在此处与您聊天:我必须转换我获取的任何数据l将共享首选项转换为UTF8格式,这样我就可以将其作为有效的JSON发送到我的Web服务器(期望将有效的JSON发送到它),那么在发送之前我如何将例如“joaq\xEDn”转换为“joaqín”。非常感谢您的持久性
    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);     
        }
    }
    
    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);
    }