【问题标题】:tamil character segmentation using java使用java进行泰米尔语字符分割
【发布时间】:2017-01-24 07:36:37
【问题描述】:

在下面的编码中,我尝试读取具有特定长度的行并写在另一个记事本上。这种编码适用于英文字符。但是对于泰米尔语字母,如果我尝试数数...它算作:

(例如)தமிழ்

它计为 5..(即)“த”、“ம”、“ி”、“ழ”和“்”。 但我想把它算作3(即)“த”,“மி”和“ழ்”

我想将此逻辑应用于文本文件中的多个单词......

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;

public class ii {

public static void main(String[] args) {
FileReader fr = null;
BufferedReader br =null;
FileWriter fw=null;
BufferedWriter bw=null;

String [] stringArray;
int counLine = 0;
int arrayLength ;
String s="";
String stringLine="";

try{
    fr = new FileReader("F:\\New folder (2)\\N.txt");
    fw=new FileWriter("F:\\New folder (2)\\o.txt");
    br = new BufferedReader(fr);
    bw=new BufferedWriter(fw);
  while((s = br.readLine()) != null){
        stringLine = stringLine + s;
        stringLine = stringLine + " ";
        counLine ++;
    }
    stringArray = stringLine.split(" ");
    arrayLength = stringArray.length;
for (int i = 0; i < arrayLength; i++) {
        int c = 1 ;
        for (int j = i+1; j < arrayLength; j++) {
            if(stringArray[i].equalsIgnoreCase(stringArray[j])){
               c++;
               for (int j2 = j; j2 < arrayLength; j2++)
                  {
                   }}
         int k;
          for(k=2;k==stringArray[i].length();i++)
          {
          bw.write(stringArray[i]);
           bw.newLine();

          }}} fr.close();
        br.close();
        bw.flush();
        bw.close();
        }catch (Exception e) {
        e.printStackTrace();
        }}}

【问题讨论】:

标签: java


【解决方案1】:

这是因为字符串计算了 unicode 标记和 unicode 字母。要忽略 unicode 标记,您可以使用如下正则表达式

import java.util.regex.*;
 ......
String word = "தமிழ்";
String regex = "[^\u0bbe-\u0bcd.]";
  Pattern r = Pattern.compile(regex);
  Matcher m = r.matcher(word);
    int count=0;
while (m.find())count++;
System.out.print(count);

【讨论】:

  • hii...感谢您的回复...单个单词是 gd..但是如何在这里使用包含多个 unicode 单词的文件..我们想在哪里获得三个字符的单词?
  • 关于文件中所有泰米尔语字母的代码是独立的。使用相同并计算字符串中的所有泰米尔语字母
【解决方案2】:

一种方法是使用 BreakIterator 遍历字符,然后自己计算它们。 (未经测试的代码)

int characterCount = 0;
BreakIterator iterator = BreakIterator.getCharacterInstance();
iterator.setText("தமிழ்");
int boundary = iterator.first();

while (boundary != BreakIterator.DONE) {
    characterCount++;
    boundary = iterator.next();
}

另见http://docs.oracle.com/javase/tutorial/i18n/text/char.html

【讨论】:

  • 但是我想从一个文件中计算多个字符,而不是一个特定的字符
  • 这就是 break 迭代器的作用
  • 这为 3 个字符的泰米尔语字符串“குமார்”(来自 this question)提供了 36 个计数。当我尝试getCharacterInstance(new Locale("ta", "IN"))mentioned here)时,它给出了相同的结果
【解决方案3】:

记事本默认不支持 UTF 字符。相反,它支持 ANSI。但是,您的问题不是因为这个。

您的程序应该知道它在读取或写入时将使用什么编码。没有魔法。您需要设置编码(例如 - UTF8)。 FileReader 的结构采用默认的平台编码,这显然不适合你。

我猜你需要 -

Reader reader = new InputStreamReader(new FileInputStream("c:/foo.txt"), "UTF-8");

Read file and write file which has characters in UTF - 8 (different language)

【讨论】:

  • 无论我们做什么,字符数都是 5,如何获得真正的字符数,即 3
【解决方案4】:

这基本上是由于编码问题而发生的,首先按照以下步骤更改您的java项目的文本文件编码

右键单击您的项目名称=>选择属性=>选择资源=>文本文件编码=>选择其他并选择UTF-8作为编码,

这将解决您的问题。

【讨论】:

    猜你喜欢
    • 2016-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-31
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    相关资源
    最近更新 更多