Android Tess-Two OCR无法映射字符“fi”。

12
我的Android应用程序使用tess-two库实现OCR功能。我在读取包含“fi”的字符串时遇到了问题。在调用OCR识别文本的方法baseApi.getUTF8Text()后,返回的字符串中"fi"变成了"fi"<<请非常关注该字符串。这不是一个由两个字符组成的字符串,而是一个由单个字符组成的字符串。你可以通过复制和粘贴来重现它。现在,我认为这可能是UTF8编码等问题,但我缺乏足够的知识。当我尝试执行string.replace("fi","fi")时,Android Studio显示错误信息unmappable character for encoding utf-8。我尝试在Google上搜索,但它将其识别为常规的“fi”,而不是“fi”。
有没有办法解决这个字符问题?
2个回答

6
您可以在调用baseApi.setImage之前将连字列入黑名单,以避免识别它:
baseApi.setVariable(TessBaseAPI.VAR_CHAR_BLACKLIST, "fi");

为了防止Android Studio在您的Java代码中抛出“无法映射字符”错误,请通过在Android Studio窗口右下角选择“UTF-8”来将文件编码转换为UTF-8。选择。保留HTML标签。

1
到目前为止这很好 :) 我知道黑名单如何工作,但我从未考虑将该字符放在那里,因为我认为构建时会出现问号。 - Sheychan

2

以下是我找到的内容,供参考:字符'fi'是一种连字符(更多信息请参见:Unicode Character 'LATIN SMALL LIGATURE FI' (U+FB01))。

以下是一个快速而简单的程序,可以用来查找和替换任何其他字符中的'fi':

public class LigatureFI
{

    static char ligature_fi = 0xFB01;

    public static void main(String[] args)
    {
        String sligature_fi = Character.toString(ligature_fi);
        String string = new String("fififififififififififififififi");
        System.out.println(string);
        string = string.replaceAll(sligature_fi, "FI");
        System.out.println(string);
    }

}

如果你的IDE提示'fi'不在cp1252字符集中,那么请保存为UTF8。

希望对你有所帮助。


1
你的方法不起作用,结果是一串问号字符串。 - Zarwan
我认为这是因为fi不是一个已知的字符。我猜测你的替换函数没有起作用,所以fi仍然存在,由于IntelliJ无法正确输出它,它会被替换成问号。 - Zarwan
方法在我的电脑上运行正常,结果是“FIFIFIFIFIFIFIFIFIFIFIFIFIFIFI”。 - user5292387
这很奇怪。我尝试使用 Java 中正确的 '\uFB01',但仍然不起作用。这很奇怪,因为如果我在 IntelliJ 中复制和粘贴它,粘贴会给出"fi"字符,而不是代码,所以我知道那一部分是正确的。当我尝试 fi == '\uFB01' 时,它也给了我 true,但当我尝试 string.charAt(0) == '\uFB01' 时,它给了我 false,尽管我复制了相同的字符“fi”来制作字符串。我不确定发生了什么。 - Zarwan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接