Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Java阅读法语字符_Java_String_Character_Ascii - Fatal编程技术网

用Java阅读法语字符

用Java阅读法语字符,java,string,character,ascii,Java,String,Character,Ascii,我必须做一个类似于网页索引的作业。基本上我有几个文件(ASCII格式),我必须计算单词频率 其中一个文件包含法语字符(如çorè)。在我的输出文件中,一些包含法语字符的单词没有正确显示,因此我有重复的单词: 我有grimaçaient和grima��艾恩特,我有古埃和古埃��例如,re 现在,关于使用的算法,有一个问题。我必须以并行方式进行计算,包括将文本文件拆分为片段(不是将文件拆分为多个文件,而是从文件的某个偏移量读取)。对于每个片段,我必须检查第一个单词是否已在两个片段之间拆分:如果是,我

我必须做一个类似于网页索引的作业。基本上我有几个文件(ASCII格式),我必须计算单词频率

其中一个文件包含法语字符(如çorè)。在我的输出文件中,一些包含法语字符的单词没有正确显示,因此我有重复的单词: 我有grimaçaient和grima��艾恩特,我有古埃和古埃��例如,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);
� 出现在开头的一些词中,最后的一些词中,也许最重要的是如果� 出现在片段的主要部分(我阅读时已准备就绪的部分)中� 将显示为字符串中的第一个字母或最后一个字母

我怎样才能解决这个问题


编辑:文件是RandomAccessFile对象。

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

当您使用
RandomAccessFile
读取文件时,恐怕没有多少内置支持来正确处理文件编码

如果您的文件是以ISO-8859-15编码的,那么它非常简单。在这种情况下,您可以使用新字符串(字节[],“ISO-8859-15”)

如果您的文件是用UTF-8编码的,那么您必须处理这样一个事实,即Unicode代码点>127的字符的编码超过1个字节。但这很简单。 如果第一位为0(字节值>=0),则为单字节字符。
如果第一位是1(字节值文件编码是什么,UTF-8还是ISO-8859-15?会有一些显著的区别。如果文件包含ç或é,那么它不是ASCII,因为ASCII不支持这些字符。使用读取器和适当的字符集将字符作为字符读取,而不是尝试将其作为字节读取。
新字符串(buf)
未使用适当的字符集。它使用默认字符集。请阅读javadoc。编码为ISO-8859文本。