(JAVA)在字符串中查找UTF-8编码格式的子字符串

时间:2014-01-22 16:49:46

标签: java utf-8 substring

假设我们有一个主字符串包含一些UTF-8文本,另一个字符串是一个单词,这也是UTF-8格式。所以请帮我用Java做这个。谢谢。

import java.awt.Component;
import java.io.File;
import javax.swing.JFileChooser;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.io.Writer;



public class Example {
     private static Component frame;
     public static void main(String args[]) throws FileNotFoundException, IOException{
         JFileChooser fc = new JFileChooser();
         int returnVal = fc.showOpenDialog(frame); //Where frame is the parent component

         File file = null;
         if (returnVal == JFileChooser.APPROVE_OPTION) {
         file = fc.getSelectedFile();
         //Now you have your file to do whatever you want to do
         String str = file.getName();
         str = "c:\\" + str; 
         BufferedReader in = new BufferedReader(new InputStreamReader(new                         FileInputStream(str),"UTF8"));
         String line;
         String wordfname = "c:\\word.txt";
         BufferedReader innew = new BufferedReader(new InputStreamReader(new FileInputStream(wordfname),"UTF8"));
         String word;
         word = innew.readLine();
         System.out.println(word);
         File fileDir = new File("c:\\test.txt");
         Writer out = new BufferedWriter(new OutputStreamWriter(new               FileOutputStream(fileDir), "UTF8"));
         while((line = in.readLine()) != null)
         {
          System.out.println(line);
          out.append(line).append("\r\n");
          boolean r = line.contains(word);
          System.out.println(r);
          }
         out.flush();
         out.close();
         System.out.println(str);

} 
 else {
//User did not choose a valid file
 }
    }

}

这两个文件的链接是:https://www.dropbox.com/s/4ej0hii6gnlwtga/kannada.txthttps://www.dropbox.com/s/emncfr7bsi8mvwn/word.txt

3 个答案:

答案 0 :(得分:1)

事实上,除了一些UTF-8细节之外,你做的一切都很好。 Java Reader / Writer / String处理Unicode。

(请关闭读者,并在不需要关闭之前冲洗。)

有一点是:零宽度组合变音符号。小c-circumflex ĉ是Unicode表中的一个字符,代码点U + 0109,java“\ u0109”,但也可以是两个Unicode代码点:c,加上零宽度^,“e \ u0302”。

java中存在text normalization转换为特定形式。

String cCircumflex = "\u0109"; // c^
String cWithCircumflex = "c\u0302"; // c^

String cx = Normalizer.normalize(cCircumflex, Normalizer.Form.NFKC);
String cx2 = Normalizer.normalize(cWithCircumflex, Normalizer.Form.NFKC);
assert cx.equals(cx2);

选择哪种规范化或多或少不相关,组合(...C)看似最自然(并提供更好的字体渲染),但分解...D允许自然分类为“aäá... CC ... EE ...“。

你甚至可以搜索单词,删除了变音符号(咖啡馆与咖啡馆):

word = Normalizer.normalize(word, Normalizer.Form.NFKD); // Decompose.
word = word.replaceAll("\\p{M}", ""); // Remove diacriticals.
word = word.replaceAll("\\p{C}", ""); // Optional: invisible control characters.

运行原始代码后

它似乎与我合作,没有任何改变(Java 8)。虽然我不得不把kannada.txt放在C:\上。

ಅದರಲ್ಲಿ
್ರಪಂಚದಲ್ಲಿ ಅನೇಕ ಮಾಧ್ಯಮಗಳು ಇದೆ. ಆಕಾಶವಾಣಿ, ದೂರದರ್ಶನ, ವಾರ್ತಾ ಪತ್ರಿಕೆ ಮುಂತಾದವು ಅದರಲ್ಲಿ ದೂರದರ್ಶನಪ ಪ್ರಮುಖವಾದ ಕಾರ್ಯವನ್ನು ಹೊಂದಿದ್ದು  ಅದನ್ನು ಚಿಕ್ಕವರಿಂದ ಹಿಡಿದು ದೊಡ್ಡವರವರೆಗೂ ನೋಡುತ್ತಾರೆ. ಇದಕ್ಕೆ ಇಂಗ್ಲೀಷ್‌ನಲ್ಲಿ ಟೆಲಿವಿಷನ್ ಎಂದು ಚಿಕ್ಕದಾಗಿ ಟಿ.ವಿ. ಎಂದು ಕರೆಯುವ ಬದಲು ಟಿ.ಕೆ. ಎಂದು  ಕರೆಯಬೇಕಾಗಿತ್ತು. ಏಕೆಂದರೆ ಇದು ಟೆಲಿವಿಷನ್ ಅಷ್ಟೇ ಅಲ್ಲ ಟೈಮ್ ಕಿಲ್ಲರ್ ಕೂಡ. ಇದನ್ನು ಪ್ರಮುಖವಾಗಿ ವಯಸ್ಸಾದವರು ನೋಡುತ್ತಾರೆ. ಆದರೆ ಕೆಲಸಕ್ಕೆ ಬಂದ  ಕೆಲಸದವರು ತಾವು ಕೆಲಸ ಮಾಡುವ ಬದಲು ಮನೆಯಲ್ಲಿ ಕುಳಿತು ನೋಡುತ್ತಾರೆ. 
true

false
ನನ್ನ ಪ್ರಕಾರ ಹೇಳಬೇಕಾದರೆ ಡಾಕ್ಷರ್‌ಗಳಿಗೆ ದುಡ್ಡು ಕೊಡುವ ಮಹಾಲಕ್ಷ್ಮಿ ಈ ಟಿ.ವಿ. 
false
c:\kannada.txt

答案 1 :(得分:0)

String对象实际上具有固定的UTF-16编码。

byte []技术上没有编码。但是您可以将编码附加到byte [] tough。因此,如果您需要UTF-8编码数据,则需要一个byte []。

所以我的方法是

byte[] text = String.getBytes("UTF-8");

获取UTF-8字节[] ..

恕我直言,但是在UTF-8编码的字符串(完全是UTF-16!)中查找子字符串是毫无意义的:)

答案 2 :(得分:0)

谢谢大家的帮助。现在我能够找到substring。当我将文本放在word.txt文件的下一行并在第二个readLine()语句中读取该单词时,它工作。