【问题标题】:Weird character conversion, need help clarifying奇怪的字符转换,需要帮助澄清
【发布时间】:2018-11-29 23:28:16
【问题描述】:

所以我正在编写一个程序,它将从网页中提取的数据提取到 Excel 表中,然后将其打印到文本注释中。但是,我遇到的一个奇怪的问题是,从excel表格到文字注释,一个字符发生了变化。 - 变成了? .我的解决方案是遍历单词以及它何时到达?并将其更改为 - 。我试过使用我在网上找到的 unicodes 并做了一个

.replace("(question mark unicode) ", " - ") 

无济于事。有谁知道它为什么这样做?你能确认 unicodes 吗?和 - 。所以如果这个词是“Leo-III 1.3”现在是“Leo?III 1.3”谢谢你的帮助

【问题讨论】:

    标签: java unicode jsoup character jxl


    【解决方案1】:

    ? 是字符集编码问题的结果,可能出现在数据管道中的许多地方。

    实际上可能在字符串的打印中,并且字符串本身是有效的。

    要找出实际的字符值是什么,请尝试运行此代码以打印字符串中所有非 ASCII 字符的 Unicode 转义:

    public static void printNonAscii(String s) {
        TreeSet<Character> nonAscii = new TreeSet<>();
        for (char ch : s.replaceAll("[\r\n\\x20-\\x7E]", "").toCharArray())
            nonAscii.add(ch);
        for (char ch : nonAscii)
            System.out.printf("\\u%04X  %s%n", (int) ch, ch);
    }
    

    测试(UTF-8 源代码)

    printNonAscii("Foo ? \uFFFD ç ñ © ¼");
    

    输出

    \u00A9  ©
    \u00BC  ¼
    \u00E7  ç
    \u00F1  ñ
    \uFFFD  �
    

    【讨论】:

    • Test(UTF-8 中的源代码)是什么意思?它也吐回/u2011。这是什么意思?
    • 另外,我尝试了另一个用户提到的方法 String newreheader = reheader.replaceAll("\u2011","-") 并且它有效,所以谢谢
    • @Beat。 Unicode 有许多“连字符”字符,例如 ('NON-BREAKING HYPHEN' (U+2011)) 看起来与普通的 - ('HYPHEN-MINUS' (U+002D)) 相同,但它告诉 Word 等文字处理工具不要在连字符后换行。 Unicode 中还有许多其他连字符,例如 ('HYPHEN' (U+2010)), ('EN DASH' (U+2013)), ...
    【解决方案2】:

    根据 Java 文档,String 类的 replace 方法将原始 char 或实现 CharSequence 的对象(如 String)作为其参数。

    如果您想将 Leo?III 1.3 转换为 Leo-III 1.3,请使用:

    .replace("?", "-")

    【讨论】:

    • 我之前尝试过,但没有成功,抱歉之前没有提及。以为我做到了。
    【解决方案3】:

    java 中的replace 将字符作为第一个参数,并用第二个参数替换所有出现的地方。

    你可以使用这个:

    String newStr = str.replaceAll("\\?", "-");
    

    replaceAll 将第一个参数作为正则表达式,并用第二个参数替换所有匹配项。

    注意:\帮助逃跑?

    另外,请务必将结果存储在新的字符串变量中,因为字符串是不可变的。

    【讨论】:

    • 我试过 .replace("\?", "-") 它说它不可接受
    • @Beat。 replaceAll() 而不是 replace()
    • @Beat。我已编辑我的答案以使用 2 \ 即“\\?”并不是 ”\?”。对不起!尝试 ”\\?”它应该可以工作
    • 不管什么原因都不起作用。字符串 newreheader = reheader.replaceAll("\\?", "-");仍然什么都不做。
    • @Beat。我再次在我的 IDE 中尝试了它,它对我有用!你可以在replaceAll() 之后粘贴控制台输出吗?因为它应该有效!也为了测试的缘故,尝试将它粘贴到一个 java 文件中,因为它对我有用:String s2 = "this i s??new?hh";String s3 = s2.replaceAll("\\?", "-");System.out.println(s3);
    猜你喜欢
    • 2015-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    相关资源
    最近更新 更多