Java 如何知道文件中有哪些特殊字符?

Java 如何知道文件中有哪些特殊字符?,java,encoding,utf-8,character-encoding,Java,Encoding,Utf 8,Character Encoding,我的应用程序需要在批处理过程中处理文本文件。有时我会收到一个文件,文件末尾有一些特殊字符。我不确定那个特殊的角色是什么。无论如何,我都可以找到那个角色,这样我就可以告诉其他制作该文件的团队 我用mozilla的库猜测文件编码,它显示UTF-8 任何十六进制编辑器都应该允许您查看文件中的每个字节。这应该让你告诉他们这是什么性格 这里是我过去使用过的一个:在Unix上,您可以使用od实用程序在文件或流中输出字节数据的几种表示形式。首先,字符是否真的是“特殊”取决于您称之为“特殊字符”的内容。作为Un

我的应用程序需要在批处理过程中处理文本文件。有时我会收到一个文件,文件末尾有一些特殊字符。我不确定那个特殊的角色是什么。无论如何,我都可以找到那个角色,这样我就可以告诉其他制作该文件的团队


我用mozilla的库猜测文件编码,它显示UTF-8

任何十六进制编辑器都应该允许您查看文件中的每个字节。这应该让你告诉他们这是什么性格


这里是我过去使用过的一个:

在Unix上,您可以使用
od
实用程序在文件或流中输出字节数据的几种表示形式。

首先,字符是否真的是“特殊”取决于您称之为“特殊字符”的内容。作为Unix和OS X上的旁注,例如,您可以使用od、file和hextump命令轻松检查文件:

... $  hexdump -C example.txt 
00000530  6f 77 73 20 61 63 74 69  6f 6e 2e 0a 0a 0a 0a     |ows action.....|
现在,如果您知道您的文件编码是UTF-8,这意味着其最高位设置为零的每个字节只对应一个字符(在上面的示例中,最后一个字节是“0a”,这意味着“0a”字节对应一个“字符”)

UTF-8中的文件还意味着最高位设置为1的每个字节都是多字节字符的一部分。例如,在以下字节序列中:

75 20 5b e2 80 a6 5d 20  61 75 74 6f 72 69 73 61
唯一具有最高位集的三个字节是“e2 80 a6”(从0x80到0xFF的所有值都具有其最左侧/最高位集),并且它们是同一字符的一部分(在UTF-8中,非ASCII字符不能仅由一个设置了最高位的字节组成,因此您知道这三个字节是同一个字符的一部分……事实上,设置了最左边/最高位的每个UTF-8字节都是UTF-8真正美丽的特征)

现在你在谷歌上搜索“e280a6”,你会发现它是一个名为“水平省略号”的Unicode字符(其代码点在UTF-8中由十六进制e280a6表示)

所以基本上你必须做两件事:

  • 找出构成最后一个“特殊”字符的字节(是一个字节还是几个字节?)

  • 查找此/这些字节对应的“特殊字符”


现在,年轻人开始意识到为什么比特、十六进制和低级字符编码“细节”的知识是一项很好的技能;)好的,我运行了od-c filename.txt,下面是输出。导致问题的字符似乎是ASCII SUB.“一个替代字符(␚) 是一种控制字符,用于替换被识别为无效或错误的字符,或无法在给定设备上表示的字符。”我计划询问其他团队他们是如何生成此文件的,以及在哪个操作系统上生成的。我的方法是否正确,或者你们是否有其他建议。关于0001340.0 0 | 0 1 0 0\n 032\n