【问题标题】:How to identify a special character in a file using java如何使用java识别文件中的特殊字符
【发布时间】:2016-11-29 01:06:17
【问题描述】:

我有一个 .doc 文件,其中包含 ÐÏ 之前的标题,所以我需要删除 ÐÏ 之前存在的所有字符。

示例:asdfasdfasdfasfasdfasfÐÏ9asjdfkj

我使用了下面的代码。

InputStream is = new   FileInputStream("D:\\Users\\Vinoth\\workspace\\Testing\\Testing_2.doc");
    DataInputStream dis = new DataInputStream(is);
    OutputStream os = new  FileOutputStream("D:\\Users\\Vinoth\\workspace\\Testing\\Testing_3.doc");
    DataOutputStream dos = new DataOutputStream(os);
    byte[] buff = new byte[dis.available()];
    dis.readFully(buff);
    char temp = 0;
    boolean start = false;
    try{
    for(byte b:buff){
        char c = (char)b;
        if(temp == 'Ð' && c == 'Ï' ){
            start = true;  
        }
        if(start){
            dos.write(c);
        }
        temp = c;

    }

但是,如果条件没有得到满足,它不会在我的文件中写入任何内容。请告知我该如何执行此操作。

【问题讨论】:

  • 我只需要删除 "ÐÏ" 之前的字符,文档的内容仍然保持不变。我已经尝试过这种方法,只是读写,没有任何改变,doc文件很完美。

标签: java escaping character special-characters


【解决方案1】:

你使用char c = (char)b;时有问题

参考byte-and-char-conversion-in-java

你会看到

Java 中的字符是一个 Unicode 代码单元,它被视为 无符号数。

以您的情况为例。字符 'Ï' 的字节二进制表示是 11001111。 参考oracle tutorial

byte:byte 数据类型是一个 8 位有符号二进制补码整数。 最小值为-128,最大值为127(含)。

所以字节的值为-49。但是,对于 Unicode 使用,11001111 应该被解释为无符号字节,实际上应该是 207。

int i = b & 0xff; 

将获得二进制表示的无符号字节值。

您可以修改您的代码,如下所示。为了方便调试,我更改了文件路径和文件格式。我不确定 .doc 是否是个问题,但您的代码本身有我实际上提到的错误。

import java.io.*;

public class Test {
    public static void main(String args[]){
        InputStream is;
        try {
            is = new   FileInputStream("Testing_2.txt");
            DataInputStream dis = new DataInputStream(is);
            OutputStream os = new  FileOutputStream("Testing_3.txt");
            DataOutputStream dos = new DataOutputStream(os);
            byte[] buff = new byte[dis.available()];
            dis.readFully(buff);
            char temp = 0;
            boolean start = false;
            for(byte b:buff){
                int i = b & 0xff;
                char c = (char)i;
                if(temp == 'Ð' && c == 'Ï' ){
                    start = true;  
                }
                if(start){
                    dos.write(c);
                }
                temp = c;

            }  
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();

        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-30
    • 1970-01-01
    • 1970-01-01
    • 2014-04-25
    • 2018-09-25
    • 2021-08-13
    • 2013-01-05
    相关资源
    最近更新 更多