Преобразование формата Shift_JIS в формат UTF-8

Я пытаюсь преобразовать файл в формате Shift_JIS в формат UTF-8. Вот мой подход к этому:

  1. Прочитать файл Shift_JIS
  2. getBytes каждой строки и преобразовать ее в UTF-8
  3. Создайте новый файл и запишите в него преобразованное значение UTF-8

Проблема в том, что на шаге 2 преобразование не происходит. Я использую приведенный ниже код для преобразования Shift_JIS в UTF-8:

InputStream inputStream = getContentResolver().openInputStream(uri);
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
    byte[] b = line.getBytes("Shift_JIS");
    String value = new String(b, "UTF-8");

Пожалуйста, дайте мне знать, если потребуется какая-либо другая информация.

У меня 2 вопроса:

1. Есть ли другой лучший способ (шаги) сделать это преобразование?

2. Почему приведенный выше фрагмент кода не работает для преобразования?

Заранее спасибо!!!


person Vikasdeep Singh    schedule 12.10.2016    source источник


Ответы (3)


Ответ @VicJordan неверен. Когда вы вызываете getBytes(), вы получаете необработанные байты строки, закодированные в собственной кодировке символов вашей системы (которая может быть или не быть UTF-8). Затем вы обрабатываете эти байты, как если бы они были закодированы в UTF-8, что может и не быть.

Более надежным подходом было бы чтение файла Shift_JIS в строку Java. Затем напишите строку Java, используя кодировку UTF-8.

InputStream in = ...
Reader reader = new InputStreamReader(in, "Shift_JIS");
StringBuilder sb = new StringBuilder();
int read;
while ((read = reader.read()) != -1){
  sb.append((char)read);
}
reader.close();

String string = sb.toString();

OutputStream out = ...
Writer writer = new OutputStreamWriter(out, "UTF-8");
writer.write(string);
writer.close();
person Michael    schedule 16.10.2016
comment
Большое спасибо. Это имеет смысл - person Vikasdeep Singh; 17.10.2016

Наконец я нашел решение. Совершал очень серьезную ошибку. Код ниже работает отлично:

InputStream inputStream = getContentResolver().openInputStream(uri);
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "Shift_JIS"));
byte[] b = line.getBytes();
String value = new String(b, "UTF-8");
person Vikasdeep Singh    schedule 14.10.2016

Если вы хотите скопировать inFile (SHift_JIS) в outFile (UTF-8).

try (Reader reader = new InputStreamReader(new FileInputStream(inFile), "Shift_JIS");
    Writer writer = new OutputStreamWriter(new FileOutputStream(outFile), "UTF-8")) {
    char[] buffer = new char[4096];
    int size;
    while ((size = reader.read(buffer)) >= 0)
        writer.write(buffer, 0, size);
}
person saka1029    schedule 14.10.2016