Java – Encode Hebrew in Java and JSON

Encode Hebrew in Java and JSON… here is a solution to the problem.

Encode Hebrew in Java and JSON

So I have an Android app that shows some messages. I can add messages from my application to my web service’s database, but I have a hard time encoding Hebrew into the correct format.

Here is my JSONParser.class:

package com.example.neotavraham;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONException;
import org.json.JSONObject;

import android.util.Log;

public class JSONParser {

static InputStream is = null;
static JSONObject jObj = null;
static String json = "";

 constructor
public JSONParser() {

}

public JSONObject getJSONFromUrl(final String url) {

 Making HTTP request
    try {
         Construct the client and the HTTP request.
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(url);

 Execute the POST request and store the response locally.
        HttpResponse httpResponse = httpClient.execute(httpPost);
         Extract data from the response.
        HttpEntity httpEntity = httpResponse.getEntity();
         Open an inputStream with the data content.
        is = httpEntity.getContent();

} catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

try {
         Create a BufferedReader to parse through the inputStream.
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                is, "iso-8859-1"), 8);
         Declare a string builder to help with the parsing.
        StringBuilder sb = new StringBuilder();
         Declare a string to store the JSON object data in string form.
        String line = null;

 Build the string until null.
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }

 Close the input stream.
        is.close();
         Convert the string builder data to an actual string.
        json = sb.toString();
    } catch (Exception e) {
        Log.e("Buffer Error", "Error converting result " + e.toString());
    }

 Try to parse the string to a JSON object
    try {
        jObj = new JSONObject(json);
    } catch (JSONException e) {
        Log.e("JSON Parser", "Error parsing data " + e.toString());
    }

 Return the JSON Object.
    return jObj;

}

 function get json from url
 by making HTTP POST or GET mehtod
public JSONObject makeHttpRequest(String url, String method,
        List<NameValuePair> params) {

 Making HTTP request
    try {

 check for request method
        if(method == "POST"){
             request method is POST
             defaultHttpClient
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url);
            httpPost.setEntity(new UrlEncodedFormEntity(params));

HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            is = httpEntity.getContent();

}else if(method == "GET"){
             request method is GET
            DefaultHttpClient httpClient = new DefaultHttpClient();
            String paramString = URLEncodedUtils.format(params, "utf-8");
            url += "?" + paramString;
            HttpGet httpGet = new HttpGet(url);

HttpResponse httpResponse = httpClient.execute(httpGet);
            HttpEntity httpEntity = httpResponse.getEntity();
            is = httpEntity.getContent();
        }           

} catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

try {
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                is, "iso-8859-1"), 8);
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
        is.close();
        json = sb.toString();
    } catch (Exception e) {
        Log.e("Buffer Error", "Error converting result " + e.toString());
    }

 try parse the string to a JSON object
    try {
        jObj = new JSONObject(json);
    } catch (JSONException e) {
        Log.e("JSON Parser", "Error parsing data " + e.toString());
    }

 return JSON String
    return jObj;

}
}

This is the line of code that takes information from the user and tries to encode it:

        String post_title = title.getText().toString();
        String post_message = message.getText().toString();

byte ptext[] = post_title.getBytes(Windows_1255); 
        String value = new String(ptext, UTF_8);
        post_title = value;

byte ptext2[] = post_message.getBytes(Windows_1255); 
        value = new String(ptext2, UTF_8);
        post_message = value;

when: public static final Charset Windows_1255 = Charset.forName("Windows-1255");
public static final Charset UTF_8 = Charset.forName("UTF-8");

So, for example, if the title is “שלום” (“hello” in Hebrew), it will be displayed as “????” (only question marks).

Everything in the app works flawlessly, so it can’t be something unrelated to the coding part!

What can I do?

Solution

I found a solution.

This function helped me :

// convert from internal Java String format -> UTF-8
public static String convertToUTF8(String s) {
    String out = null;
    try {
        out = new String(s.getBytes("UTF-8"), "ISO-8859-1");
    } catch (java.io.UnsupportedEncodingException e) {
        return null;
    }
    return out;
}

Related Problems and Solutions