代码之家  ›  专栏  ›  技术社区  ›  J4C3N-14

字符和符号替换为

  •  0
  • J4C3N-14  · 技术社区  · 10 年前

    我正在使用Jsoup从一个网页收集数据,该网页包含链接到我的数据库的php脚本。我得到的数据包括如下导航坐标:51°42.41N 004°54.61W

    数据在网页上正确显示,但当我使用jsoup解析它并将结果字符串插入我的应用程序时,它们在字符串中的某些点包含替换字符U+FFFD。。。这样地:

    5142.41 n 004 54.61 w

    我可以使用以下命令删除这些特殊功能:

    .replaceAll("\uFFFD", "")
    

    然而,这会导致:

    51 42.41N 004 54.61W

    这不是很理想,因为这些是导航坐标。

    Jsoup对此负责吗?还是Android无法显示这些字符?
    有没有可能在这些字符被制作成之前“捕捉”它们,以便我可以将它们与Android显示的类似内容进行匹配?

    例如,导航坐标中显示的字符是“序数”符号,我可以将其替换为“度”符号°。

    附加:我用于收集数据的代码:

     //Get the Notices to Mariners Amount
                Element ntmNumber = tableRows.select("td:eq(0)").last();
                String ntmAmt = ntmNumber.text();
    
                System.out.println("NtmLoadingTask is Running");
    
                //In-case Data does not exist...
                if (tableRows != null) {//Exists...
    
                    //Convert Ntm Number to int for Gathering the Ntm List
                    int ntmInt = Integer.parseInt(ntmAmt);
                    for (int i = 0; i < ntmInt; i++) {
    
                        //Get Ntm Titles
                        Elements titles = tableRows.select("td:eq(1)");
                        String ntmTitle = titles.get(i).text() + "\n";
                        arr_dataNtmTitles.add(ntmTitle);
    
    
                        //Get Ntm Dates
                        Elements dates = tableRows.select("td:eq(2)");
                        String ntmDates = dates.get(i).text() + "\n";
                        arr_dataNtmDates.add(ntmDates);
    
                        //Get Ntm Content
                        Elements contents = tableRows.select("td:eq(3)");
                        String ntmContent = contents.get(i).text().replaceAll("\uFFFD", "") + "\n";
    
                        arr_dataNtmContents.add(ntmContent);
    
                        System.out.println(ntmContent);
                    }
    

    更新1:

    我尝试过: .replaceAll("\u00BA", "\u00B0") 没有成功:(

    更新2:

    我回到了我为收集数据并将其插入数据库而编写的原始Java代码,我使用了以下代码替换了不需要的字符:

     content = Content.text().replaceAll("[º°]", "°") +"\n";
    

    并通过以下方式验证其正在履行职责:

     content = Content.text().replaceAll("[º°]", "*") +"\n";
    

    它确实有效,并将“序数”符号替换为我认为android会接受的符号(学位符号=°),但我仍然得到了这个:

    51�42�.41N  004� 54�.61W
    

    同样,这对于找到解决方案可能很重要,而且我以前没有注意到它(专注于序数符号),但我也在字符串中的其他位置获得了,如下所示:

    2014年第41号坞锁工程1.特此通知海员。。。。

    特此通知水手们,火线的部署是。。。。。

    从这一点上我可以看出,有些显然是“空格”(41后面有2个空格),有些是“撇号”。 因此,我真的可以在这方面使用一些帮助,我已经尝试在将坏字符插入数据库之前清除它们,并在从PHP页面(在它们看起来应该做的页面上)解析它们之后清除它们,但没有效果。 在使用jsoup解析其他页面时,我是否缺少了一些东西?我没有遇到这个问题,我现在想,这与机器人无法显示字符无关,更多的是与它们如何插入或从数据库中出来有关?这就像是在过滤SQL注入或删除撇号之类的东西??

    PHP脚本:

    <?php
    
    header('Content-Type: text/html; charset=utf-8');
    
    $con=mysqli_connect("******","*******","*******","*******");
    // Check connection
    if (mysqli_connect_errno())
    {
    echo "Failed to connect to MySQL: " . mysqli_connect_error();
    }
    
    $result = mysqli_query($con,"SELECT * FROM **********");
    
    echo "<table border='1' title='table1'>
    <title>HTML Table With PHP</title>
    <caption>*************</caption>
    <tr>
    <th>NTM ID</th>
    <th>NTM TITLE</th>
    <th>NTM DATE</th>
    <th>NTM CONTENT</th>
    </tr>";
    
    while($row = mysqli_fetch_array($result))
    {
    echo "<tr>";
    echo "<td>" . $row['ntmID'] . "</td>";
    echo "<td>" . $row['ntmTitle'] . "</td>";
    echo "<td>" . $row['ntmDate'] . "</td>";
    echo "<td>" . $row['ntmContent'] . "</td>";
    echo "</tr>";
    }
    echo "</table>";
    
    mysqli_close($con);
    ?>
    
    1 回复  |  直到 10 年前
        1
  •  0
  •   J4C3N-14    10 年前

    在我的PHP中将字符集更改为:charset=ISO-8859-1已经停止了不希望的行为。

    header('Content-Type: text/html; charset=ISO-8859-1');