Java 编码文本URL

Java 编码文本URL,java,character-encoding,Java,Character Encoding,下面是我的文本 Test[LF] [LF] Test[LF] [LF] Test[LF] Test[LF] 在记事本++中,启用“显示符号”后,将显示上面显示的[LF]符号 当内接上述文本时,显示如下 Test%0D%0A%0D%0ATest%0D%0A%0D%0ATest%0D%0ATest [LF] encoded as %0D%0A 我的问题是为什么被编码为%0D%0A?因为[LF]编码为%OA 其中as[CR]编码为[%OD],但在上面的文本中,我没有使用[CR]字符。您可以使用此

下面是我的文本

Test[LF]
[LF]
Test[LF]
[LF]
Test[LF]
Test[LF]
在记事本++中,启用“显示符号”后,将显示上面显示的
[LF]
符号

当内接上述文本时,显示如下

Test%0D%0A%0D%0ATest%0D%0A%0D%0ATest%0D%0ATest

[LF] encoded as %0D%0A
我的问题是为什么被编码为
%0D%0A
?因为
[LF]
编码为
%OA


其中as
[CR]
编码为
[%OD]
,但在上面的文本中,我没有使用
[CR]
字符。

您可以使用此Java类查找输入文件的每个字节: 包装实例

import java.io.File;
import java.nio.file.Files;
import java.util.Arrays;

public class FileBytes {
    public static void main( String[] args ) throws Exception {
        if (args.length != 1) {
            throw new IllegalArgumentException( "Please provide one argument" );
        }
        File f = new File( args[0] );
        System.out.println( Arrays.toString( Files.readAllBytes( f.toPath() ) ) );
    }
}
您将看到如下内容:

[84, 101, 115, 116, 10, 84, 101, 115, 116, 10]
如果幸运的话,您可以看到每个值在一个文件中的含义,并且您的文件是用UTF-8或ASCII编码的,并且只包含ASCII字符(如果不是,那么将字节转换为字符将非常复杂-请查看您正在使用的特定编码)

例如,
84==T
10==LF(换行)
,因此您可以将上述内容转换为
Test(LF)Test(LF)

要转义文件中的整个字符串,以便在URL中安全使用,请使用
urlcoder
,如本例所示:

package example;

import java.io.File;
import java.net.URLEncoder;
import java.nio.file.Files;
import java.util.Arrays;

public class FileBytes {
    public static void main( String[] args ) throws Exception {
        if ( args.length != 1 ) {
            throw new IllegalArgumentException( "Please provide one argument" );
        }
        File f = new File( args[ 0 ] );
        byte[] bytes = Files.readAllBytes( f.toPath() );
        String rawText = new String( bytes, "UTF-8" );
        String encodedText = URLEncoder.encode( rawText, "UTF-8" );

        System.out.println( "Raw text: " + rawText );
        System.out.println( "Encoded text: " + encodedText );
        System.out.println( "Raw bytes: " + Arrays.toString( bytes ) );
        System.out.println( "Encoded bytes: " + Arrays.toString( encodedText.getBytes() ) );
        System.out.println( Arrays.toString( bytes ) );
    }
}
其中打印:

Raw text: Test
Test

Encoded text: Test%0ATest%0A
Raw bytes: [84, 101, 115, 116, 10, 84, 101, 115, 116, 10]
Encoded bytes: [84, 101, 115, 116, 37, 48, 65, 84, 101, 115, 116, 37, 48, 65]
这清楚地表明换行符(
10
)编码为
%0A
37、48、65


如果在字节中仍然看到
%0D(回车)
,则编辑器将自动调整行尾以符合Windows的惯例。有一种方法可以明确地选择行尾。

我的猜测是,由于某种原因,文本中确实存在回车符,这就是为什么在对文本进行编码时会看到回车符。但在ebabing后,仅显示LF字符。我不知道“ebabing”是什么。这是一个类型错误。在记事本++中打开“显示所有符号”后,实际上,用户必须查阅表格,以了解文件保存时使用的字符编码,而不是ASCII表。但是有人试图找出行尾可能不会太在意编码:)我假设UTF-8实际上-并且给出了问题中的示例,文件可能只包含ASCII字符-因为UTF-8看起来像ASCII,如果是真的,似乎没有必要用编码的细节来使答案复杂化。ASCII是一种编码,可能是错误的。这对我来说似乎很复杂。我添加了一个编辑,以明确编码可能很重要。