2013-05-20 3 views
-1

Java에서 UTF-8 인코딩에 문제가 있습니다. UTF-8로 인코딩 된 .txt 파일이 있습니다. 메모장에서 실제로 파일이 UTF-8로 인코딩되었는지 확인했습니다. 파일을 읽으려고하지만 특수 문자가 올바르게 표시되지 않습니다.Java에서 UTF-8 txt 파일의 특수 문자를 읽을 수 없습니다.

나는 다음 코드 평화를 사용

 try { 

     Scanner sc = new Scanner(new FileInputStream("file.txt"), "UTF-8"); 

     String str; 

     while(sc.hasNextLine()) { 
      str = sc.nextLine(); 
      roadNames.add(str); 
      System.out.println(str); 
     } 

     sc.close(); 

    } catch(IOException e1) { 
     System.out.println("The file was not found...."); 
    } 

그것은 내 생성 된 jar 파일에 올바르게 내가 UTF-8로 기본 인코딩을 정의 이클립스 특수 문자를 보여주고 있지만.

나를 위해 실제로 작동하는 유일한 것은 "java -Dfile.encoding = utf-8 -jar executable.jar"인수를 사용하여 .bat 파일을 만드는 것입니다. 그러나 좋은 해결책이라고 생각하지 않습니다. .

또한,이 또한 작동합니다

PrintStream out = new PrintStream(System.out, true, "UTF-8"); 
out.println(str); 

업데이트

을 내가는 것을 의미

특수 문자가 제대로 표시되지 않습니다 말할 때 System.out. println은 특수 문자가 å 대신에 ##로 대체되는 문자열을 인쇄합니다. 미안 -

그것은

PrintStream out = new PrintStream(System.out, true, "UTF-8"); 
out.println(str); 

이 Afterall는 작동하지 않습니다 밝혀졌습니다.

실제 문제는 콘솔에서 텍스트 문서 안에있는 내용을 인쇄하려고하지만 텍스트 문서의 각 줄에 이름이 들어 있고이 이름이 ArrayList에 추가된다는 것입니다. 그런 다음 JTextField를 사용하여 그 안에 입력을 시작하면 ArrayList 내에서 가장 일치하는 이름을 검색하여 입력 한 내용을 자동 완성하려고 시도합니다. JTextField 내의 특수 문자가 올바르게 표시되지 않기 때문에 인코딩 문제가 아니라면 완벽하게 작동합니다. 내가 사용하는 경우에만 올바르게 표시되는 Dfile.encoding = UTF-8 인수

+0

당신은 무엇을 의미합니까 "그것은 제대로 특수 문자 보여줍니다"? eclipe에서 비 라틴어 기호를 볼 수 있지만 Windows에서 .bat 파일을 열면 ...? 올바른 문자가 보이지 않는다면 Windows에 올바른 언어 팩이 설치되어 있지 않기 때문일 수 있습니다. 이것은 Java 관련 질문이 아닙니다. 파일의 바이트가 올바른 경우 Java와 아무런 관련이 없습니다. –

+1

어디에서 표시하려고합니까? > 그러나 특수 문자는 올바르게 표시되지 않습니다. –

+1

'System.out.println (str);이 줄에 대해서 이야기하고 있다면, 콘솔이 그 문자들을 보여줄 수 없다는 것이 문제이다. 그 외에는 모든 일을 올바르게하고 있습니다. – jlordo

답변

1

당신이 뭔가를 지정하지 않는 한 자바 플랫폼의 기본 인코딩을 사용합니다.

플랫폼 기본값 (Windows 설정)이 UTF-8이 아니므로 file.encoding 속성을 지정하지 않았거나 PrintStream 생성자에 인코딩을 제공하는 경우 기본 인코딩이 사용됩니다. 이 경우 인코딩 할 수없는 문자가 발견되면 대신 해당 인코더의 대체 문자가 사용됩니다. 일반적으로 '& # xFFFD;'입니다. 또는 '?'.

운영 시스템은 인쇄하고자하는 문자의 일부가 표시되지 않을 수도 있음을 나타내는한다. 그 힌트를 무시하고 최선을 다할 것을 희망하거나, 귀찮은 등장 인물을 표시 할 수있는 것으로 대체 할 수 있습니다. 기본값은 바꾸기입니다. 당신은 더 위험한 접근법을 사용하기를 원한다면 명확해야한다.


업데이트 : 문제가 아니라 그 출력을 파일을 읽는에있다처럼이 원래의 질문에 대한 업데이트에서 제공하는 정보를 바탕으로, 소리가 난다.

플랫폼 기본 인코딩을 사용하는 경우는 예외입니다. 따라야하는 일반적인 패턴은 일련의 바이트를 문자열로 디코딩 할 때마다 인코딩을 명시 적으로 지정하는 것입니다. 인코딩은 독자가 읽고있는 스트림에 내재되어 있으며 일반적으로 코드가 실행되는 시스템과는 독립적입니다. 예외는 콘솔에서 읽거나 비슷한 경우입니다. 그렇지 않으면 HTTP 헤더, 파일에 포함 된 속성 또는 특정 인코딩이 필요한 표준과 같은 인코딩을 지정하는 메타 데이터 또는 규칙이 있어야합니다. 여기

는 UTF-8 – 인코딩 된 파일에서 도로 이름을 읽는 방법은 다음과 같습니다

Set<String> roadNames = new TreeSet<>(); 
try (InputStream bytes = new FileInputStream("file.txt")) { 
    /* See how I'm specifying the UTF-8 encoding explicitly? */ 
    Reader chars = new InputStreamReader(bytes, StandardCharsets.UTF_8); 
    BufferedReader lines = new BufferedReader(chars); 
    while (true) { 
    String line = lines.readLine(); 
    if (line == null) 
     break; 
    roadNames.add(line); 
    } 
} 
관련 문제