【问题标题】:Java, Unknown characters ン □ Xml responseJava,未知字符 ン □ Xml 响应
【发布时间】:2018-11-11 11:35:44
【问题描述】:

我目前正在尝试从 Xml 文件(可通过此地址访问:http://mobilite.euroairport.com/services/getDepartureAirports?language=French)中提取机场列表。 我的问题是应该出现在“DÜSSELDORF”中的“Ü”是不可能阅读的(甚至直接是 Ie 或 firefox)。 我得到这样的东西: D□SSELDORF 或 D SSELDORF 或 D?SSELDORF

以下是我用来尝试查找此文件编码的代码(n 是包含“DÜSSELDORF”的字符串):

        byte[] bytes = n.getBytes();            
        Log.w("tagtag", (char) bytes[0] + " "+(char) bytes[1]+" "+(char) bytes[2]);
        bytes = n.getBytes("ASCII");            
        Log.w("tagtag", (char) bytes[0] + " "+(char) bytes[1]+" "+(char) bytes[2]);
        bytes = n.getBytes("Cp1252");           
        Log.w("tagtag", (char) bytes[0] + " "+(char) bytes[1]+" "+(char) bytes[2]);
        bytes = n.getBytes("UTF-8");            
        Log.w("tagtag", (char) bytes[0] + " "+(char) bytes[1]+" "+(char) bytes[2]);
        bytes = n.getBytes("ISO8859_1");            
        Log.w("tagtag", (char) bytes[0] + " "+(char) bytes[1]+" "+(char) bytes[2]);
        bytes = n.getBytes("ISO8859_2");

这是结果(在 Android 的 Logcat 中):

        10-08 09:41:30.557: W/tagtag(1506): D □ ン
        10-08 09:41:30.557: W/tagtag(1506): D ? S
        10-08 09:41:30.567: W/tagtag(1506): D ン S
        10-08 09:41:30.567: W/tagtag(1506): D □ ン
        10-08 09:41:30.577: W/tagtag(1506): D ン S
        10-08 09:41:30.637: W/tagtag(1506): D ン S

我的问题是:我在尝试读取此字符串时是否出错,还是由于服务器的问题?

【问题讨论】:

  • 似乎是一个编码问题。我相信观察相关链接可能会很有用 ----->
  • 在提供的链接上,它返回 DUS 的 DSELLDORF?除此之外,我用wireshark检查了流量,服务器返回“Content-Type: application/xml;charset=UTF-8\r\n”,AFAIK表示服务器配置错误
  • 是的,它返回 DSSELDORF。这就是为什么我说即使是 IE 或 firefox 也无法读取它。关于你的建议,约翰,我不明白你想让我看哪里?
  • 嗯.. 是的,但 DSSELDORF 与 “类似:D□SSELDORF 或 D SSELDORF 或 D?SSELDORF” 不同。我认为@linski 是正确的,因为该文件没有该字母的任何字符,并且字母的一般大写性质使我认为设计该格式的人打算将该字段作为机场的唯一且可识别的表示,而不是本地文本中的正确名称。

标签: java html xml encoding utf-8


【解决方案1】:

Definitley 服务器/(数据服务)(错误配置问题)/错误。

服务器在 HTML/XML 响应中返回这一行:

Content-Type: application/xml;charset=UTF-8\r\n

我刚刚检查了 xml 的字节转储,这就是 wireshark 表示“DSSELDORF”的方式:

D..SSELDORF

在十六进制转储中(参见 UTF-8 code table 获取十六进制值 c2 9d):

44 c2 9d 53 53

应该是:

44 - D
53 - S

和 C2 9D

被解释为控制字符,也称为不可打印字符 - 因此“缺失”U - 这也解释了您的 logcat 输出。

【讨论】:

  • 谢谢你!这正是我的猜测,但我对服务器和编码知之甚少
【解决方案2】:

我认为我找到了问题所在。 我设法访问了 web 服务代码,我发现用于更新 web 服务 bdd 的文件是用 ANSI 编码的。 使用此代码读取此文件:

InputStreamReader input = new InputStreamReader(new FileInputStream("vols"), "UTF-8");
BufferedReader buffer = new BufferedReader(input);

我猜问题出在这里,所以我会要求客户端更改此文件的编码,但我不确定这是我问题的唯一原因。

感谢你们的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-22
    • 2018-09-15
    • 1970-01-01
    • 2011-10-08
    • 1970-01-01
    • 2015-09-10
    • 1970-01-01
    • 2011-02-26
    相关资源
    最近更新 更多