2017-11-15 1 views
-4

문자열의 각 줄의 첫 글자를 대문자로 사용하는 함수를 작성하고 있습니다. 다음과 같은 입력 그래서 :왜 자바 스크립트에서 System.lineSeparator()가있는 문자열이 같지 않은가

String test="this is a test" + System.lineSeparator() + 
        "write some words" + System.lineSeparator() + 
        "and sentences"; 

출력해야한다 : 그러나

String expected="This is a test" + System.lineSeparator() + 
        "Write some words" + System.lineSeparator()+ 
      "And sentences"; 

, 내가 이클립스 실행할 때. 출력은 다음과 같습니다

This is a test[ 
Write some words] 
And sentences 

그 바이트 :

54686973206973206120746573740a577269746520736f6d6520776f726473416e642073656e74656e636573 

Eclipse에서 예상되는 문자열은 다음과 같습니다

This is a test[ 
Write some words 
] 
And sentences 

그 바이트 :

54686973206973206120746573740d0a577269746520736f6d6520776f7264730d0a416e642073656e74656e636573 

그래서 두 개의 문자열이 없습니다 같은. 온라인 Java 컴파일러에서 일부 코드를 실행하면 두 개의 문자열이 동일합니다.

특정 시스템 명령을 lineSeparator()로 설정하고 두 개의 문자열 (출력 및 예상)을 동일하게 설정해야하는지 궁금합니다.

감사합니다.

+0

질문이 명확하지 않다, 문제는 무엇인가? 너는 무엇을 이루려고 하는가? –

+0

SO에 오신 것을 환영합니다.잠시 시간을내어 [질문하는 방법]을 읽으십시오. (https://stackoverflow.com/help/how-to-ask) 현재로서는 적절한 해결책을 이끌어 내기에 충분한 정보를 제공하지 않습니다. – yacc

+0

실행 구성에'line.separator = \ n'과 같은 VM 인수가있을 수 있습니다 (실행 구성의 _Arguments_ 탭 참조). – howlger

답변

0

해결해야 할 문제는 실제로 Eclipse가 아닙니다. 플랫폼 독립적 인 코드를 작성해야합니다.

명령 줄/Linux 환경의 경우 줄 구분 기호는 줄 바꾸기 (LF) 이며 종종 줄 바꿈 (NL; "\ n"; '0a')입니다. Eclipse/Windows/DOS의 경우 구분자는 캐리지 리턴, 줄 바꿈 (CRLF; "\ r \ n"; { '0d', '0a'})입니다.

16 진수 출력을 기반으로, Eclipse 행 구분 기호가 실제로 CRLF 인 반면 편집 한 문자열에는 LF 만 표시됩니다. 즉, 테스트 문자열의 CRLF를 LF로 잘못 변경하는 작업을 수행하고 있습니다.

예를 들어, 테스트 문자열을 여러 문자열로 분할 한 다음 편집 된 문자열을 "\ n"으로 구성 할 수 있습니다. 예 : str1 + "\ n"+ str2 - 또는 - String.format ("% s \ n % s", str1, str2). 대신 System.LineSeperator()를 사용하여 구성해야합니다. 예 : String.format ("% s % s % s", str1, System.LineSeperator(), str2).

이전에 언급했듯이 Eclipse 동작을 변경하려면 here을 제안하는 것이 좋습니다.


참조 : 우리는 업데이트 된 텍스트를 작성하는 데 사용되는 코드를 볼 수 없습니다. 하지만 두 문자열의 바이트를 덤프하여 서로 다른 점을 확인할 수도 있습니다. 또한보십시오 here.

예를 들어 이클립스에서는 캐리지 리턴과 줄 바꿈이 표시됩니다.


    false 
    4162630a446566 
    4162630d0a446566 


    public static void main(String args[]) 
    { 
     String s = "Abc\nDef"; 
     String t = "Abc"+System.lineSeparator()+"Def"; 
     System.out.println(s.equals(t)); 
     System.out.println(hexStr(s.getBytes())); 
     System.out.println((hexStr(t.getBytes()))); 
    } 
    static String hexStr(byte[] bytes) { 
     try (Formatter formatter = new Formatter()) { 
      for (byte b : bytes) formatter.format("%02x", b); 
      return formatter.toString(); 
     } 
    } 

+0

제안 해 주셔서 감사합니다. 지금 내 질문에 바이트를 업데이트했습니다. – kaneroy

+0

예상 한 문자열에 캐리지 리턴 (0d)과 줄 바꿈 (0a)이 있습니다. 편집 한 문자열에는 줄 바꿈 만 있습니다 (0a). 따라서 편집 된 문자열을 만드는 방법은 lineSeparators를 다르게 처리하는 것으로 보입니다. 편집 문자열을 처리하는 방법에 대한 자세한 정보가 있습니까? – robertf

+0

네, 저것이 제가 알아 낸 것입니다 (제 이클립스는 lineSeparators를 다르게 처리 할 수 ​​있습니다). 문자열을 처리하는 방법은 매우 간단합니다. 테스트 문자열의 경우 줄 단위로 읽습니다. 각 줄에 첫 글자를 대문자로하십시오. 죄송합니다. 숙제이므로 여기에 모든 코드를 붙여 넣을 수는 없습니다. 당신의 도움을 주셔서 감사합니다! – kaneroy

관련 문제