2016-09-30 111 views
-2

我有一个文件(prueba.txt),我想用0x14代替ascii字符0xE1(á),0xE9(é)代表0x16,0xF3(ó)代表0x16 ...在字符串中是可能与String.replace()但它是一个字符。Java替换ascii字符

import java.io.File; 
import java.util.Scanner; 

public class Reemplazar { 

    public static void main(String[] args) throws Exception { 

     Scanner archivo = new Scanner(new File("prueba.txt")); 

      while(archivo.hasNextLine()) { 
       String frase = archivo.nextLine(); 

       for (int i = 0; i < frase.length(); i++) { 
        char current = frase.charAt(i); 

        if (current == 0xe1) { 
         System.out.println("contiene la á: '"+frase+"'"); 
        } 

        if (current == 0xe9) { 
         System.out.println("contiene es la é: '"+frase+"'"); 
        } 

       } 
      } 
    } 
} 

我想这个代码大为改善,但...

问候。

+0

什么是字符集和文本文件的编码?你的ASCII的提及混淆,以及您的UTF-16代码单元的格式。为什么不把它们写成'\ u00e1'或'á'?所有的Java String和char都是UTF-16。 –

+0

是真的有点混乱,对不起,编码是ANSI,文本中包含一些特殊字符,比如á ,é,ñ...我想改变这些特殊字符的其他字符►,☼,◄ 问候 –

回答

1

首先阅读文本文件,然后替换字符。

阅读

一个文本文件,有一些特殊的字符集和编码。你必须确切地知道它是什么或那绝对是系统默认的ANSI字符集和编码。 ANSI不是一种特定的编码。

但是,既然您说过ANSI,那么您可能就是系统默认值。您使用的构造函数是Scanner是Java的默认值。您可以合理地假设Java的默认值正确匹配系统默认值。

更换字符

在Java的StringcharCharacter数据类型和在所分析的Java源文件中的所有“字符”是UTF-16代码单元,一个或其中两个编码一个Unicode码点。未转义的文字字符串和字符将在源文件的编码中。 (当然,应该是是UTF-8。)无论如何,如果你输入它,看到它,保存并用相同的编码进行编译,那么这些字符就是你认为的那些字符。

所以,一旦你在一个字符串中有文本,可以更换,更换,更换,就像这样:

frase 
    .replace('á', '►') 
    .replace('é', '☼') 
    .replace('ñ', '◄') 

frase 
    .replace('\u00E1', '\u25B6') 
    … 

BTW-0x14的,为0x15,Ox16置的编码对于OEM437字符集的编码中的►,☼,◄。

如果您想要遍历字符串的元素,那么可以使用每个UTF-16代码单元来执行此操作,例如使用charAt。如果你的所有文本都是UTF-16只用一个代码单元编码的字符,那么效果最好。鉴于您的文件编码是欧洲语言的ANSI字符集之一,情况可能如此。或者,您可以使用代码点感知技术进行迭代,如CharSequence上的Java文档中所示。

+0

谢谢您的解释,但frase.Replace()不会更改这些值,这是代码。 \t while(archivo.hasNextLine()){ \t String frase = archivo.nextLine(); \t char [] letras = frase.toCharArray(); \t对(INT I = 0;我

+0

字符串是不可变的。替换返回一个新的字符串。我的例子是表达式,因此可以按照你的意愿分配结果。 –

+0

了解,它有它的逻辑。现在,它的工作,谢谢。 问候。 –

0

它更好的是,它是char,因为你可以做这样的事情:

yourStringToReplace.replace(0xe1);

char是threated像数的字符insteed的integer(简单地说)

+0

感谢您的回复,但什么也没做,我正在使用 liena.replace((char)0xE1,(char)0x14); 它不起作用。 问候。 –

0

这将替换字符并创建一个新文件“nueva_prueba。TXT”与更改的文本

public class Reemplazar { 

    public static void main(String[] args) throws IOException 
    { 
     BufferedWriter out; 

     File f = new File("nueva_prueba.txt"); 
     f.createNewFile(); 

     out = new BufferedWriter(new FileWriter(f)); 


     Scanner archivo = new Scanner(new File("prueba.txt")); 

     while(archivo.hasNextLine()) { 
      String frase = archivo.nextLine(); 

      for (int i = 0; i < frase.length(); i++) { 
       char current = frase.charAt(i); 

       switch(current) 
       { 

        case 0xe1: 
         System.out.println("contiene la á: '"+frase+"'"); 
         frase = frase.replace((char) 0xe1, (char) 0x14); 
         System.out.println("nova frase: "+frase); 
         break; 

        case 0xe9: 
         System.out.println("contiene la é: '"+frase+"'"); 
         frase = frase.replace((char) 0xe9, (char) 0x15); 
         System.out.println("nova frase: "+frase); 
         break; 

        case 0xf3: 
         System.out.println("contiene la ó: '"+frase+"'"); 
         frase = frase.replace((char) 0xf3, (char) 0x16); 
         System.out.println("nova frase: "+frase); 
         break; 

         //... outros/others 

        default: 
         break; 
       } 


      } 

      try{ 

       out.write(frase); 
       out.newLine(); 

      }catch(IOException e){ 
       e.printStackTrace(); 
      } 
     } 
     archivo.close(); 
     out.close(); 

    } 
} 

希望这有助于!

+1

嗨, 您的代码正常工作,谢谢 问候。 –

+0

@RaúlPuro您能否将答案标为“已接受”? =) – HenriqueMS

+1

它的解决方案和Tom Blodget的解决方案都很好,但我在Tom Blodget之前阅读过,我非常感谢你的回复,但我不能做出两个,对不起。 问候。 –