2015-10-06 10 views
0

У меня есть входной файл в формате XML и он хорошо сформирован, с хорошо написанными акцентами. Файл создается с помощью PHP-скрипта, который отлично работает. Но когда я читаю XML-файл и записываю его в другой XML, используя программу Java, он помещает странные символы вместо символов с акцентами.Чтение и запись файлов с акцентами

Это метод, который считывает XML-файл:

public static String getArchivo(FileInputStream fileinputstream) 
{ 
    String s = null; 
    try 
    { 
     byte abyte0[] = new byte[1024]; 
     int i = fileinputstream.read(abyte0); 
     if(i != -1) 
     { 
      s = new String(abyte0, 0, i); 
      for(int j = fileinputstream.read(abyte0); j != -1; j = fileinputstream.read(abyte0)) 
      { 
       s = s + new String(abyte0, 0, j); 
      } 

     } 
    } 
    catch(IOException ioexception) 
    { 
     s = null; 
    } 
    return s; 
} 

В связи с тем, что файл считывается байт в байт, Как я заменить «плохих» байт для правильных байтов для акцентированных персонажи? Если чтение таких файлов, как этот байт на байт, не является хорошей идеей, как я могу сделать это лучше?

Персонажи, которые мне нужны, являются: á, é, í, ó, ú, Á, É, Í, Ó, Ú, ñ, Ñ и °.

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

+0

Если чтение UTF (или любой многобайтовая кодировке символов), код будет ломаться, несмотря ни на что, потому что он полагается на преобразование произвольно длинного байтового массива в char, который может разбивать несколько байтов одного символа на несколько границ. – GPI

+0

В этом случае, что является лучшим способом сделать это? – mrcoar

+0

http://stackoverflow.com/q/28969941/2131074 – GPI

ответ

1

Возможно, вы читаете файл с UTF-8 кодировкой. Специальные символы не являются частью кодировки UTF-8. Изменение из UTF-8 в UTF-16

Что-то вроде

InputStream in = ... 
InputSource is = new InputSource(new InputStreamReader(in, "utf-16")); 

Как Jordi правильно сказал, что нет никаких специальных символов за пределами UTF-8. Итак, рассмотрите первую часть как информацию для других специальных символов.

Глядя глубже в свой код, я вижу, что вы читаете int и преобразуете его в строку. Не конвертируйте его. Прочитайте байты и напишите байты, чтобы убедиться, что данные не будут изменены.

+0

* Специальные символы не являются частью UTF-8 * .... Фактически тисненные гласные не являются * специальными символами * и содержатся в [UTF8 chartable] (http://www.utf8-chartable.de/), AFAIK все испанский язык находится внутри UTF-8 –

+0

@Jordi Да, я проверил и запрошенные символы находятся в стандартном UTF-8, спасибо за ваше примечание, я не был уверен в тильдах. –

+0

рад помочь @ Давид, я знаю это потому, что я испанский :) –

0

При чтении использовать кодировку файла UTF-8 лучше всего

BufferedReader rd = new BufferedReader(new InputStreamReader(is, "utf-8")); 

В письменной форме также использовать UTF-8

OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(filePath, true), "utf-8"); 

Это работает для меня.

При чтении файла в редакторе VI или другого изменения редактора кодирования по умолчанию в UTF-8

локаль CharMap LANG = en_US.UTF-8