Как закодировать символы от Oracle до XML?

Prelude предоставляет две функции, на которые вы можете посмотреть:

span :: (a -> Bool) -> [a] -> ([a], [a])

span , примененный к предикату p и списку xs, возвращает кортеж, в котором первый элемент - самый длинный префикс (возможно, пустой) из xs элементов, которые удовлетворяют p, а второй элемент - остаток списка.

break :: (a -> Bool) -> [a] -> ([a], [a])

break, примененный к предикату p и списку xs, возвращает кортеж, где первый элемент - самый длинный префикс (возможно, пустой) из xs элементов которые не удовлетворяют p, и второй элемент является остатком списка.

blockquote>

Вы можете использовать их, чтобы разбить список на две части:

  1. Самый длинный префикс 0
  2. Остаток.

Индекс , на который вы ссылаетесь , - это длина префикса плюс 1 (первый элемент оставшегося списка). Используя сопоставление с образцом, вы можете извлечь число по этому индексу и добавить соответствующее значение. Затем соберите все обратно в список:

addNext :: (Num a, Eq a) => [a] -> [a]
addNext xs = 
    case span (==0) xs of
         (ps, (q:q':qs)) -> ps ++ [q] 
                               ++ [fromIntegral (length ps) + q' + 1] 
                               ++ qs
         _               -> xs

8
задан 3 revs, 2 users 66% 5 October 2008 в 12:54
поделиться

3 ответа

Я нашел интересный список в Спецификации Xml: Согласно тому Списку его нежелательное для использования Символьного № 26 (Шестнадцатеричное число: #x1A).

Символам, определенным в следующих диапазонах, также препятствуют. Они - или управляющие символы или постоянно неопределенные символы Unicode

Посмотрите полные спектры.

Этот код заменяет весь недопустимый Xml Utf8 от Строки:

public String stripNonValidXMLCharacters(String in) {
    StringBuffer out = new StringBuffer(); // Used to hold the output.
    char current; // Used to reference the current character.

    if (in == null || ("".equals(in))) return ""; // vacancy test.
    for (int i = 0; i < in.length(); i++) {
        current = in.charAt(i);
        if ((current == 0x9) ||
            (current == 0xA) ||
            (current == 0xD) ||
            ((current >= 0x20) && (current <= 0xD7FF)) ||
            ((current >= 0xE000) && (current <= 0xFFFD)) ||
            ((current >= 0x10000) && (current <= 0x10FFFF)))
            out.append(current);
    }
    return out.toString();
}    

его взятый от Недопустимых Символов XML: когда допустимый UTF8 не означает допустимый XML

Но с этим у меня был тихий UTF-8 compatility проблема:

org.xml.sax.SAXParseException: Invalid byte 1 of 1-byte UTF-8 sequence

После чтения XML - возвращающий XML как UTF-8 от сервлета я просто испытал то, что происходит, если я установил Contenttype как это:

response.setContentType("text/xml;charset=utf-8");

И это работало....

7
ответ дан 5 December 2019 в 19:04
поделиться

Расширяемый язык разметки (XML) 1.0 говорит:

Символ амперсанда (и) и открывающая угловая скобка (<) не должен казаться в их литеральной форме, кроме тех случаев, когда используемым в качестве разделителей разметки, или в рамках комментария, инструкции по обработке или раздела CDATA. Если они необходимы в другом месте, их нужно оставить с помощью или ссылок цифрового символа или строк "и" и" <" соответственно. Правую угловую скобку (>) можно представить с помощью строки">", и, для совместимости, нужно оставить с помощью любого">" или символьная ссылка, когда появляется в строке"]]>" в содержании, когда та строка не отмечает конец раздела CDATA.

Можно пропустить кодирование при использовании CDATA:

<column num="1"><![CDATA[10069]]></column>
<column num="2"><![CDATA[sd&]]></column>
2
ответ дан 5 December 2019 в 19:04
поделиться

Какую версию JRE Вы выполняете? В Проекте саксофона говорится:

J2SE 1.4 связывает старую версию SAX2. Как я делаю SAX2 r2 или позже доступным?

0
ответ дан 5 December 2019 в 19:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: