Java中输出和preg到Unicode字符串
我在对象中有普通字符串属性,包含重音字符。 如果我调试软件(使用Netbeans),在变量面板中,我将以正确的方式看到该字符串: 但是当我要用System.out.println打印变量时,我会看到奇怪的事情: 正如您所看到的,每个“a”都变成了“a”,以此类推,这将导致错误的字符计数,即使是在字符串的匹配器中 我怎样才能解决这个问题?我需要的重音字符,有正确的字符计数,并使用它的匹配。 我尝试了很多方法,但都不管用,我肯定错过了一些东西 提前谢谢 编辑 再次编辑 代码如下:Java中输出和preg到Unicode字符串,java,string,unicode,Java,String,Unicode,我在对象中有普通字符串属性,包含重音字符。 如果我调试软件(使用Netbeans),在变量面板中,我将以正确的方式看到该字符串: 但是当我要用System.out.println打印变量时,我会看到奇怪的事情: 正如您所看到的,每个“a”都变成了“a”,以此类推,这将导致错误的字符计数,即使是在字符串的匹配器中 我怎样才能解决这个问题?我需要的重音字符,有正确的字符计数,并使用它的匹配。 我尝试了很多方法,但都不管用,我肯定错过了一些东西 提前谢谢 编辑 再次编辑 代码如下: public
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将零宽度重音替换为实重音或类似重音。因此,这可能就是解决方案。非常好,非常感谢,这就是解决方案!!你救了我的命;-)感谢所有帮助过我的人,非常感谢!