编码文本URL

时间:2018-04-28 16:06:24

标签: java character-encoding

以下是我的文字

Test[LF]
[LF]
Test[LF]
[LF]
Test[LF]
Test[LF]

在启用show symbol后,在notepad ++中显示[LF]符号,如上所示。

当在文本上面发生内部时,它显示如下

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

[LF] encoded as %0D%0A

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

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

1 个答案:

答案 0 :(得分:1)

您可以使用此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]

如果你很幸运,你可以看到每个值在ASCII table中的含义,你的文件是用UTF-8或ASCII编码的,只包含ASCII字符(如果没有,那么将字节翻译成字符将会非常复杂 - 查看您正在使用的特定编码。

例如,84 == T10 == LF (Line Feed),因此您可以将上述内容翻译为Test(LF)Test(LF)

要转义文件中的整个字符串以便在网址中使用,请使用URLEncoder,如下例所示:

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)编码为%0A37, 48, 65)。

如果您仍然在字节中看到%0D (Carriage Return),则您的编辑器会自动调整行尾以匹配Windows'惯例。有一个option in Notepad++可以明确选择行结尾。