Rob Kent
Rob Kent

Reputation: 5193

How to read and write UTF-8 to disk on the Android?

I cannot read and write extended characters (French accented characters, for example) to a text file using the standard InputStreamReader methods shown in the Android API examples. When I read back the file using:

InputStreamReader tmp = new InputStreamReader(in);
BufferedReader reader = new BufferedReader(tmp);
String str;
while ((str = reader.readLine()) != null) {
...

the string read is truncated at the extended characters instead of at the end-of-line. The second half of the string then comes on the next line. I'm assuming that I need to persist my data as UTF-8 but I cannot find any examples of that, and I'm new to Java.

Can anyone provide me with an example or a link to relevant documentation?

Upvotes: 9

Views: 28549

Answers (5)

William T. Mallard
William T. Mallard

Reputation: 1660

Check the encoding of your file by right clicking it in the Project Explorer and selecting properties. If it's not the right encoding you'll need to re-enter your special characters after you change it, or at least that was my experience.

Upvotes: 0

itsadok
itsadok

Reputation: 29342

When you instantiate the InputStreamReader, use the constructor that takes a character set.

InputStreamReader tmp = new InputStreamReader(in, "UTF-8");

And do a similar thing with OutputStreamWriter

I like to have a

public static final Charset UTF8 = Charset.forName("UTF-8");

in some utility class in my code, so that I can call (see more in the Doc)

InputStreamReader tmp = new InputStreamReader(in, MyUtils.UTF8);

and not have to handle UnsupportedEncodingException every single time.

Upvotes: 10

Mukund K Roy
Mukund K Roy

Reputation: 165

if you face any such kind of problem try doing this. You have to Encode and Decode your data into Base64. This worked for me. I can share the code if you need it.

Upvotes: 0

Elliott Hughes
Elliott Hughes

Reputation: 4665

this should just work on Android, even without explicitly specifying UTF-8, because the default charset is UTF-8. if you can reproduce this problem, please raise a bug with a reproduceable test case here:

http://code.google.com/p/android/issues/entry

Upvotes: 1

yanchenko
yanchenko

Reputation: 57166

Very simple and straightforward. :)

String filePath = "/sdcard/utf8_file.txt";
String UTF8 = "utf8";
int BUFFER_SIZE = 8192;

BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(filePath), UTF8),BUFFER_SIZE);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filePath), UTF8),BUFFER_SIZE);

Upvotes: 26

Related Questions