Java BufferedReader ()가 아랍어와 한자를 올바르게 읽지 않는 이유는 무엇입니까?
문제
각 줄에 영어 및 아랍어 문자가 포함 된 파일과 각 줄에 영어 및 중국어가 포함 된 다른 파일을 읽으려고합니다. 그러나 아랍어와 중국인의 인물은 올바르게 표시되지 않습니다. 단지 물음표로 나타납니다. 이 문제를 어떻게 해결할 수 있는지 아십니까?
다음은 읽기에 사용하는 코드입니다.
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로 다시 변환 한 아랍어는 물음표가됩니다!
해결책
캐릭터 파일을 읽기위한 편의 클래스. 이 클래스의 생성자는 기본 문자 인코딩과 기본 바이트 버퍼 크기가 적절하다고 가정합니다. 이러한 값을 직접 지정하려면 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();
}
}