2016-09-30 106 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之前閱讀過,我非常感謝你的回覆,但我不能做出兩個,對不起。 問候。 –