在Java中阅读法语字符

时间:2014-11-22 20:43:47

标签: java string character ascii

我必须做一个类似于Web Indexing的任务。基本上我有几个文件(ASCII格式),我必须计算单词频率。

其中一个文件包含法语字符(例如ç或è)。在我的输出文件中,一些包含法语字符的单词没有正确显示,因此我有重复: 我有鬼脸和鬼脸,例如我有guère和gu re。

现在,关于使用的算法,有一个问题。我必须以并行方式进行计算,这涉及将文本文件拆分成片段(不将文件拆分成多个文件,而是从文件的某个偏移量中读取)。对于每个片段,我必须检查第一个单词是否已在两个片段之间分开:如果是,我可以忽略它,我还要检查最后一个单词是否已被拆分:如果是,我必须阅读更多字符直到我到达分隔符并将其保存在缓冲区中。我认为奇怪的 可能与这部分有关。

这是我阅读片段的方式:

byte[] buffer = new byte[D]; // D is 1024
file.seek(offset);
file.readFully(buffer);

这是我阅读外围词的方式。

第一个字:

file.seek(offset - 1);
byte[] buf = new byte[1];
buf[0] = file.readByte();
String first_w = new String(buf);

最后一句话:

String last_word = "";
byte[] buf = new byte[1];
do
{
    buf[0] = file.readByte();
    String aux = new String(buf);
    if(isDelim(aux.charAt(0))
    {
        break;
    }
    else
    {
        last_word += aux;
    }
}while(true);

出现在一些最后几个单词中的某些单词中,也许最重要的是,如果 出现在片段的主要部分(我用readFully读取的那个), 将显示为字符串中的第一个字母或最后一个字母。

我该如何解决这个问题?

编辑:该文件是RandomAccessFile对象。

2 个答案:

答案 0 :(得分:1)

当您使用RandomAccessFile阅读文件时,我担心没有太多内置支持来正确处理文件编码。

如果您的文件采用 ISO-8859-15 编码,则非常简单。在这种情况下,您可以使用new String(byte[], "ISO-8859-15")

如果您的文件是用 UTF-8 编码的,则必须处理Unicode代码点的字符&gt; 127用超过1个字节编码。但这很简单。 如果第一位是0(字节值> = 0),则它是单字节字符。 如果第一位是1(字节值<0),则它是多字节字符。如果第二位为1,则它是多字节字符的开头,如果第二位为0,则它​​是多字节字符的数据字节。您只需读取所有数据字节并将它们添加到数组中。

答案 1 :(得分:0)

不要使用new String(byte[] buf)构造函数。它没有考虑字节的编码(并使用平台默认值)。使用new String(byte[] buf, String encoding)并指定正确的编码。