2017-12-13 10 views
0

에서 키릴 문자 작동하지 않습니다.인코딩 관련 문제.</p> <pre><code>private static final String FILE_PATTERN = "((\s*".*НЕКОТОРЫЕ СИМВОЛЫ .*"\R)([^"].* (?!-)\d+\s*)+)+"; </code></pre> <p>이 또한 내가 UTF-8 인코딩으로 입력 테스트 파일이 있습니다 .JAR 그래서 난 내 코드에서 리터럴 문자열로이 정규식이 UTF-8 파일

그리고 문제는 IDE (내 IntelliJ IDEA)에서 프로그램을 테스트 할 때 모든 것이 정상입니다. 특히 regex는 테스트 파일에서 키릴 문자와 함께 작동합니다.

하지만 내 프로그램 (Maven)을 빌드하고 동일한 테스트 파일로 .jar 파일을 테스트했을 때, 가장 가능성있는 정규식이 키릴 문자로 작동하지 않는다는 것이 밝혀졌습니다.

그런 다음 Windows 1251 인코딩의 파일로 다시 테스트 한 결과 작동했습니다.

그럼 내 질문은 - IDE에서와 마찬가지로 UTF-8 파일로 .jar를 어떻게 만들 수 있습니까?

미리 감사드립니다.


[갱신 1]

two test files, one in UTF-8 and another in Windows 1251

내가이 같은 \ U 코드로 키릴 문자를 대체하려고했습니다

:

private static final String FILE_PATTERN = "((\\s*\".*\\u041E\\u0442\\u0434\\u0435\\u043B .*\"\\R)([^\"].* (?!-)\\d+\\s*)+)+"; 

이 작동하지 않습니다 :(


[UPDATE2]

파일 처리는 다음과 같이 시작 :이 같은

static void processFile(String inputFile) { 
    try { 
     String fileStr = FileHandler.readFile(inputFile).toString(); 
     if (!FileParser.validateFile(fileStr)) { 
      System.out.println("Sorry, input file format is invalid"); 
      ... 

파일의 유효성을 검사 외모 :

public class FileParser { 
private static final String FILE_PATTERN = "((\\s*\".*Отдел .*\"\\R)([^\"].* (?!-)\\d+\\s*)+)+"; 

public static boolean validateFile(String fileStr) { 
    return Pattern.compile(FILE_PATTERN).matcher(fileStr).matches(); 
} 
... 

파일 읽기는 매우 일반적인 생각 :

public class FileHandler { 
public static StringBuilder readFile(String fileName) { 
    StringBuilder res = new StringBuilder(); 
    String temp; 
    try (BufferedReader r = new BufferedReader(new FileReader((fileName)))) { 
     while ((temp = r.readLine()) != null) { 
      res.append(temp).append("\n"); 
     } 
    } catch (FileNotFoundException e) { 
     System.out.println("Input file not found!"); 
    } catch (IOException e) { 
     // log exception 
    } 
    return res; 
} 
... 
+0

다른 환경에서 테스트 파일이 인코딩되는 방식 (또는 인코딩 된 것으로 가정)은 문제가있는 것 같습니다. 그것을 확인하려면 [mcve]가 필요합니다. –

+0

유니 코드 표현을 \ uxxxx와 함께 사용해 볼 수 있습니다. 여기서 xxxx는 charecter의 유니 코드 16 진수 값입니다. – Skgland

+0

이 Documantation 페이지 [Java Doc Pattern Class]의 유니 코드 지원 섹션 (https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern)을 살펴볼 수도 있습니다. .html) – Skgland

답변

1

I 문제에 대한 가능성을 던질 것입니다.

FileReader 및 FileWriter 클래스는 지정된 인코딩에 대해 과부하가없는 기본 플랫폼 인코딩을 사용합니다. 나는이 구성되어 있는지 확실하지,하지만 대안 중 하나를

public static StringBuilder readFile(String fileName) { 
    StringBuilder res = new StringBuilder(); 
    String temp; 
    Charset charset = StandardCharsets.UTF_8; 
    //Charset charset = Charset.fromName("Windows-1251"); 
    try (BufferedReader r = Files.newBufferedReader(fileName, charset)) { 
     while ((temp = r.readLine()) != null) { 
      res.append(temp).append("\n"); 
     } 
    } catch (FileNotFoundException e) { 
     System.out.println("Input file not found!"); 
    } catch (IOException e) { 
     // log exception 
    } 
    return res; 
} 

또는 :

String readFile(String fileName) throws IOException { 
    byte[] content = Files.readAllBytes(Paths.get(fileName)); 
    return new String(content, StandardCharsets.UTF_8); 
} 

그리고 자바 소스의 편집기 인코딩이의 것과 동일한 인코딩해야합니다 javac 컴파일러. 하나는 특수 문자의 \uXXXX ASCII 표현을 사용하여이를 확인할 수 있습니다 : 그것은 갑자기 작동하는 경우, ...

당신은 두 개의 백 슬래시,하지만 \u0063을 사용 (편지 c)는 자바 소스 레벨, 실제로 작동하는 대신 public class publi\u0063 \u0063lass을 작성할 수 있습니다.

private static final String FILE_PATTERN = 
    "((\\s*\".*\u041E\u0442\u0434\u0435\u043B .*\"\\R)([^\"].* (?!-)\\d+\\s*)+)+"; 

그런 다음 두 개의 유니 코드 플래그, (?u)편지를 구성하는 것에 대한 (?U) undermore이있는 정규 표현식이 있습니다. 그것은 여기서 문제가되어서는 안됩니다.

+0

Charset 클래스를 사용해 보았지만 도움이되지 않는 것처럼 보입니다. 어쨌든 고마워요! –