读取ASCII编码的XML并保存为UTF-8时出现问题

时间:2011-07-20 17:57:19

标签: java xml character-encoding

我有一个java应用程序,它读入一些定义为具有ASCII编码的XML数据。我通过SAXReader读取数据,以便我可以将XML解析为Document。最后,我将XML保存为String,然后将其保存到MySQL数据库。 我遇到的问题是保存到数据库失败,出现以下错误: SQL状态[HY000]; 错误代码[1366]; 字符串值不正确:第1行第'p_xml_data'列的'\ xEF \ xBC \ x93con ...'

我在找出失败的原因时遇到了问题,但我认为它与编码类型有关。数据库表/列定义为UTF-8。

以下是我正在使用的代码片段:

    final URL url = new URL(feedUrl);
    final SAXReader reader = new SAXReader();
    reader.setValidation(false);
    reader.setIgnoreComments(true);

    Document document = reader.read(url);
    Document savedDocument = document;

    processXml(document.getRootElement());

    String xml = document.asXML().replaceAll("\\s+\n", "");

    feed.setXmlData(xml);

    // now we have the basic XML, lets save it
    feed = getSonyPSNModule().save(feed);

以下是一些传入的XML,尽管这是从文档对象的调试器中获取的。

    <?xml version="1.0" encoding="ASCII"?>
    <rss xmlns:dc="http://purl.org/dc/elements/1.1/" >
  <channel>
    <title>Name.com - Name&#xae;3 Games</title>
    <link>http://test.com</link>
    <description>Name.com - Name&#xae;3 Games</description>
    <title>Assassin's Creed&#x2122;</title>

奇怪的是,标题中有撇号,但商标字符编码为&amp; xae;

有没有人有任何想法在这里发生了什么?我一直在尝试各种方法,并尝试在各个点改变编码类型,但无济于事。

这里希望其他人遇到这个问题并解决它!

2 个答案:

答案 0 :(得分:1)

所以你想改变编码。字节本身不应该改变,因为UTF-8是ASCII的超字符集。

我会更改原始文本以更改编码并删除换行符。

答案 1 :(得分:0)

来自Java文档:

  

String表示UTF-16格式的字符串...   http://download.oracle.com/javase/1,5.0/docs/api/java/lang/String.html

因此,假设您在此尝试在数据库中保存字符串,它就像:UTF-8 (XML) -> UTF-16 (Java String) -> UTF-8 (Database)。最后一步是它现在出错了。您将要么必须将该字符串转换为UTF-8。使用其中一个String对象构造函数应该可以工作:new String(oldString.getBytes("UTF-8"));