Преобразование Java jaxb utf-8/iso

У меня есть файл XML, содержащий нестандартные символы (например, странную «кавычку»).

Я прочитал XML, используя UTF-8/ISO/ascii + неупорядочил его:

BufferedReader br = new BufferedReader(new InputStreamReader(
                (conn.getInputStream()),"ISO-8859-1"));
        String output;
        StringBuffer sb = new StringBuffer();
        while ((output = br.readLine()) != null) {
            //fetch XML
            sb.append(output);
        }


        try {

            jc = JAXBContext.newInstance(ServiceResponse.class);

            Unmarshaller unmarshaller = jc.createUnmarshaller();

            ServiceResponse OWrsp =  (ServiceResponse) unmarshaller
                    .unmarshal(new InputSource(new StringReader(sb.toString())));

У меня есть функция оракула, которая будет принимать коды iso-8859-1 и преобразовывать/сопоставлять их с «буквальными» символами. то есть: "’" => "левая одинарная кавычка"

JAXB unmarshal с использованием iso, отображает символы с преобразованием iso в порядке. то есть все странные одинарные кавычки будут закодированы как "’"

поэтому предположим, что моя строка: класс 10–11 лет (обратите внимание на странность — от 11 до года)

jc = JAXBContext.newInstance(ScienceProductBuilderInfoType.class);
        Marshaller m = jc.createMarshaller();
        m.setProperty(Marshaller.JAXB_ENCODING, "ISO-8859-1");
        //save a temp file
        File file2 = new File("tmp.xml");

это сохранит в файле:

class of 10–11‐year‐olds. (what i want..so file saving works!)

[примечание: я прочитал файл с помощью программы чтения файлов java, и он выводит указанную выше строку в порядке]

у меня проблема в том, что представление STRING с использованием jaxb unmarshaller имеет странный вывод, по какой-то причине я не могу получить строку для представления –.

когда я 1: проверьте неупорядоченный вывод xml:

class of 10?11?year?olds

2: Выходной файл:

class of 10–11‐year‐olds

я даже пытался прочитать файл из сохраненного XML, а затем разобрал его (в надежде получить - в моей строке)

String sCurrentLine;
        BufferedReader br = new BufferedReader(new FileReader("tmp.xml"));
        StringBuffer sb = new StringBuffer();
        while ((sCurrentLine = br.readLine()) != null) {
            sb.append(sCurrentLine);
        }




        ScienceProductBuilderInfoType rsp =  (ScienceProductBuilderInfoType) unm
                .unmarshal(new InputSource(new StringReader(sb.toString())));

бесполезно.

есть идеи, как получить кодированный символ iso-8859-1 в jaxb?


person nate    schedule 22.08.2013    source источник
comment
Какое программное обеспечение вы используете для отображения/просмотра неупорядоченного строкового представления? (текст для детей 10–11 лет)   -  person Joni    schedule 22.08.2013
comment
консоль затмения. я не могу понять, ПОЧЕМУ jaxb конвертирует -   -  person nate    schedule 22.08.2013
comment
Как вывести строку на консоль с помощью System.out? JAXB декодирует ссылки на объекты, потому что это то, что должен делать синтаксический анализатор XML, хотя iirc можно настроить так, чтобы он этого не делал.   -  person Joni    schedule 23.08.2013


Ответы (1)


Решено: используя этот тибидный код, найденный в stackoverflow

final class HtmlEncoder {
  private HtmlEncoder() {}

  public static <T extends Appendable> T escapeNonLatin(CharSequence sequence,
      T out) throws java.io.IOException {
    for (int i = 0; i < sequence.length(); i++) {
      char ch = sequence.charAt(i);
      if (Character.UnicodeBlock.of(ch) == Character.UnicodeBlock.BASIC_LATIN) {
        out.append(ch);
      } else {
        int codepoint = Character.codePointAt(sequence, i);
        // handle supplementary range chars
        i += Character.charCount(codepoint) - 1;
        // emit entity
        out.append("&#x");
        out.append(Integer.toHexString(codepoint));
        out.append(";");
      }
    }
    return out;
  }
}

HtmlEncoder.escapeNonLatin(MYSTRING)

person nate    schedule 23.08.2013