2015-12-08 8 views
0

Я почесал голову в течение нескольких дней, теперь пытаются выяснить, как правильно кодировать скандинавские символы для использования в текстовом полеSystem.out перенаправление JFX fextfield не показывая скандинавские символы

Эти три символа: Æ Ø Å (æ ø å) отображаются как . это означает, что работает этот код

System.out.println("øst"); 

гравюр "ул" . и я понятия не имею, почему.

Вот код, в котором я перенаправляю System.out на печать.

System.setProperty("user.language", "da"); 
    OutputStream out = new OutputStream() { 
     @Override 
     public void write(int b) throws IOException { 
      appendConsole(new String(new byte[]{(byte)b}, "UTF-8")); 
     } 
    }; 
    PrintStream ps; 
    try { 
     ps = new PrintStream(out, true, "UTF-8"); 
     System.setOut(ps); 
    } catch (UnsupportedEncodingException ex) { 
     Logger.getLogger(GameController.class.getName()).log(Level.SEVERE, null, ex); 
    } 

Если у кого-то есть решение этой проблемы, мы будем благодарны!

ответ

0

Попробуйте не вводить int в байты в строку, а на символ. Это работает?

+0

NaH, точно такой же результат, к сожалению:/ –

+0

, что на самом деле, где я начал, отбрасывая к байту и с помощью строки конструктора была моя попытка фиксации его :) –

+0

избавиться из этой 'новой строки (...);', это очень ресурс (?): D как насчет преобразования ваших специальных символов в символы Unicode? , например. 'ø' будет преобразовано в' \ u00f8' ('System.out.println (" \ u00f8st ");') – Thyaris

0

Когда эти символы кодируются как UTF-8, каждому из них требуется два байта. Например, Æ в UTF-8 составляет { (byte) 0xc3, (byte) 0x86 }. Вы не можете построить String только из одного байта; оба байта необходимы для формирования правильной последовательности UTF-8.

Вам нужно будет накапливать байты, пока вам не будет достаточно, чтобы сформировать полную последовательность UTF-8, а затем создайте из нее строку. ByteBuffer и CharsetDecoder сделаны для этого:

// A UTF-8 sequence for a single character is at most 4 bytes long. 
private final ByteBuffer buffer = ByteBuffer.allocate(4); 

private final CharsetDecoder decoder = StandardCharsets.UTF_8.newDecoder(); 

@Override 
public void write(int b) 
throws IOException { 

    buffer.put((byte) b); 

    int size = buffer.position(); 
    int first = buffer.get(0) & 0xff; 
    if (size == 4 || 
     (first >= 0xe0 && size == 3) || 
     (first >= 0xc0 && size == 2) || 
     first < 0x80) { 

     buffer.flip(); 
     appendConsole(decoder.decode(buffer).toString()); 
     buffer.clear(); 
    } 
}