的Java删除变音

问题描述:

我试图让功能,将删除变音符号(不想使用正规化的目的)。功能看起来像的Java删除变音

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

funcion被称为像这样(从文件中的每个charracter发送到该功能)

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从程序回报,但insted的预期字符串我得到这个¾è yaieuaoò。我知道这个问题在编码的某个地方,但不知道在哪里。有任何想法吗 ?

+0

提示代码质量:像sdiac,bdiac这样的名字是很可怕的。给出事情的名称,告诉他们是什么。只需更改名称即可使代码更具可读性!例如,为什么不把s和b变成常量? (所以不需要创建数组,并在任何时候抛出这些方法被调用)[我认为这种方法可能被称为...好吧,经常?!] – GhostCat

+0

变量名称是我的语言和这个东西只是测试阶段,所以现在代码的速度并不重要(至少对我而言)。只有10行代码我相信every1会理解它。无论如何,你的帖子并没有解决我的问题。但是thx – TomP

+3

您在此处编写此代码以供其他人阅读**。所以你认为如果它很容易阅读或难以阅读,这并没有什么不同。就像“其他人可以为我工作,嘿,为什么我应该让自己的生活更轻松”。 也许你最好再思考一下,如果这样的思维模式是转换的最佳起点。这甚至是出于您自己的利益:您希望人们关注您的**问题**;不了解源代码。代码越容易阅读,越多的人会完全阅读它来帮助你。阅读越难,越多的人会转身离开,而不是打扰。 – GhostCat

您试图将字节转换为字符。

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

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

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

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 
} 

记住,你还在读书的int如果你打算使用read()不带参数。

+0

是的,完全忘了读取返回int ...感谢指出:) –