Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中输出和preg到Unicode字符串_Java_String_Unicode - Fatal编程技术网

Java中输出和preg到Unicode字符串

Java中输出和preg到Unicode字符串,java,string,unicode,Java,String,Unicode,我在对象中有普通字符串属性,包含重音字符。 如果我调试软件(使用Netbeans),在变量面板中,我将以正确的方式看到该字符串: 但是当我要用System.out.println打印变量时,我会看到奇怪的事情: 正如您所看到的,每个“a”都变成了“a”,以此类推,这将导致错误的字符计数,即使是在字符串的匹配器中 我怎样才能解决这个问题?我需要的重音字符,有正确的字符计数,并使用它的匹配。 我尝试了很多方法,但都不管用,我肯定错过了一些东西 提前谢谢 编辑 再次编辑 代码如下: public

我在对象中有普通字符串属性,包含重音字符。 如果我调试软件(使用Netbeans),在变量面板中,我将以正确的方式看到该字符串:

但是当我要用System.out.println打印变量时,我会看到奇怪的事情:

正如您所看到的,每个“a”都变成了“a”,以此类推,这将导致错误的字符计数,即使是在字符串的匹配器中

我怎样才能解决这个问题?我需要的重音字符,有正确的字符计数,并使用它的匹配。 我尝试了很多方法,但都不管用,我肯定错过了一些东西

提前谢谢

编辑

再次编辑

代码如下:

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);
    }
}
公共类文本行{
公共列表textPositions=null;
公共字符串text=“”;
}
公共类myStripper扩展了PDFTextStripper{
公共ArrayList行=null;
布尔startOfLine=true;
public myStripper()引发IOException
{
}
私有无效换行符(){
startOfLine=true;
}
@凌驾
受保护的无效起始页(PDPage页)引发IOException
{
换行符();
超级起始页(第页);
}
@凌驾
受保护的void writeLineSeparator()引发IOException
{
换行符();
super.writelineparator();
}
@凌驾
公共字符串getText(PDDocument文档)引发IOException
{
行=新的ArrayList();
返回super.getText(doc);
}
@凌驾
受保护的void writeWordSeparator()引发IOException
{
文本行tmpline=null;
tmpline=lines.get(lines.size()-1);
tmpline.text+=getWordSeparator();
tmpline.textPositions.add(空);
super.writeWordSeparator();
}
@凌驾
受保护的void writeString(字符串文本、列表文本位置)引发IOException
{
文本行tmpline=null;
if(startOfLine){
tmpline=新文本行();
tmpline.text=文本;
tmpline.textPositions=textPositions;
行。添加(tmpline);
}否则{
tmpline=lines.get(lines.size()-1);
tmpline.text+=文本;
tmpline.textPositions.addAll(textPositions);
}
if(startOfLine){
startOfLine=false;
}
super.writeString(文本、文本位置);
}
}

它是关于某些Unicode字符的表示

什么是角色?这个问题很难回答。
是一个字符还是两个字符(
a
`
在一起)?这取决于你认为是什么样的人物。

你看到的重音坟墓(
`
)实际上是。组合变音符号是独立的Unicode字符,但通过许多文本处理器与前一个字符组合。例如,
java.text.Normalizer.normalize(str,Normalizer.Form.NFC)
为您完成了这样的工作

您正在使用的库(ApachePDFBox)可能会规范化文本,因此将变音符号与前面的字符组合在一起。因此,在您的文本中,一些
TextPosition
实例包含两个代码点(更准确地说,
e`
a`
)。因此,包含
TextPosition
实例的列表长度为65

但是,您的
字符串
,实际上是一个
字符序列
,可以容纳67个字符,因为变音符号本身占用1个
字符

System.out.println()
只打印字符串的每个字符,它表示为“dere che Geova e`il Creatore e Colui che da`la vita.Probabilmen”——


那么,为什么Netbeans调试器显示
“dere che Geovaèil Creatore e Colui che dála vita.Probabilmen-”
作为字符串的值


这仅仅是因为Netbeans调试器为您显示规范化文本。

这不只是控制台中的显示问题吗?字符串仍应包含正确的字符。可能重复“否”,因为即使我使用string.length,计数也是错误的(正在计算额外的重音),System.out将使用操作系统编码。顺便说一下,
a
可以是一个字符或两个字符:
a
+零宽度组合变音符号(重音)。输出到UTF-8编码的文件。@SamueleDiella默认编码是什么?如何设置字符串属性?你能给我们看一些代码吗?java.**text**.Normalizer可以用于合成和分解重音字母,可以是单个组合字母,也可以是基本拉丁字母加零宽度重音。可能字符串是以分解形式出现的,System.out将零宽度重音替换为实重音或类似重音。因此,这可能就是解决方案。非常好,非常感谢,这就是解决方案!!你救了我的命;-)感谢所有帮助过我的人,非常感谢!