以下是我的文字
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]
字符。
答案 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 == T
和10 == 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
)编码为%0A
(37, 48, 65
)。
如果您仍然在字节中看到%0D (Carriage Return)
,则您的编辑器会自动调整行尾以匹配Windows'惯例。有一个option in Notepad++可以明确选择行结尾。