Java BufferedReader ()가 아랍어와 한자를 올바르게 읽지 않는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/2260325

  •  20-09-2019
  •  | 
  •  

문제

각 줄에 영어 및 아랍어 문자가 포함 된 파일과 각 줄에 영어 및 중국어가 포함 된 다른 파일을 읽으려고합니다. 그러나 아랍어와 중국인의 인물은 올바르게 표시되지 않습니다. 단지 물음표로 나타납니다. 이 문제를 어떻게 해결할 수 있는지 아십니까?

다음은 읽기에 사용하는 코드입니다.

try {
        String sCurrentLine;
        BufferedReader br = new BufferedReader(new FileReader(directionOfTargetFile));
        int counter = 0;

        while ((sCurrentLine = br.readLine()) != null) {
            String lineFixedHolder = converter.fixParsedParagraph(sCurrentLine);
            System.out.println("The line number "+ counter
                               + " contain : " + sCurrentLine);
            counter++;
        }
    }

판 01

선을 읽고 아랍어와 중국어 단어를 얻은 후 단순히 검색하여 기능을 사용합니다. 아랍어 텍스트가 주어졌습니다 ArrayList (모든 예상 단어가 포함 된) (indexof (); 메소드 사용)에서. 그런 다음 단어의 색인이 발견되면 다른 Arraylist에서 동일한 인덱스를 갖는 영어 단어를 호출하는 데 사용됩니다. 그러나이 검색은 아랍어 및 중국어 대신 물음표를 검색 할 때 실패하기 때문에 항상 False를 반환합니다. 그래서 내 system.out.println print는 번역에 실패 할 때마다 널스를 보여줍니다.

*NetBeans 6.8 Mac 버전 IDE를 사용하고 있습니다


판 02

번역을 검색하는 코드는 다음과 같습니다.

        int testColor = dbColorArb.indexOf(wordToTranslate);
        int testBrand = -1;
        if ( testColor != -1 ) {
            String result = (String)dbColorEng.get(testColor);
            return result;
        } else {
            testBrand = dbBrandArb.indexOf(wordToTranslate);
        }
        //System.out.println ("The testBrand is : " + testBrand);
        if ( testBrand != -1 ) {
            String result = (String)dbBrandEng.get(testBrand);
            return result;
        } else {
            //System.out.println ("The first null");
            return null;
        }

실제로 번역하려는 원하는 단어를 포함 할 수있는 2 개의 Arraylist를 검색하고 있습니다. 두 배열리스트에서 찾지 못하면 NULL이 반환됩니다.


판 03

디버그 할 때 읽는 선이 문자열 변수에 다음과 같이 저장되어 있음을 발견했습니다.

 "3;0000000000;0000001001;1996-06-22;;2010-01-27;����;;01989;������;"

판 03

내가 읽고있는 파일은 다른 프로그램에 의해 수정 된 후 나에게 주어졌다 (VB에서 만든 것 외에는 아무것도 모른다). Notepad ++에서 파일 인코딩을 확인했을 때 ANSI임을 보여주었습니다. 그러나 UTF8로 변환 할 때 (아랍어 문자를 다른 영어 문자로 대체 한 다음) ANSI로 다시 변환 한 아랍어는 물음표가됩니다!

도움이 되었습니까?

해결책

FileReader Javadoc:

캐릭터 파일을 읽기위한 편의 클래스. 이 클래스의 생성자는 기본 문자 인코딩과 기본 바이트 버퍼 크기가 적절하다고 가정합니다. 이러한 값을 직접 지정하려면 fileInputStream에 입력 스트리 프 리더를 구성하십시오.

그래서:

Reader reader = new InputStreamReader(new FileInputStream(fileName), "utf-8");
BufferedReader br = new BufferedReader(reader);

이것이 여전히 작동하지 않으면 콘솔이 UTF-8 문자를 올바르게 표시하도록 설정되지 않았을 것입니다. 구성은 사용 된 IDE에 따라 다소 간단합니다.

업데이트 : 위의 코드에서 대체 utf-8 ~와 함께 cp1256. 이것은 나에게 잘 작동합니다 (Winxp, JDK6)

그러나 UTF-8을 사용하여 생성되는 파일을 고집하는 것이 좋습니다. 왜냐하면 cp1256 중국어에서는 효과가 없으며 다시 비슷한 문제가 생길 것입니다.

다른 팁

정보를 올바르게 읽을 가능성이 높지만 출력 스트림은 아마도 UTF-8이 아니므로 출력 문자 세트에 표시 할 수없는 문자는 '?'로 대체됩니다.

각 캐릭터를 꺼내어 캐릭터 서수를 인쇄하여이를 확인할 수 있습니다.

public void writeTiFile(String fileName,String str){
    try {
        FileOutputStream out = new FileOutputStream(fileName);
        out.write(str.getBytes("windows-1256"));
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top