当前位置: 首页 > 面试题库 >

如何解析与Java编码不同的字符串

张翰海
2023-03-14
问题内容

我有一个从Word文档中读取的字符串。我认为它采用“ Cp1252”编码。Java使用UTF8。

如何在该字符串中搜索Cp1252中的那些特殊字符并将其替换为适当的UTF8字符?

具体来说,我想将“ En Dash”字符替换为普通的“-”

以下代码块采用了来自Word文档的projDateString,并尝试执行此操作

    char[] test = projDateString.getBytes("Cp1252");
    for(int i = 0; i < test.length; i++){
    System.out.println "test["+ i + "] = " + Integer.toHexString((byte)test[i]);
    }
    String projDateString2 = new String(test);
    projDateString2.replaceAll("\0x96", "\u2013");
    System.out.println("projDateString2: " + projDateString)

我不确定我是否正确设置了projDateString2。如您所见,当我使用Cp1252编码在字符串上获取字节时,该破折号的十六进制值为ffffff96。如果我使用UTF8来获取字节数,则它作为3个十六进制值而不是1个。

这给了我以下输出:

test[0] = 30
test[1] = 38
test[2] = 2f
test[3] = 32
test[4] = 30
test[5] = 31
test[6] = 30
test[7] = 20
test[8] = ffffff96
test[9] = 20
test[10] = 50
test[11] = 72
test[12] = 65
test[13] = 73
test[14] = 65
test[15] = 6e
test[16] = 74
projDateString2: 08/2010 ΓÇô Present

如您所见,替换并没有执行任何操作,并且println仍然为我提供了垃圾字符,而不是纯文本“-”


问题答案:

Java字符串 始终 在UTF-16中,至少就API而言......但是您通常可以将它们视为“
Unicode”。它们是UTF-16的事实仅在涉及基本多语言平面之外的字符(即Unicode值高于U + FFFF)时才真正相关。它们必须在Java中表示为
代理对 。但是我认为您不必为此担心。因此,只需将Strings中的值视为没有特定编码的“ Unicode文本” …尤其是绝对 不在
UTF-8或CP1252中。这些是用于将 二进制 数据(例如,字节数组)转换为文本数据(例如,字符串)的编码。


您不应该使用String.getBytes()new String(byte[])不指定编码- 这就是 问题所在。那些总是使用平台默认编码-
这几乎 总是 错误的选择。

您说自己“已经从Word文档中读入了一个字符串”-您是如何读入的?它是如何开始生活的?

如果您有 字节, 并且知道相关的编码,则应使用:

String text = new String(bytes, encoding);

您永远不必处理使用错误编码创建的字符串-如果进入该阶段,您几乎 注定 会丢失信息。尽早解决问题,而不是稍后再尝试修复数据。

接下来的 事情要明白的是,String在Java类是不可变的。调用replaceAll字符串 不会更改现有字符串
。相反,它将返回包含已进行替换的 字符串。

所以这条语句:

projDateString2.replaceAll("\0x96", "\u2013");

永远 做你想做的。即使其他一切正确,您也应该使用:

projDateString2 = projDateString2.replaceAll("\0x96", "\u2013");

(或类似的内容)。我认为这实际上 不会满足您的要求,但是当您整理完所有其他内容时,您需要意识到这一点。



 类似资料:
  • 初识Unicode 编码 # codecs_to_hex.py import binascii def to_hex(t, nbytes): """Format text t as a sequence of nbyte long values separated by spaces. """ chars_per_item = nbytes * 2 he

  • 我有一个用mvn Exec:java运行的程序(我的主文件是用utf-8编码的,系统的默认字符集是windows-1252) 我不明白为什么第一次打印工作,根据文档getBytes使用给定的字符集将字符串编码成字节序列,字符串构造函数通过使用平台的默认字符集解码指定的字节数组来构造新的字符串

  • 问题内容: 我得到了一个像这样的字符串 我该如何编写Java代码来解码编码字符,例如 在字符串中。是否有任何现有的类/方法可以对其进行解码? 谢谢。 问题答案: 要取消转义HTML / XML实体,请使用Apache Commons Lang 或homegrow one 。

  • 本文向大家介绍如何在JavaScript中解码编码的字符串?,包括了如何在JavaScript中解码编码的字符串?的使用技巧和注意事项,需要的朋友参考一下 解码 在JavaScript中,使用unescape()方法解码字符串。该方法采用一个字符串,该字符串由escape()方法编码,并对其进行解码。字符串中的十六进制字符将被使用unescape()方法表示的实际字符替换。 语法 示例 接下来,两

  • 下面的java代码 生成一个JSONObject,该对象转义项目符号,但不转义带grave的拉丁文字母e,例如“\u2022é”,字节码为[123、34、97、108、101、114、116、34、58、34、92、117、50、48、50、50、-61、-87、34、125] 如何在Javascript中获得相同的精确输出(按字节顺序)?我不明白为什么JSONObject只转义一个字符,而不转义

  • 我使用openssl使用以下命令对字符串进行编码: 结果给我一个编码字符串: 到目前为止,我只需要使用openssl对其进行解码,因此以下命令将返回先前编码的字符串: 结果: 现在,我需要解码编码字符串在一个java应用程序。 有人能给我提供一个简单的java类来解码用前面给定的openssl命令编码的字符串吗? 非常感谢。