Java删除变音符号

Java删除变音符号,java,diacritics,Java,Diacritics,我正在尝试制作一个函数,它将删除变音符号(不想故意使用Normalizer) private static String normalizeCharacter(Character curr) { String sdiac = "áäčďéěíĺľňóôőöŕšťúůűüýřžÁÄČĎÉĚÍĹĽŇÓÔŐÖŔŠŤÚŮŰÜÝŘŽ"; String bdiac = "aacdeeillnoooorstuuuuyrzAACDEEILLNOOOORSTUUUUYRZ"; char[]

我正在尝试制作一个函数,它将删除变音符号(不想故意使用Normalizer)

private static String normalizeCharacter(Character curr) {
    String sdiac = "áäčďéěíĺľňóôőöŕšťúůűüýřžÁÄČĎÉĚÍĹĽŇÓÔŐÖŔŠŤÚŮŰÜÝŘŽ";
    String bdiac = "aacdeeillnoooorstuuuuyrzAACDEEILLNOOOORSTUUUUYRZ";
    char[] s = sdiac.toCharArray();
    char[] b = bdiac.toCharArray();
    String ret;
    for(int i = 0; i < sdiac.length(); i++){
        if(curr == s[i])
            curr = b[i];
    }
    ret = curr.toString().toLowerCase();
    ret = ret.replace("\n", "").replace("\r","");
    return ret;
}

文件
text.txt
包含以下内容:
ťťýýýýýýýýýýýýýýýýýýýýýýý25。我知道问题出在编码方面,但不知道在哪里。有什么想法吗?

您正在尝试将字节转换为字符

但是,字符
ľ
不表示为单个字节。它的unicode表示法是U+013E,UTF-8表示法是C4BE。因此,它由两个字节表示。其他角色也是如此

假设文件的编码是UTF-8。然后读取字节值
C4
,然后将其转换为
char
。这将为您提供字符U+00C4(Ä),而不是U+013E。然后读取
BE
,并将其转换为字符U+00BE(¾)

所以不要混淆字节和字符。不要直接使用
InputStream
,而应使用
读取器将其包装起来。
读取器
能够根据其创建的编码读取字符:

BufferedReader reader = new BufferedReader(
                            new InputStreamReader(
                                new FileInputStream(f), StandardCharsets.UTF_8
                            )
                        );
现在,您将能够读取字符甚至整行,编码将直接完成

int readVal;
while ( ( readVal = reader.read() ) != -1 ) {
    curr = (char)readVal;
    // ... the rest of your code
}

请记住,如果要使用不带参数的
read()
,您仍然在读取
int

关于代码质量的提示:像sdiac、bdiac等名称。。。太可怕了。给事物起名字,说明它们是什么。只需更改名称,您就可以使代码更具可读性!例如,为什么不把s和b变成常数呢?(因此,在调用此方法时,无需创建数组并将其丢弃)[我假设此方法可能会被调用…嗯,通常情况下?!]变量名是我语言的一部分,这只是测试阶段,所以代码的速度现在并不重要(至少对我而言)。这里只有10行代码,我相信每个人都能理解。无论如何,你的帖子并不能解决我的问题。但是你写这段代码是为了让其他人阅读。所以你认为它是容易读还是难读没有什么区别?比如“其他人可以为我工作,所以嘿,我为什么要让他们的生活更轻松”。如果这种心态是转变的最佳开端,也许你最好再想想。这甚至符合你自己的利益:你希望人们关注你的问题;不需要理解源代码。代码越容易阅读,就有越多的人会充分阅读它以帮助您。阅读越难,就有越多的人会走开而不去打扰。是的,完全忘记了阅读会让人感觉不舒服。。。谢谢你指出:)
int readVal;
while ( ( readVal = reader.read() ) != -1 ) {
    curr = (char)readVal;
    // ... the rest of your code
}