2017-09-13 57 views
1

我在一個對象內部有正常的String屬性,包含重音字符。 如果我調試軟件(使用Netbeans),到變量面板我會看到正確的方式將字符串:在Java中輸出和preg到Unicode字符串

variables window in debug mode

但是,當我要打印出與System.out的變量。的println我會看到奇怪的事情:

output window

正如你可以看到每一個「A」變成了「一「」等等,而這將導致一個錯誤的字符數,即使在匹配器上的字符串。

我該如何解決這個問題?我需要重音字符,讓正確的字符數和使用匹配器。 我嘗試了很多方法,但不會去工作,肯定我錯過了一些東西。

在此先感謝。

EDIT

Full output window view

再次編輯

這是代碼:

public class TextLine { 
    public List<TextPosition> textPositions = null; 
    public String text = ""; 
} 

public class myStripper extends PDFTextStripper { 

    public ArrayList<TextLine> lines = null; 

    boolean startOfLine = true; 

    public myStripper() throws IOException 
    { 
    } 

    private void newLine() { 
     startOfLine = true; 
    } 

    @Override 
    protected void startPage(PDPage page) throws IOException 
    { 
     newLine(); 
     super.startPage(page); 
    } 

    @Override 
    protected void writeLineSeparator() throws IOException 
    { 
     newLine(); 
     super.writeLineSeparator(); 
    } 

    @Override 
    public String getText(PDDocument doc) throws IOException 
    { 
     lines = new ArrayList<TextLine>(); 
     return super.getText(doc); 
    } 

    @Override 
    protected void writeWordSeparator() throws IOException 
    { 
      TextLine tmpline = null; 

      tmpline = lines.get(lines.size() - 1); 
      tmpline.text += getWordSeparator(); 
      tmpline.textPositions.add(null); 

     super.writeWordSeparator(); 
    } 

    @Override 
    protected void writeString(String text, List<TextPosition> textPositions) throws IOException 
    { 
     TextLine tmpline = null; 

     if (startOfLine) { 
      tmpline = new TextLine(); 
      tmpline.text = text; 
      tmpline.textPositions = textPositions; 
      lines.add(tmpline); 
     } else { 
      tmpline = lines.get(lines.size() - 1); 
      tmpline.text += text; 
      tmpline.textPositions.addAll(textPositions); 
     } 

     if (startOfLine) { 
      startOfLine = false; 
     } 

     super.writeString(text, textPositions); 
    } 
} 
+0

這不僅僅是控制檯中的顯示問題嗎?字符串仍然應該包含正確的字符。 –

+0

可能重複[如何爲我的JVM設置默認語言環境?](https://stackoverflow.com/questions/8809098/how-do-i-set-the-default-locale-for-my-jvm) – Colonder

+0

不,因爲即使我做了一個字符串。長度計數是錯誤的(正在計算額外的口音) –

回答

3

它是關於某些Unicode字符的表示。

什麼是角色?這個問題很難回答。是à一個字符還是兩個(在彼此之上的a`)?這取決於你認爲是一個角色。

你所看到的口音墳墓(`)實際上是combining diacritical marks。組合變音標記是獨立的Unicode字符,但與許多文本處理器的前一個字符結合在一起。例如,java.text.Normalizer.normalize(str, Normalizer.Form.NFC)爲你做這樣的工作。

您正在使用的庫(Apache PDFBox)可能對文本進行了規範化處理,因此將變音符與前面的字符組合在一起。因此,在您的文本中,一些TextPosition實例包含兩個代碼點(更確切地說,e`a`)。因此列表與TextPosition情況下,長度爲65

然而,你String,這實際上是一個CharSequence,擁有67個字符,因爲音調符號本身佔用1 char

System.out.println()只是打印字符串的每一個字符,並表示爲 「上真車Geova e` IL CreatoreËColui車da`津樂匯。Probabilmen-」


那麼,爲什麼是Netbeans調試器顯示"dere che Geova è il Creatore e Colui che dà la vita. Probabilmen-"作爲字符串的值?

這只是因爲Netbeans調試器爲您顯示標準化文本。

+1

java。**文本**。Normalizer可用於合成和分解重音字母,可以是單個組合字母,也可以是基本拉丁字母加零寬度口音。可能該字符串是以分解形式存在的,並且System.out用真正的重音或suchl替換了零寬度的重音。因此這可能是解決方案。 –

+0

非常好,非常感謝,這是解決方案!你救了我的旅程;-) 感謝大家誰幫助,很多! –