Java 删除变音符号

标签 java diacritics

我正在尝试创建将删除变音符号的函数(不想故意使用标准化器)。函数看起来像

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;
}

函数的调用方式如下(文件中的每个字符都发送到此函数)

private static String readFile(String fName) {

    File f = new File(fName);
    StringBuilder sb = new StringBuilder();

    try{

        FileInputStream fStream = new FileInputStream(f);
        Character curr;
        while(fStream.available() > 0){
            curr = (char) fStream.read();
            sb.append(normalizeCharacter(curr));
            System.out.print(normalizeCharacter(curr));
        }
    }catch(IOException e){
        e.printStackTrace();
    }
    return sb.toString();
}

文件text.txt包含以下内容:ľščťžýáíéúäôň并且我期望lcstzyaieuaon从程序返回,但插入了预期的字符串我得到这个 ¤ yaieuaoò 。我知道问题出在编码中的某个地方,但不知道在哪里。有什么想法吗?

最佳答案

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

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

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

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

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

关于Java 删除变音符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33197575/

相关文章:

java - 使用泛型有什么好处?

java - 如何读取仅由空格分隔的一行?

java.sql.SQLException :null During connecting to MYSQL

java - 有没有办法摆脱重音符号并将整个字符串转换为常规字母?

xml - XSL : for-each select a string with umlauts

java - 从拉丁字符中删除重音符号(变音符号)以进行比较

java - 如何将其他位置的文件复制到 Docker 镜像中

string - 用等价物替换特殊字符

android - 如何忽略 SQLite 查询中的重音(Android)

java - 如何知道电话是否响铃