2017-09-12 6 views
0

현재 키의 이름이 int [] 인 파일에 hashmap의 int []를 저장하고 있습니다. 이 정확한 키는 다른 프로그램에서 도달 할 수 있어야합니다. 따라서 나는 영어로만 파일 이름을 변경할 수 없다. 그러나 ISO_8859_1을 파일 이름의 charset으로 사용하더라도 파일은 모두 파일 트리에서 엉망이됩니다. 영문 글자는 정확하지만 특별한 글자는 아닙니다.Java에서 새 파일을 만들 때 라틴 문자를 올바르게 사용할 수 없습니다. 파일 이름이 올바른 문자 대신 이상한 문자를 얻습니다.

 /** 
     * Save array to file 
     */ 
     public void saveStatus(){ 
      try { 
       for(String currentKey : hmap.keySet()) { 
        byte[] currentKeyByteArray = currentKey.getBytes(); 
        String bytesString = new String(currentKeyByteArray, StandardCharsets.ISO_8859_1); 
        String fileLocation = "/var/tmp/" + bytesString + ".dat"; 
        FileOutputStream saveFile = new FileOutputStream(fileLocation); 
        ObjectOutputStream out = new ObjectOutputStream(saveFile); 
        out.writeObject(hmap.get(currentKey)); 
        out.close(); 
        saveFile.close(); 
        System.out.println("Saved file at " + fileLocation); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

리눅스가 문자를 인코딩하는 방법과 관련이 있거나 Java 코드와 관련이있을 수 있습니까?

편집 나는 문제가 OS에있다 생각합니다. 예를 들어 고양이로 텍스트 파일을 볼 때 문제가 동일하기 때문입니다. 그러나 vim은 문자를 올바르게 해독 할 수 있습니다. 이 경우 터미널에서 언어 설정을 변경해야합니다.

+0

문자열의 바이트를 다른 문자 집합으로 변환하지 마십시오. 문자열 내에서 인코딩은 UTF-16이어야하며, UTF-16이어야합니다. 'getBytes()'는 현재 JVM의 기본 charset에서 바이트를 가져옵니다. 'new String (..., CharSet)'주어진 문자셋에 있다고 가정하고 바이트들로부터 문자열을 생성합니다. 이것은 현재의 캐릭터 세트로 추출했기 때문에 분명히 잘못되었습니다. – RealSkeptic

+0

이 파일들을 읽는 프로그램을 수정할 가능성이 있습니까? 나는. 파일 이름의 유효 문자가 파일 시스템에 크게 의존한다는 문제를 피하기 위해 파일 이름 (base64, ...)에 키를 인코딩 할 수 있습니까? – sruetti

+0

@RealSkeptic 어떤 인코딩 매개 변수를 전달해야합니까? – ChristofferAB

답변

1

getBytes 함수에서도 charset을 변경해야합니다.

currentKey.getBytes(StandardCharsets.ISO_8859_1); 

또한 StandardCharsets.ISO_8859_1을 사용하고 계십니까? 더 넓은 범위의 문자를 사용하려면 StandardCharsets.UTF_8을 사용하십시오.

+0

사실 바이트는 추출되거나 전혀 변경되지 않아야합니다. – RealSkeptic

+0

@Chinmay jain UTF_8에 ISO_8859_1의 모든 내용이 포함됩니까? – ChristofferAB

+0

예, 모든 항목이 ISO_8859_1에 포함됩니다. –

1

파일 이름이나 경로의 유효한 문자는 사용되는 파일 시스템에 따라 다릅니다. 파일 은 파일 이름으로 자바 문자열을 사용하는 것이 가능해야하지만 (주어진 파일 시스템에서 유효하지 않은 문자를 포함하지 않는 한) 상호 운용성 문제와 버그가있을 수 있습니다.

즉, 모든 캐릭터 셋 마법은 @RealSkeptic 권장 사항을 따르지 않고 이어야합니다. 그러나 환경을 변경하면 예기치 않은 동작이 발생할 수 있습니다.

요구 사항에 따라 키를 인코딩하여 축소 된 문자 집합 만 사용하도록 할 수 있습니다. Base64의 변형이 가능합니다 (파일 시스템이 대소 문자를 구분한다고 가정)! 문자열을 파일 이름에 사용할 수있는 문자로 줄이는 기능을 제공하는 라이브러리 (Apache Commons?)를 찾을 수도 있습니다.

+0

감사! 나는 너의 제안을 시도 할 것이다. 아마 파일 시스템과 관련이 있다는 것을 깨달았습니다. – ChristofferAB

관련 문제